var regularField = { 'id': 'field1', 'name': 'testField', 'itsmFieldId': 1, 'type': 'characterField', 'dataType': 'text', 'displayOrder': 0, 'label': 'Test Field', 'groupMember': false, 'widgetMember': false, 'ootb': true, 'itsmRequired': true, 'arFieldName': 'Test Field', 'hide': false, 'required': false, 'editable': true, 'hideLabel': true, 'maxLength': 15, availability: 0 }; var widgetField = { 'id': 'widget1', 'name': 'myWidget', 'type': 'priority', 'dataType': 'widget', 'displayOrder': 1, 'groupMember': false, 'widgetMember': false, 'ootb': true, 'itsmRequired': false, 'hide': false, 'required': true, 'editable': true, 'hideLabel': true, availability: 0, 'members': [ { 'id': 'member1', 'name': 'member1', 'itsmFieldId': 1000111001, 'parentId': 'widget1', 'type': 'staticSelectionField', 'dataType': 'dropdown', 'displayOrder': 2, 'label': 'Member Field', 'groupMember': false, 'widgetMember': true, 'ootb': true, 'itsmRequired': true, 'arFieldName': 'Member Field', 'hide': false, 'required': false, 'editable': true, 'hideLabel': false, availability: 0, 'options': [ { 'index': 0, 'name': 'Option_1', 'label': 'Option 1' }, { 'index': 1, 'name': 'Option_2', 'label': 'Option 2' } ], 'accessible': true } ], 'accessible': true }; var availableFieldsList = [ { "id": "field2", "name": "company", "itsmFieldId": 1000003299, "type": "dynamicSelectionField", "dataType": "menu", "displayOrder": 1, "label": "Field 2", "groupMember": false, "widgetMember": false, "ootb": true, "itsmRequired": true, "arFieldName": "Field 2", "hide": false, "required": false, "editable": true, "hideLabel": false, "menu": "menu-name", "accessible": true, availability: 0 }, { "id": "widget2", "name": "customerEmail", "type": "emailField", "dataType": "widget", "displayOrder": 1, "groupMember": false, "widgetMember": false, "ootb": true, "itsmRequired": false, "hide": false, "required": false, "editable": false, "hideLabel": false, availability: 0, "members": [ { "id": "member2", "name": "customerInternetEmail", "itsmFieldId": 1000000048, "parentId": "widget2", "displayOrder": 0, "groupMember": false, "widgetMember": true, "ootb": true, "itsmRequired": false, "hide": false, "required": false, "editable": true, "hideLabel": false, "accessible": true } ], "accessible": true }, widgetField.members[0] ]; var panel = { id: 'panel1', name: 'testPanel', type: 'simplePanel', fields: [regularField, widgetField] }, panel2 = { id: 'panel1', name: 'testPanel', type: 'simplePanel', fields: [] }; var screen = { id: 'screen1', name: 'customScreen', datasource: 'workorder', panels: [panel, panel2] }; var appConfig = { id: "test-app", tenantId: "000000000000001", name: "Galileo", version: "1.0", screens: [screen] }; describe('CustomAreaEditorController', function () { var $controller, $rootScope, $scope, $httpBackend, $q, events, screenConfigurationModel, layoutConfigurationModel, configurationModel, metadataModel, parentScreen; function initController() { $controller('CustomAreaEditorController', { $scope: $scope, $modalInstance: {}, customArea: parentScreen.panels[0], allPanels: parentScreen.panels }); $httpBackend.flush(); $scope.$digest(); } beforeEach(module('myitsmApp', 'adminModule')); beforeEach(inject(function (_$q_, _$controller_, _$rootScope_, _$httpBackend_, _configurationModel_, _screenConfigurationModel_, _layoutConfigurationModel_, _events_, _metadataModel_) { $controller = _$controller_; $rootScope = _$rootScope_; $httpBackend = _$httpBackend_; screenConfigurationModel = _screenConfigurationModel_; layoutConfigurationModel = _layoutConfigurationModel_; configurationModel = _configurationModel_; $q = _$q_; events = _events_; metadataModel = _metadataModel_; $scope = $rootScope.$new(); var getLocale = function () { return readJSON('scripts/app/i18n/resources-locale_en.json'); }; spyOn(configurationModel, 'isServerApplicationEnabled').and.returnValue(true); $httpBackend.whenGET(/^scripts\/app\/i18n\/resources-locale_en.*$/).respond(200, getLocale()); $httpBackend.whenGET('/smartit/rest/serverstates').respond(200, 1); $httpBackend.whenGET('/smartit/rest/sessionstatus?getLicenseKey=true').respond(200, {}); $httpBackend.whenGET('views/dashboard/index.html').respond(200); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=global').respond(200, readJSON('mocks/metadata-global.json')); $httpBackend.whenGET('/smartit/rest/v2/customization/application/search?name=Galileo&phase=2&fromConfig=true') .respond(200, appConfig); $httpBackend.whenGET(/smartit\/rest\/v2\/customization\/available\/accelerators/) .respond(200, {items: {}}); $httpBackend.whenGET(/smartit\/rest\/v2\/customization\/field\/available\/search/) .respond(200, availableFieldsList); $httpBackend.whenGET(/smartit\/rest\/v3\/action\/search/) .respond(200, [ { "items": [ { "actionOrder": "alphabetical", "resourceType": "incident", "actionList": [] } ], "numMatch": 1, "dataSourceName": "Action" } ]); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=workorder') .respond(200, readJSON('mocks/workorder-metadata.json')); $httpBackend.whenGET(/smartit\/rest\/customization\/field\/search/) .respond(200, []); screenConfigurationModel.loadConfiguration(); $httpBackend.flush(); parentScreen = screenConfigurationModel.screenList[0]; spyOn(screenConfigurationModel, 'isV2CompatibleScreen').and.returnValue(true); spyOn(ScreenConfigurationVO.prototype, 'isV2Compatible').and.returnValue(true); })); it('should exist', function () { var CustomAreaEditorController = $controller('CustomAreaEditorController', { $scope: $scope, $modalInstance: {}, customArea: parentScreen.panels[0], allPanels: [] }); expect(CustomAreaEditorController).toBeDefined(); }); it('should initialize properly for v2 compatible screens', function () { spyOn(screenConfigurationModel, 'getAccelerators').and.callThrough(); spyOn(screenConfigurationModel, 'loadActionsNew').and.callThrough(); spyOn(screenConfigurationModel, 'loadFields').and.callThrough(); spyOn(metadataModel, 'getMetadataByType').and.callThrough(); spyOn(PanelVO.prototype, 'initFields').and.callThrough(); initController(); expect($scope.customArea).toEqual(jasmine.objectContaining(parentScreen.panels[0])); expect($scope.screenName).toEqual(parentScreen.name); expect($scope.allPanels).toEqual(jasmine.arrayContaining(parentScreen.panels)); expect($scope.customArea.addFieldAllowed).toEqual(true); expect($scope.availableFields.length).toEqual(3); expect(screenConfigurationModel.getAccelerators).toHaveBeenCalled(); expect(screenConfigurationModel.loadActionsNew).toHaveBeenCalled(); expect(screenConfigurationModel.loadFields).toHaveBeenCalled(); expect(metadataModel.getMetadataByType).toHaveBeenCalled(); expect(PanelVO.prototype.initFields).toHaveBeenCalled(); }); it('should add field to the panel', function () { initController(); var availableField = $scope.availableFields[0]; $scope.onAddFieldClick(availableField); expect(availableField.isNewField).toEqual(true); expect($scope.customArea.fields.length).toEqual(3); expect($scope.customArea.addedFields.length).toEqual(1); }); it('should toggle selected field expanded state', function () { initController(); var selectedField = $scope.customArea.fields[0], initialExpandedState = selectedField.expanded; $scope.onExpandFieldClick(selectedField); expect(selectedField.expanded).toEqual(!initialExpandedState); }); it('should remove field from the panel', function () { initController(); var selectedField = $scope.customArea.fields[0]; expect($scope.customArea.fields.length).toEqual(2); expect($scope.customArea.removedFields.length).toEqual(0); expect($scope.availableFields.length).toEqual(3); $scope.onRemoveFieldClick(selectedField); expect($scope.customArea.fields.length).toEqual(1); expect($scope.customArea.removedFields.length).toEqual(1); expect($scope.availableFields.length).toEqual(4); }); it('should create group field and add it to the panel', function () { initController(); expect($scope.customArea.fields.length).toEqual(2); spyOn(PanelVO.prototype, 'addField').and.callThrough(); $scope.onCreateGroup(); expect(PanelVO.prototype.addField).toHaveBeenCalledWith(jasmine.objectContaining({ type: 'groupField', dataType: 'group', editable: true, name: 'Customization Group', label: 'Customization Group' })); expect($scope.customArea.fields.length).toEqual(3); }); });