describe('Test priority directive', function () { var compile, scope, $httpBackend, priorityField, ticket, field, metadata, deferred, events, mapperData; beforeEach(module('myitsmApp', 'templates')); beforeEach(function () { inject(function ($q, $compile, $rootScope, $injector, ticketModel, metadataModel, objectValueMapperService, _events_) { $httpBackend = $injector.get('$httpBackend'); var getLocale = function () { return readJSON('scripts/app/i18n/resources-locale_en.json'); }; $httpBackend.whenGET(/^scripts\/app\/i18n\/resources-locale_en.*$/).respond(getLocale()); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=global').respond(200); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=incident').respond(200); $httpBackend.whenGET('/smartit/restapi/person/supportgroupperson').respond(200); $httpBackend.whenGET('/smartit/rest/serverstates').respond(200); $httpBackend.whenGET('/smartit/rest/sessionstatus?getLicenseKey=true').respond(200); $httpBackend.whenGET('/smartit/rest/incident/calculatepriority?companyName=Calbro+Services&impact=3-Moderate%2FLimited&urgency=2-High').respond(200); $httpBackend.whenGET('/smartit/rest/change/calculatepriority?companyName=&impact=4-Minor%2FLocalized&urgency=urgency').respond(200); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=workorder').respond(200); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=change').respond(200); $httpBackend.whenGET('/smartit/rest/v2/metadata?type=').respond(200); compile = $compile; scope = $rootScope.$new(); this.ticketModel = ticketModel; this.metadataModel = metadataModel; this.objectValueMapperService = objectValueMapperService; deferred = $q.defer(); events = _events_; metadata = { "priorities": [ { "index": 0, "name": "Critical", "label": "Critical" }, { "index": 1, "name": "High", "label": "High" }, { "index": 2, "name": "Medium", "label": "Medium" }, { "index": 3, "name": "Low", "label": "Low" } ], "urgencies": [ { "index": 1000, "name": "1-Critical", "label": "1-Critical" }, { "index": 2000, "name": "2-High", "label": "2-High" }, { "index": 3000, "name": "3-Medium", "label": "3-Medium" }, { "index": 4000, "name": "4-Low", "label": "4-Low" } ], "metadatatype": "change", "impacts": [ { "index": 1000, "name": "1-Extensive/Widespread", "label": "1-Extensive/Widespread" }, { "index": 2000, "name": "2-Significant/Large", "label": "2-Significant/Large" }, { "index": 3000, "name": "3-Moderate/Limited", "label": "3-Moderate/Limited" }, { "index": 4000, "name": "4-Minor/Localized", "label": "4-Minor/Localized" } ] }; field = { id: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', accessMappings: { fieldMappings: {priority: 'write'} }, name: 'priority', type: 'priority', hideLabel: false, value: { impact: {name: '4-Minor/Localized'}, priority: {name: 'Low'}, urgency: {name: '4-Low'} }, members: [ { "name": "urgency", "label": "Urgency", "options": [ { "index": 1000, "name": "1-Critical", "label": "1-Critical" }, { "index": 2000, "name": "2-High", "label": "2-High" }, { "index": 3000, "name": "3-Medium", "label": "3-Medium" }, { "index": 4000, "name": "4-Low", "label": "4-Low" } ] }, { "name": "impact", "label": "Impact", "options": [ { "index": 1000, "name": "1-Extensive/Widespread", "label": "1-Extensive/Widespread" }, { "index": 2000, "name": "2-Significant/Large", "label": "2-Significant/Large" }, { "index": 3000, "name": "3-Moderate/Limited", "label": "3-Moderate/Limited" }, { "index": 4000, "name": "4-Minor/Localized", "label": "4-Minor/Localized" } ] }, { "name": "priority", "label": "Priority", "options": [ { "index": 0, "name": "Critical", "label": "Critical" }, { "index": 1, "name": "High", "label": "High" }, { "index": 2, "name": "Medium", "label": "Medium" }, { "index": 3, "name": "Low", "label": "Low" } ] } ], accessible: true, setValueFlag: '#$#' }; ticket = { accessMappings: { fieldMappings: {priority: 'write'} }, type: 'change', resolvedDate: null, impact: '4-Minor/Localized', urgency: '4-Low', resolution: null, templateId: '', serviceType: 'User Service Restoration', brokerVendorName: '', id: 'IDGAA5V0GEXADAPGP1NOPFSOMG8GQ9', displayId: 'WO1332', summary: 'Allen Allbrook', desc: 'Allen Allbrook', numAttachments: 0, customFields: {}, noCategories: 0, ticketType: 'workorder', attachments: [], priority: 'Low', isDraft: true }; mapperData = [{members: [ { id: 'AGGAA5V0HG8SIAOTBCDCABEYOGN5C2', name: 'priority', itsmFieldId: 1000000164, parentId: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', displayOrder: 2, groupMember: false, widgetMember: true, ootb: true, hide: false, required: false, editable: true, hideLabel: false, accessible: true, isReadOnly: false }, { id: 'AGGAA5V0HG8SIAOTBCDPABEYOUN5C5', name: 'urgency', itsmFieldId: 1000000162, parentId: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', displayOrder: 1, groupMember: false, widgetMember: true, ootb: true, hide: false, required: false, editable: true, hideLabel: false, accessible: true, isReadOnly: false }, { id: 'AGGAA5V0HG8SIAOTBCGTABEYRYN5CP', name: 'impact', itsmFieldId: 1000000163, parentId: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', displayOrder: 0, groupMember: false, widgetMember: true, ootb: true, hide: false, required: false, editable: true, hideLabel: false, accessible: true, isReadOnly: false } ]}]; spyOn(this.ticketModel, 'getPriority').and.callFake(function () { deferred.resolve({}); return deferred.promise; }); spyOn(this.objectValueMapperService, 'getFieldsByType').and.callFake(function () { deferred.resolve(mapperData); return deferred.promise; }); priorityField = { id: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', name: 'priority', type: 'priority', dataType: 'widget', displayOrder: 1, groupMember: false, widgetMember: false, ootb: true, hide: false, required: false, editable: false, hideLabel: false, value: { impact: '4-Minor/Localized', priority: 'Low', urgency: '4-Low' }, members: [ { id: 'AGGAA5V0HG8SIAOTBCDCABEYOGN5C2', name: 'priority', itsmFieldId: 1000000164, parentId: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', displayOrder: 2, groupMember: false, widgetMember: true, ootb: true, hide: false, required: false, editable: true, hideLabel: false, accessible: true }, { id: 'AGGAA5V0HG8SIAOTBCDPABEYOUN5C5', name: 'urgency', itsmFieldId: 1000000162, parentId: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', displayOrder: 1, groupMember: false, widgetMember: true, ootb: true, hide: false, required: false, editable: true, hideLabel: false, accessible: true }, { id: 'AGGAA5V0HG8SIAOTBCGTABEYRYN5CP', name: 'impact', itsmFieldId: 1000000163, parentId: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', displayOrder: 0, groupMember: false, widgetMember: true, ootb: true, hide: false, required: false, editable: true, hideLabel: false, accessible: true } ], accessible: true }; }); }); function getCompiledElement () { var element = angular.element(''); var compiledElement = compile(element)(scope); scope.$digest(); return compiledElement; } it('should compile', function () { var ticket = { type: 'incident', resolvedDate: null, impact: '4-Minor/Localized', urgency: '4-Low', resolution: null, templateId: '', serviceType: 'User Service Restoration', brokerVendorName: '', id: 'IDGAA5V0GEXADAPGP1NOPFSOMG8GQ9', displayId: 'INC1332', summary: 'Allen Allbrook', desc: 'Allen Allbrook', numAttachments: 0, customFields: {}, noCategories: 0, ticketType: 'incident', attachments: [], priority: 'Low' }; scope.field = new FieldVO().build(priorityField); scope.ticket = ticket; var directiveElem = getCompiledElement(); var divElem = directiveElem[0]; expect(divElem).toBeDefined(); }); it('should set priority field editable value', function () { var ticket = { accessMappings: { priorityEditAllowed: true }, type: 'workorder', resolvedDate: null, impact: '4-Minor/Localized', urgency: '4-Low', resolution: null, templateId: '', serviceType: 'User Service Restoration', brokerVendorName: '', id: 'IDGAA5V0GEXADAPGP1NOPFSOMG8GQ9', displayId: 'WO1332', summary: 'Allen Allbrook', desc: 'Allen Allbrook', numAttachments: 0, customFields: {}, noCategories: 0, ticketType: 'workorder', attachments: [], priority: 'Low' }; scope.field = new FieldVO().build(priorityField); scope.ticket = ticket; var directiveElem = getCompiledElement(), isolatedScope = directiveElem.isolateScope(); expect(isolatedScope.isPriorityEditable).toBeTruthy(); }); it('should update priority', function () { var field = { id: 'AGGAA5V0HG8SIAOTIDJZAB1ZVENZN5', name: 'priority', type: 'priority', hideLabel: false, value: { impact: '4-Minor/Localized', priority: 'Low', urgency: '4-Low' }, members: [], accessible: true }; var ticket = { type: EntityVO.TYPE_INCIDENT, company: {name: 'Test Company'}, priority: 'Low', isDraft: true }; scope.field = new FieldVO().build(field); scope.ticket = ticket; scope.oldPriority = ''; scope.metadata = true; var directiveElem = getCompiledElement(); var divElem = directiveElem[0]; expect(divElem).toBeDefined(); ticket.priority = 'High'; scope.$apply(); expect(scope.ticket.priority).toEqual('High'); }); it('should make priority editable', function () { scope.field = new FieldVO().build(field); scope.ticket = ticket; var directiveElem = getCompiledElement(); var isoScope = directiveElem.isolateScope(); expect(isoScope.isPriorityEditable).toBeTruthy(); }); it('should save old priority', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; scope.ticket.priority = 'Low'; scope.$digest(); var directiveElem = getCompiledElement(); var isoScope = directiveElem.isolateScope(); expect(isoScope.oldPriority ).toEqual('Low'); }); it('should invoke watch for setValueFlag for incident', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; scope.ticket.type = 'incident'; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); scope.field.setValueFlag = {urgency: {name: 'urgency'}, impact: {name: '4-Minor/Localized'}}; scope.$digest(); getCompiledElement(); expect(scope.field.setValueFlag).toEqual('#$#'); }); it('should invoke watch for setValueFlag for change', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; scope.ticket.type = 'change'; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); spyOn(this.ticketModel, 'getChangePriority').and.callFake(function () { deferred.resolve('Low'); return deferred.promise; }); scope.field.setValueFlag = {urgency: {name: 'urgency'}, impact: {name: '4-Minor/Localized'}}; scope.$digest(); getCompiledElement(); expect(scope.field.setValueFlag).toEqual('#$#'); }); it('should invoke watch for setValueFlag for other than change and incident', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; scope.ticket.type = 'workorder'; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); spyOn(this.ticketModel, 'getChangePriority').and.callFake(function () { deferred.resolve('Low'); return deferred.promise; }); scope.field.setValueFlag = {urgency: {name: 'urgency'}, impact: {name: '4-Minor/Localized'}}; scope.$digest(); getCompiledElement(); expect(scope.field.setValueFlag).toEqual('#$#'); }); it('should invoke watch for setValueFlag when urgency and impact is not updated', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); scope.field.setValueFlag = {}; scope.$digest(); getCompiledElement(); expect(scope.field.setValueFlag).toEqual('#$#'); }); it('should invoke watch for setValueFlag when urgency and impact is not updated and metadata is not available', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(false); return deferred.promise; }); scope.field.setValueFlag = {}; scope.$digest(); getCompiledElement(); expect(scope.field.setValueFlag).toEqual('#$#'); }); it('should change priority ', function(){ scope.field = new FieldVO().build(field); scope.ticket = ticket; var directiveElem = getCompiledElement(); var isoScope = directiveElem.isolateScope(); spyOn(isoScope, '$emit'); isoScope.$digest(); isoScope.changePriority (); expect(isoScope.$emit).toHaveBeenCalledWith(events.WIDGET_VALUE_CHANGE, jasmine.any(Object)); }); it('should listen to TOGGLE_EDIT_MODE and assign data', inject(function ($rootScope) { scope.field = new FieldVO().build(field); scope.ticket = ticket; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); scope.$digest(); var directiveElem = getCompiledElement(); var isoScope = directiveElem.isolateScope(); isoScope.editMode = false; isoScope.$parent.$broadcast(events.TOGGLE_EDIT_MODE); expect(isoScope.editMode).toBeTruthy(); })); it('should listen to DISCARD_CHANGES and assign data', inject(function ($rootScope) { scope.field = new FieldVO().build(field); scope.ticket = ticket; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); scope.$digest(); var directiveElem = getCompiledElement(); var isoScope = directiveElem.isolateScope(); isoScope.editMode = true; isoScope.$parent.$broadcast(events.DISCARD_CHANGES); expect(isoScope.editMode).toBeFalsy(); })); it('should listen to AFTER_SAVED_CHANGES and assign data', inject(function ($rootScope) { scope.field = new FieldVO().build(field); scope.ticket = ticket; spyOn(this.metadataModel, 'getMetadataByType').and.callFake(function () { deferred.resolve(metadata); return deferred.promise; }); scope.$digest(); var directiveElem = getCompiledElement(); var isoScope = directiveElem.isolateScope(); isoScope.editMode = true; isoScope.$parent.$broadcast(events.AFTER_SAVED_CHANGES); expect(isoScope.oldPriority).toEqual('Low'); })); });