From 21aeda0f4553b9fef1897e6bc8514999660a80a8 Mon Sep 17 00:00:00 2001 From: kialam Date: Thu, 11 Oct 2018 11:10:13 -0400 Subject: [PATCH] Add unit tests for Job Details - Test `getSplitJobDetails` method. - Fix failing tests. - Rename unit tests. --- .../features/output/details.component.js | 5 +- awx/ui/test/unit/components/index.js | 3 +- .../components/job-details-split-jobs.unit.js | 206 ++++++++++++++++++ ...s.unit.js => jobs-list-split-jobs.unit.js} | 0 4 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 awx/ui/test/unit/components/job-details-split-jobs.unit.js rename awx/ui/test/unit/components/{split-jobs.unit.js => jobs-list-split-jobs.unit.js} (100%) diff --git a/awx/ui/client/features/output/details.component.js b/awx/ui/client/features/output/details.component.js index d3525db370..93f405d2a0 100644 --- a/awx/ui/client/features/output/details.component.js +++ b/awx/ui/client/features/output/details.component.js @@ -143,7 +143,10 @@ function getSliceJobDetails () { const offset = `${number}/${count}`; const tooltip = strings.get('tooltips.SLICE_JOB_DETAILS'); - return { label, offset, tooltip }; + if (label && offset && tooltip) { + return { label, offset, tooltip }; + } + return null; } function getJobTemplateDetails () { diff --git a/awx/ui/test/unit/components/index.js b/awx/ui/test/unit/components/index.js index 384436db40..a95460d83a 100644 --- a/awx/ui/test/unit/components/index.js +++ b/awx/ui/test/unit/components/index.js @@ -6,5 +6,6 @@ import './file.unit'; import './layout.unit'; import './side-nav.unit'; import './side-nav-item.unit'; -import './split-jobs.unit'; +import './jobs-list-split-jobs.unit'; +import './job-details-split-jobs.unit'; diff --git a/awx/ui/test/unit/components/job-details-split-jobs.unit.js b/awx/ui/test/unit/components/job-details-split-jobs.unit.js new file mode 100644 index 0000000000..8948ededc6 --- /dev/null +++ b/awx/ui/test/unit/components/job-details-split-jobs.unit.js @@ -0,0 +1,206 @@ +'use strict'; +import moment from 'moment'; + +describe('View: Job Details', () => { + let JobDetails, + scope, + state, + OutputStrings, + Prompt, + filter, + ProcessErrors, + Wait, + httpBackend, + ParseVariableString, + subscribe, + OutputStatusService; + + var mockData = { + summary_fields: { + internal_limit: { + shard: { + offset: 1, + step: 2, + } + } + }, + labels: { + SPLIT_JOB: 'foo' + }, + tooltips: { + SPLIT_JOB_DETAILS: 'bar' + } + }; + let resource = { + id: '147', + type: 'playbook', + model: { + get: (obj) => { + return obj.split('.').reduce((i,o) => i && i[o] || null, mockData); + }, + has: jasmine.createSpy('has'), + options: jasmine.createSpy('options'), + }, + events: {}, + ws: {} + }; + + beforeEach(angular.mock.module('at.features.output', ($provide) => { + state = { + params: { + job_search: {} + }, + go: jasmine.createSpy('go'), + includes: jasmine.createSpy('includes') + } + + OutputStrings = { + get: (obj) => { + return obj.split('.').reduce((i,o) => i && i[o] || null, mockData); + }, + } + + OutputStatusService = { + subscribe: jasmine.createSpy('subscribe') + }; + + ProcessErrors = jasmine.createSpy('ProcessErrors'); + Wait = jasmine.createSpy('Wait'); + Prompt = jasmine.createSpy('Prompt'); + + $provide.value('state', state); + $provide.value('ProcessErrors', ProcessErrors); + $provide.value('Wait', Wait); + $provide.value('Prompt', Prompt); + $provide.value('OutputStrings', OutputStrings); + $provide.value('ParseVariableString', angular.noop); + $provide.value('OutputStatusService', OutputStatusService); + + $provide.provider('$stateProvider', { '$get': function() { return function() {}; } }); + $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); + $provide.value('$stateRegistry', { register: jasmine.createSpy('regster'), }); + $provide.value('sanitizeFilter', angular.noop); + $provide.value('subscribe', subscribe); + $provide.value('moment', moment); + $provide.value('longDateFilter', angular.noop); + })); + + beforeEach(angular.mock.inject(function($injector, $componentController, $rootScope, $httpBackend, _state_, _OutputStrings_, _ParseVariableString_, _Prompt_, _ProcessErrors_, _Wait_, _OutputStatusService_){ + scope = $rootScope.$new(); + state = _state_; + OutputStrings = _OutputStrings_; + Prompt = _Prompt_; + filter = $injector.get("$filter"); + ProcessErrors = _ProcessErrors_; + Wait = _Wait_; + ParseVariableString = _ParseVariableString_; + httpBackend = $httpBackend; + OutputStatusService = _OutputStatusService_; + + JobDetails = $componentController('atJobDetails', { + $scope: scope, + $state: state, + OutputStrings: OutputStrings, + ProcessErrors: ProcessErrors, + Wait: Wait, + Prompt: Prompt, + $filter: filter, + Wait: Wait, + ParseVariableString: ParseVariableString, + httpBackend: httpBackend, + OutputStatusService: OutputStatusService, + }, {resource: resource}); + JobDetails.$onInit(); + })); + + describe('JobDetails Component', () => { + it('is created successfully', () => { + expect(JobDetails).toBeDefined(); + }); + it('has method "getSplitJobDetails"', () => { + expect(JobDetails.splitJobDetails).toBeDefined(); + }); + describe('splitJobDetails method', () => { + it('returned values are strings', () => { + const result = JobDetails.splitJobDetails; + const { label, offset, tooltip } = result; + expect(offset).toEqual('2/2'); + expect(label).toEqual('foo'); + expect(tooltip).toEqual('bar'); + }); + it('returns null if label, offset, or tooltip is undefined', () => { + mockData = { + summary_fields: { + internal_limit: { + shard: { + offset: 1, + step: 2, + } + } + }, + labels: { + SPLIT_JOB: null + }, + tooltips: { + SPLIT_JOB_DETAILS: null + } + }; + JobDetails.$onInit(); + const result = JobDetails.splitJobDetails; + expect(result).toBeNull(); + }); + it('returns null if summary_fields.internal_limit is undefined or null', () => { + mockData = { + summary_fields: { + internal_limit: undefined + }, + labels: { + SPLIT_JOB: 'foo' + }, + tooltips: { + SPLIT_JOB_DETAILS: 'bar' + } + }; + JobDetails.$onInit(); + const result = JobDetails.splitJobDetails; + expect(result).toBeNull(); + }); + it('returns null if summary_fields.internal_limit.shard is undefined or null', () => { + mockData = { + summary_fields: { + internal_limit: { + shard: undefined + } + }, + labels: { + SPLIT_JOB: 'foo' + }, + tooltips: { + SPLIT_JOB_DETAILS: 'bar' + } + }; + JobDetails.$onInit(); + const result = JobDetails.splitJobDetails; + expect(result).toBeNull(); + }); + it('returns null if summary_fields.internal_limit.shard is an empty object', () => { + mockData = { + summary_fields: { + internal_limit: { + shard: {} + } + }, + labels: { + SPLIT_JOB: 'foo' + }, + tooltips: { + SPLIT_JOB_DETAILS: 'bar' + } + }; + JobDetails.$onInit(); + const result = JobDetails.splitJobDetails; + expect(result).toBeNull(); + }); + }); + }); +}); \ No newline at end of file diff --git a/awx/ui/test/unit/components/split-jobs.unit.js b/awx/ui/test/unit/components/jobs-list-split-jobs.unit.js similarity index 100% rename from awx/ui/test/unit/components/split-jobs.unit.js rename to awx/ui/test/unit/components/jobs-list-split-jobs.unit.js