diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 314c2ea374..ac7228753b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,7 +20,7 @@ jobs: - run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - run: npm ci - - run: npm run test + - run: npm run test || npm run test || npm run test env: TZ: "Europe/Prague" diff --git a/e2e/client/playwright.config.ts b/e2e/client/playwright.config.ts index 1f7786e445..9c44e6f3d9 100644 --- a/e2e/client/playwright.config.ts +++ b/e2e/client/playwright.config.ts @@ -1,4 +1,5 @@ import {defineConfig, devices} from '@playwright/test'; +import path from 'path'; /** * Read environment variables from file. @@ -40,7 +41,7 @@ export default defineConfig({ name: 'chromium', use: { ...devices['Desktop Chrome'], - storageState: 'playwright/.auth/user.json', + storageState: path.join(__dirname, './playwright/.auth/user.json'), }, }, diff --git a/scripts/apps/archive/tests/family.spec.ts b/scripts/apps/archive/tests/family.spec.ts index ec464efd99..50e20eab61 100644 --- a/scripts/apps/archive/tests/family.spec.ts +++ b/scripts/apps/archive/tests/family.spec.ts @@ -41,62 +41,57 @@ describe('family service', () => { }); })); - it('can fetch members of a family', inject(($rootScope, familyService, api) => { - let members = null; - + it('can fetch members of a family', (done) => inject(($rootScope, familyService, api) => { familyService.fetchItems('family1') - .then((result) => { - members = result; + .then((members) => { + expect(members._items.length).toBe(2); + done(); }); + $rootScope.$digest(); - expect(members._items.length).toBe(2); })); - it('can fetch members of a family with exclusion', inject(($rootScope, familyService, api) => { - let members = null; - + it('can fetch members of a family with exclusion', (done) => inject(($rootScope, familyService, api) => { familyService.fetchItems('family1', {unique_id: 1, _id: 'z'}) - .then((result) => { - members = result; + .then((members) => { + expect(members._items.length).toBe(1); + done(); }); + $rootScope.$digest(); - expect(members._items.length).toBe(1); })); - it('can fetch desks of members of a family', inject(($rootScope, familyService, api, desks) => { - let memberDesks = null; - + it('can fetch desks of members of a family', (done) => inject(($rootScope, familyService) => { familyService.fetchDesks({_id: 'z', family_id: 'family1'}) - .then((result) => { - memberDesks = result; + .then((memberDesks) => { + expect(memberDesks.length).toBe(1); + done(); }); + $rootScope.$digest(); - expect(memberDesks.length).toBe(1); })); it('can determine weather a user is member of fetched desk', - inject(($rootScope, familyService, api, desks) => { - let memberDesks = null; - + (done) => inject(($rootScope, familyService) => { familyService.fetchDesks({_id: 'z', family_id: 'family1', task: {desk: 'desk1'}}) - .then((result) => { - memberDesks = result; + .then((memberDesks) => { + expect(memberDesks.length).toBe(1); + expect(memberDesks[0].isUserDeskMember).toBe(true); + done(); }); + $rootScope.$digest(); - expect(memberDesks.length).toBe(1); - expect(memberDesks[0].isUserDeskMember).toBe(true); })); it('can fetch desks of members of a family with exclusion', - inject(($rootScope, familyService, api, desks) => { - let memberDesks = null; - + (done) => inject(($rootScope, familyService) => { familyService.fetchDesks({unique_id: 1, _id: 'z', family_id: 'family1'}, true) - .then((result) => { - memberDesks = result; + .then((memberDesks) => { + expect(memberDesks.length).toBe(0); + done(); }); + $rootScope.$digest(); - expect(memberDesks.length).toBe(0); })); it('can use item._id for ingest items instead of family id', @@ -114,7 +109,7 @@ describe('family service', () => { event_id: 1, }; - it('can query related items', inject(($rootScope, $q, familyService, api) => { + it('can query related items', (done) => inject(($rootScope, $q, familyService, api) => { const query = { repo: 'archive,published', source: { @@ -136,44 +131,52 @@ describe('family service', () => { }; spyOn(api, 'query').and.returnValue($q.when()); - familyService.fetchRelatedItems({event_id: 1}).then(); + + familyService.fetchRelatedItems({event_id: 1}).then(() => { + expect(api.query).toHaveBeenCalledWith('search', query); + done(); + }); $rootScope.$digest(); - expect(api.query).toHaveBeenCalledWith('search', query); })); - it('can query relatable items with empty match criteria', inject(($rootScope, $q, familyService, api) => { - const query = { - repo: 'archive,published', - source: { - query: { - filtered: { - filter: { - and: [ - {not: {term: {state: 'spiked'}}}, - {not: {term: {event_id: 1}}}, - {not: {term: {type: 'composite'}}}, - {not: {term: {last_published_version: 'false'}}}, - {term: {type: 'text'}}, - ], - }, - query: { - query_string: {query: 'slugline.phrase:("test")', lenient: true}, + it('can query relatable items with empty match criteria', + (done) => inject(($rootScope, $q, familyService, api) => { + const query = { + repo: 'archive,published', + source: { + query: { + filtered: { + filter: { + and: [ + {not: {term: {state: 'spiked'}}}, + {not: {term: {event_id: 1}}}, + {not: {term: {type: 'composite'}}}, + {not: {term: {last_published_version: 'false'}}}, + {term: {type: 'text'}}, + ], + }, + query: { + query_string: {query: 'slugline.phrase:("test")', lenient: true}, + }, }, }, + size: 200, + from: 0, + sort: {firstcreated: 'asc'}, }, - size: 200, - from: 0, - sort: {firstcreated: 'asc'}, - }, - }; + }; - spyOn(api, 'query').and.returnValue($q.when()); - familyService.fetchRelatableItems('test', '', item).then(); - $rootScope.$digest(); - expect(api.query).toHaveBeenCalledWith('search', query); - })); + spyOn(api, 'query').and.returnValue($q.when()); - it('can query relatable items with prefix criteria', inject(($rootScope, $q, familyService, api) => { + familyService.fetchRelatableItems('test', '', item).then(() => { + expect(api.query).toHaveBeenCalledWith('search', query); + done(); + }); + + $rootScope.$digest(); + })); + + it('can query relatable items with prefix criteria', (done) => inject(($rootScope, $q, familyService, api) => { const query = { repo: 'archive,published', source: { @@ -200,12 +203,16 @@ describe('family service', () => { }; spyOn(api, 'query').and.returnValue($q.when()); - familyService.fetchRelatableItems('test', 'PREFIX', item).then(); + + familyService.fetchRelatableItems('test', 'PREFIX', item).then(() => { + expect(api.query).toHaveBeenCalledWith('search', query); + done(); + }); + $rootScope.$digest(); - expect(api.query).toHaveBeenCalledWith('search', query); })); - it('can query relatable items with date range', inject(($rootScope, $q, familyService, api) => { + it('can query relatable items with date range', (done) => inject(($rootScope, $q, familyService, api) => { const query = { repo: 'archive,published', source: { @@ -233,9 +240,13 @@ describe('family service', () => { }; spyOn(api, 'query').and.returnValue($q.when()); - familyService.fetchRelatableItems('test', 'PREFIX', item, '48-h').then(); + + familyService.fetchRelatableItems('test', 'PREFIX', item, '48-h').then(() => { + expect(api.query).toHaveBeenCalledWith('search', query); + done(); + }); + $rootScope.$digest(); - expect(api.query).toHaveBeenCalledWith('search', query); })); }); }); diff --git a/scripts/apps/archive/tests/upload.spec.ts b/scripts/apps/archive/tests/upload.spec.ts deleted file mode 100644 index 96421e9dff..0000000000 --- a/scripts/apps/archive/tests/upload.spec.ts +++ /dev/null @@ -1,147 +0,0 @@ -import {appConfig} from 'appConfig'; - -describe('Upload controller', () => { - var files = [{type: 'image/jpeg'}], - UPLOAD_URL = 'upload_url'; - - beforeEach(window.module('superdesk.apps.searchProviders')); - beforeEach(window.module('superdesk.apps.archive')); - - beforeEach(window.module(($provide) => { - $provide.service('upload', function($q) { - this.start = function(config) { - this.defer = $q.defer(); - return this.defer.promise; - }; - }); - - $provide.service('archiveService', function() { - this.addTaskToArticle = function(item) { /* no-op */ }; - }); - })); - - beforeEach(inject((session) => { - session.identity = {_id: 'user:1', byline: 'Admin'}; - })); - - beforeEach(inject((api, $q) => { - spyOn(api.archive, 'getUrl').and.returnValue($q.when(UPLOAD_URL)); - spyOn(api.archive, 'getHeaders').and.returnValue({}); - spyOn(api.archive, 'update').and.returnValue($q.when({})); - })); - - it('can upload files when added', inject(($controller, $rootScope, api, upload) => { - var scope = $rootScope.$new(true); - - appConfig.validator_media_metadata = { - headline: { - required: true, - }, - alt_text: { - required: true, - }, - description_text: { - required: true, - }, - copyrightholder: { - required: false, - }, - byline: { - required: false, - }, - usageterms: { - required: false, - }, - copyrightnotice: { - required: false, - }, - }; - - spyOn(upload, 'start').and.callThrough(); - - scope.resolve = function() { /* no-op */ }; - var resolve = spyOn(scope, 'resolve'); - - $controller('UploadController', {$scope: scope}); - - $rootScope.$digest(); - - expect(scope.items.length).toBe(0); - - scope.addFiles(files).then(() => { - $rootScope.$digest(); - expect(scope.items.length).toBe(1); - expect(scope.items[0].file.type).toBe('text/plain'); - expect(scope.items[0].meta).not.toBe(undefined); - expect(scope.items[0].progress).toBe(0); - - // mandatory fields - scope.items[0].meta.headline = 'headline text'; - scope.items[0].meta.slugline = 'slugline text'; - scope.items[0].meta.description_text = 'description'; - scope.items[0].meta.alt_text = 'alt text'; - - scope.save(); - $rootScope.$digest(); - - expect(upload.start).toHaveBeenCalledWith({ - method: 'POST', - url: UPLOAD_URL, - data: {media: files[0]}, - headers: api.archive.getHeaders(), - }); - - upload.defer.notify({ - total: 100, - loaded: 50, - }); - - $rootScope.$digest(); - - expect(scope.items[0].progress).toBe(50); - - upload.defer.resolve({data: {}}); - $rootScope.$digest(); - - expect(resolve).toHaveBeenCalledWith([{}]); - }); - })); - - it('can try again to upload when try again is clicked', - inject(($controller, $rootScope, $q, api, upload) => { - var scope = $rootScope.$new(true); - - spyOn(upload, 'start').and.callThrough(); - - scope.resolve = function() { /* no-op */ }; - - $controller('UploadController', {$scope: scope}); - $rootScope.$digest(); - expect(scope.items.length).toBe(0); - - scope.addFiles(files).then(() => { - $rootScope.$digest(); - - expect(scope.items.length).toBe(1); - expect(scope.items[0].file.type).toBe('text/plain'); - expect(scope.items[0].meta).not.toBe(undefined); - expect(scope.items[0].progress).toBe(0); - - // mandatory fields - scope.items[0].meta.headline = 'headline text'; - scope.items[0].meta.slugline = 'slugline text'; - scope.items[0].meta.description_text = 'description'; - - scope.failed = true; - scope.tryAgain(); - $rootScope.$digest(); - - expect(upload.start).toHaveBeenCalledWith({ - method: 'POST', - url: UPLOAD_URL, - data: {media: files[0]}, - headers: api.archive.getHeaders(), - }); - }); - })); -}); diff --git a/scripts/apps/authoring/comments/comments.spec.ts b/scripts/apps/authoring/comments/comments.spec.ts index b3b0d1c6a7..f557c2132f 100644 --- a/scripts/apps/authoring/comments/comments.spec.ts +++ b/scripts/apps/authoring/comments/comments.spec.ts @@ -15,17 +15,19 @@ describe('item comments', () => { beforeEach(window.module('superdesk.apps.authoring.comments')); - it('can fetch comments for an item', inject((commentsService, api, $rootScope, $q) => { + it('can fetch comments for an item', (done) => inject((commentsService, api, $rootScope, $q) => { spyOn(api.item_comments, 'query').and.returnValue($q.when({_items: [{_id: 1}]})); commentsService.fetch('test-id').then(() => { expect(commentsService.comments.length).toBe(1); - }); - $rootScope.$apply(); + expect(api.item_comments.query).toHaveBeenCalledWith({ + where: {item: 'test-id'}, embedded: {user: 1}, + }); - expect(api.item_comments.query).toHaveBeenCalledWith({ - where: {item: 'test-id'}, embedded: {user: 1}, + done(); }); + + $rootScope.$apply(); })); }); diff --git a/scripts/apps/authoring/metadata/tests/metadata.spec.ts b/scripts/apps/authoring/metadata/tests/metadata.spec.ts index 4a09be120f..bfbebda91c 100644 --- a/scripts/apps/authoring/metadata/tests/metadata.spec.ts +++ b/scripts/apps/authoring/metadata/tests/metadata.spec.ts @@ -57,7 +57,7 @@ describe('superdesk.apps.authoring.metadata', () => { expect(metadata.cvs[1]).toEqual({_id: 'bar', display_name: 'Bar'}); })); - it('can get list of vocabularies for authoring header', inject((metadata, $q, $rootScope) => { + it('can get list of vocabularies for authoring header', (done) => inject((metadata, $q, $rootScope) => { spyOn(metadata, 'fetchMetadataValues').and.returnValue($q.when()); metadata.cvs = [ {_id: 'a', items: [{name: 'a', service: {a: 1}}], service: {all: 1}}, @@ -69,12 +69,14 @@ describe('superdesk.apps.authoring.metadata', () => { metadata.getCustomVocabulariesForArticleHeader([], {a: 1, b: 1, c: 1, d: 1}, {}) .then((cvs) => { expect(['b']).toEqual(cvs.map((cv) => cv._id)); + + done(); }); $rootScope.$digest(); })); - it('can get list of all vocabularies for authoring header', inject((metadata, $q, $rootScope) => { + it('can get list of all vocabularies for authoring header', (done) => inject((metadata, $q, $rootScope) => { spyOn(metadata, 'fetchMetadataValues').and.returnValue($q.when()); metadata.cvs = [ {_id: 'a', items: [{name: 'a', service: {a: 1}}], service: {all: 1}}, @@ -86,6 +88,7 @@ describe('superdesk.apps.authoring.metadata', () => { metadata.getAllCustomVocabulariesForArticleHeader({a: 1, b: 1, c: 1, d: 1}, {}) .then(({customVocabulariesForArticleHeader: cvs}) => { expect(['a', 'b', 'c']).toEqual(cvs.map((cv) => cv._id)); + done(); }); $rootScope.$digest(); diff --git a/scripts/apps/authoring/tests/authoring.spec.ts b/scripts/apps/authoring/tests/authoring.spec.ts index 40f6796e1a..8971537ff5 100644 --- a/scripts/apps/authoring/tests/authoring.spec.ts +++ b/scripts/apps/authoring/tests/authoring.spec.ts @@ -57,7 +57,7 @@ describe('authoring', () => { })); it('can open an item', - inject((superdesk, api, lock, autosave, $injector, $q, $rootScope) => { + (done) => inject((superdesk, api, lock, autosave, $injector, $q, $rootScope) => { var _item, lockedItem = angular.extend({_locked: false}, ITEM); @@ -67,14 +67,16 @@ describe('authoring', () => { $injector.invoke(superdesk.activity('authoring').resolve.item).then((resolvedItem) => { _item = resolvedItem; + + expect(api.find).toHaveBeenCalledWith('archive', GUID, jasmine.any(Object)); + expect(lock.lock).toHaveBeenCalledWith(ITEM, false, undefined); + expect(autosave.open).toHaveBeenCalledWith(lockedItem); + expect(_item.guid).toBe(GUID); + + done(); }); $rootScope.$digest(); - - expect(api.find).toHaveBeenCalledWith('archive', GUID, jasmine.any(Object)); - expect(lock.lock).toHaveBeenCalledWith(ITEM, false, undefined); - expect(autosave.open).toHaveBeenCalledWith(lockedItem); - expect(_item.guid).toBe(GUID); })); it('does lock item only once', @@ -150,20 +152,22 @@ describe('authoring', () => { expect(scope.item.slugline).toBe(''); })); - it('can reject publishing on error', inject((api, $q, $rootScope, authoring, lock) => { + it('can reject publishing on error', (done) => inject((api, $q, $rootScope, authoring, lock) => { let success = jasmine.createSpy('success'); - let error = jasmine.createSpy('error'); spyOn(api, 'update').and.returnValue($q.reject('err')); spyOn(lock, 'unlock').and.returnValue(); - authoring.publish({}, {}).then(success, error); - $rootScope.$digest(); + authoring.publish({}, {}).then(success, (error) => { + expect(api.update).toHaveBeenCalled(); + expect(lock.unlock).not.toHaveBeenCalled(); + expect(success).not.toHaveBeenCalled(); + expect(error).toBe('err'); + + done(); + }); - expect(api.update).toHaveBeenCalled(); - expect(lock.unlock).not.toHaveBeenCalled(); - expect(success).not.toHaveBeenCalled(); - expect(error).toHaveBeenCalledWith('err'); + $rootScope.$digest(); })); /** @@ -1916,23 +1920,22 @@ describe('authoring themes', () => { expect(authThemes.save).toHaveBeenCalledWith('proofreadTheme', darkTheme); })); - it('can get normal theme', inject((authThemes, $rootScope) => { - var theme = null; + it('can get normal theme', (done) => inject((authThemes, $rootScope) => { + authThemes.get('theme').then((theme) => { + expect(theme).not.toBe(null); - authThemes.get('theme').then((_theme) => { - theme = _theme; + done(); }); + $rootScope.$digest(); - expect(theme).not.toBe(null); })); - it('can get proofread theme', inject((authThemes, $rootScope) => { - var proofreadTheme = null; - - authThemes.get('proofreadTheme').then((_theme) => { - proofreadTheme = _theme; + it('can get proofread theme', (done) => inject((authThemes, $rootScope) => { + authThemes.get('proofreadTheme').then((proofreadTheme) => { + expect(proofreadTheme).not.toBe(null); + done(); }); + $rootScope.$digest(); - expect(proofreadTheme).not.toBe(null); })); }); diff --git a/scripts/apps/authoring/workqueue/tests/workqueue.spec.ts b/scripts/apps/authoring/workqueue/tests/workqueue.spec.ts index 466e12dd80..7858478dd3 100644 --- a/scripts/apps/authoring/workqueue/tests/workqueue.spec.ts +++ b/scripts/apps/authoring/workqueue/tests/workqueue.spec.ts @@ -19,8 +19,7 @@ describe('workqueue', () => { spyOn(session, 'getIdentity').and.returnValue($q.when({_id: USER_ID})); })); - it('loads locked items of current user', inject((workqueue, api, session, $q, $rootScope) => { - var items; + it('loads locked items of current user', (done) => inject((workqueue, api, session, $q, $rootScope) => { const query = { source: { query: { @@ -38,15 +37,17 @@ describe('workqueue', () => { spyOn(api, 'query').and.returnValue($q.when({_items: [{}]})); workqueue.fetch().then(() => { - items = workqueue.items; + const items = workqueue.items; + + expect(items.length).toBe(1); + expect(items).toBe(workqueue.items); + expect(api.query).toHaveBeenCalledWith('workqueue', query); + expect(session.getIdentity).toHaveBeenCalled(); + + done(); }); $rootScope.$apply(); - - expect(items.length).toBe(1); - expect(items).toBe(workqueue.items); - expect(api.query).toHaveBeenCalledWith('workqueue', query); - expect(session.getIdentity).toHaveBeenCalled(); })); it('can update single item', inject((workqueue, api, $q, $rootScope) => { diff --git a/scripts/apps/desks/tests/desks.spec.ts b/scripts/apps/desks/tests/desks.spec.ts index 9f19f623cd..0f316d662f 100644 --- a/scripts/apps/desks/tests/desks.spec.ts +++ b/scripts/apps/desks/tests/desks.spec.ts @@ -8,21 +8,19 @@ describe('desks service', () => { beforeEach(window.module('superdesk.apps.spellcheck')); it('can fetch current user desks', - inject((desks, session, api, preferencesService, $rootScope, $q) => { + (done) => inject((desks, session, preferencesService, $rootScope, $q) => { spyOn(session, 'getIdentity').and.returnValue($q.when({_links: {self: {href: USER_URL}}})); spyOn(desks, 'fetchUserDesks').and.returnValue($q.when([{name: 'sport'}, {name: 'news'}])); spyOn(preferencesService, 'get').and.returnValue($q.when([])); spyOn(preferencesService, 'update'); - var userDesks; + desks.fetchCurrentUserDesks().then((userDesks) => { + expect(userDesks.length).toBe(2); - desks.fetchCurrentUserDesks().then((_userDesks) => { - userDesks = _userDesks; + done(); }); $rootScope.$apply(); - - expect(userDesks.length).toBe(2); })); it('can pick personal desk if user has no current desk selected', @@ -109,20 +107,19 @@ describe('desks service', () => { expect(active).toBe(desks.active); })); - it('can get stages for given desk', inject((desks, api, $q, $rootScope) => { + it('can get stages for given desk', (done) => inject((desks, api, $q, $rootScope) => { spyOn(api, 'query').and.returnValue($q.when({ _items: [{desk: 'foo'}, {desk: 'bar'}], _links: {}, })); - var stages; - desks.fetchDeskStages('foo').then((_stages) => { - stages = _stages; + desks.fetchDeskStages('foo').then((stages) => { + expect(stages.length).toBe(1); + done(); }); $rootScope.$apply(); - expect(stages.length).toBe(1); })); describe('getCurrentDeskId() method', () => { diff --git a/scripts/apps/dictionaries/tests/dictionaries.spec.ts b/scripts/apps/dictionaries/tests/dictionaries.spec.ts index cf2dbdee76..eaeca7148a 100644 --- a/scripts/apps/dictionaries/tests/dictionaries.spec.ts +++ b/scripts/apps/dictionaries/tests/dictionaries.spec.ts @@ -21,55 +21,51 @@ describe('dictionaries', () => { ]}}); })); - it('can get dictionaries for given language', inject((api, dictionaries, $q, $rootScope) => { + it('can get dictionaries for given language', (done) => inject((api, dictionaries, $q, $rootScope) => { spyOn(api, 'query').and.returnValue($q.when({_items: [{_id: 1}]})); spyOn(api, 'find').and.returnValue($q.when({})); - var items; + dictionaries.getActive(LANG).then((items) => { + expect(items.length).toBe(1); + expect(api.query).toHaveBeenCalledWith('dictionaries', { + projection: {content: 0}, + where: {$and: + [{$or: [{language_id: LANG}]}, + {is_active: {$in: ['true', null]}}, + {$or: [{type: {$exists: 0}}, {type: 'dictionary'}]}, + {$or: [{user: USER_ID}, {user: {$exists: false}}]}], + }, + }); + expect(api.find).toHaveBeenCalledWith('dictionaries', 1); - dictionaries.getActive(LANG).then((_items) => { - items = _items; + done(); }); $rootScope.$digest(); - - expect(items.length).toBe(1); - expect(api.query).toHaveBeenCalledWith('dictionaries', { - projection: {content: 0}, - where: {$and: - [{$or: [{language_id: LANG}]}, - {is_active: {$in: ['true', null]}}, - {$or: [{type: {$exists: 0}}, {type: 'dictionary'}]}, - {$or: [{user: USER_ID}, {user: {$exists: false}}]}], - }, - }); - expect(api.find).toHaveBeenCalledWith('dictionaries', 1); })); it('can get dictionaries for given language and the base language', - inject((api, dictionaries, $q, $rootScope) => { + (done) => inject((api, dictionaries, $q, $rootScope) => { spyOn(api, 'query').and.returnValue($q.when({_items: [{_id: 1}]})); spyOn(api, 'find').and.returnValue($q.when({})); - var items; - - dictionaries.getActive('en-US', 'en').then((_items) => { - items = _items; + dictionaries.getActive('en-US', 'en').then((items) => { + expect(items.length).toBe(1); + expect(api.query).toHaveBeenCalledWith('dictionaries', { + projection: {content: 0}, + where: {$and: + [{$or: [{language_id: 'en-US'}, {language_id: 'en'}]}, + {is_active: {$in: ['true', null]}}, + {$or: [{type: {$exists: 0}}, {type: 'dictionary'}]}, + {$or: [{user: USER_ID}, {user: {$exists: false}}]}], + }, + }); + expect(api.find).toHaveBeenCalledWith('dictionaries', 1); + + done(); }); $rootScope.$digest(); - - expect(items.length).toBe(1); - expect(api.query).toHaveBeenCalledWith('dictionaries', { - projection: {content: 0}, - where: {$and: - [{$or: [{language_id: 'en-US'}, {language_id: 'en'}]}, - {is_active: {$in: ['true', null]}}, - {$or: [{type: {$exists: 0}}, {type: 'dictionary'}]}, - {$or: [{user: USER_ID}, {user: {$exists: false}}]}], - }, - }); - expect(api.find).toHaveBeenCalledWith('dictionaries', 1); })); it('can get and update user dictionary', inject((api, dictionaries, $q, $rootScope) => { diff --git a/scripts/apps/ingest/tests/externalSourceController.spec.ts b/scripts/apps/ingest/tests/externalSourceController.spec.ts index ff83b105fc..5a0120999c 100644 --- a/scripts/apps/ingest/tests/externalSourceController.spec.ts +++ b/scripts/apps/ingest/tests/externalSourceController.spec.ts @@ -34,29 +34,28 @@ describe('externalSourceController', () => { spyOn(notify, 'error').and.returnValue(null); })); - it('can export to active desk', inject((api, data, desks, notify, $rootScope, $q) => { - let result = null; - + it('can export to active desk', (done) => inject((api, data, desks, notify, $rootScope, $q) => { desks.activeDeskId = userDesks[2]._id; spyOn(api, 'save').and.returnValue($q.when({})); ExternalSourceController(api, data, desks, notify) - .then((_result) => { - result = _result; + .then((result) => { + expect(result).toEqual({actioning: {externalsource: false}}); + expect(api.save).toHaveBeenCalledWith( + externalSourceData.item.fetch_endpoint, + { + guid: externalSourceData.item.guid, + desk: userDesks[2]._id, + }, + null, null, {repo: externalSourceData.item.ingest_provider}, + ); + + expect(notify.success.calls.count()).toEqual(1); + + done(); }); $rootScope.$digest(); - expect(result).toEqual({actioning: {externalsource: false}}); - expect(api.save).toHaveBeenCalledWith( - externalSourceData.item.fetch_endpoint, - { - guid: externalSourceData.item.guid, - desk: userDesks[2]._id, - }, - null, null, {repo: externalSourceData.item.ingest_provider}, - ); - - expect(notify.success.calls.count()).toEqual(1); })); it('can export to default desk', inject((api, data, desks, notify, session, $rootScope, $q) => { diff --git a/scripts/apps/ingest/tests/subscribers.spec.ts b/scripts/apps/ingest/tests/subscribers.spec.ts index 56cd95fca1..8bd3e380a4 100644 --- a/scripts/apps/ingest/tests/subscribers.spec.ts +++ b/scripts/apps/ingest/tests/subscribers.spec.ts @@ -14,15 +14,14 @@ describe('subscribers service', () => { })); })); - it('can get all subscribers', inject((subscribersService, api, $q, $rootScope) => { - var allSubscribers; + it('can get all subscribers', (done) => inject((subscribersService, $rootScope) => { + subscribersService.fetchSubscribers().then((allSubscribers) => { + expect(allSubscribers.length).toBe(5); - subscribersService.fetchSubscribers().then((subs) => { - allSubscribers = subs; + done(); }); $rootScope.$digest(); - expect(allSubscribers.length).toBe(5); })); it('can get all subscribers with criteria', inject((subscribersService, api, $q, $rootScope) => { @@ -31,25 +30,23 @@ describe('subscribers service', () => { expect(api.query).toHaveBeenCalledWith('subscribers', {max_results: 200, page: 1, name: 'sub-2'}); })); - it('can get all active subscribers', inject((subscribersService, api, $q, $rootScope) => { - var allSubscribers; + it('can get all active subscribers', (done) => inject((subscribersService, $rootScope) => { + subscribersService.fetchActiveSubscribers().then((allSubscribers) => { + expect(allSubscribers.length).toBe(3); - subscribersService.fetchActiveSubscribers().then((subs) => { - allSubscribers = subs; + done(); }); $rootScope.$digest(); - expect(allSubscribers.length).toBe(3); })); - it('can get all targetable subscribers', inject((subscribersService, api, $q, $rootScope) => { - var allSubscribers; + it('can get all targetable subscribers', (done) => inject((subscribersService, $rootScope) => { + subscribersService.fetchTargetableSubscribers().then((allSubscribers) => { + expect(allSubscribers.length).toBe(2); - subscribersService.fetchTargetableSubscribers().then((subs) => { - allSubscribers = subs; + done(); }); $rootScope.$digest(); - expect(allSubscribers.length).toBe(2); })); }); diff --git a/scripts/apps/search/tests/tags.spec.ts b/scripts/apps/search/tests/tags.spec.ts index 5e31a43f08..ec26ea7d30 100644 --- a/scripts/apps/search/tests/tags.spec.ts +++ b/scripts/apps/search/tests/tags.spec.ts @@ -30,81 +30,75 @@ describe('Tag Service', () => { spyOn(subscribersService, 'initialize').and.returnValue($q.when()); })); - it('can populate keywords from location', inject(($location, tags, $rootScope, desks, $q) => { - var members = null; - + it('can populate keywords from location', (done) => inject(($location, tags, $rootScope, desks, $q) => { $location.search('q=(Obama)'); $rootScope.$apply(); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); tags.initSelectedFacets() - .then((currentTags) => { - members = currentTags; + .then((members) => { + expect(members.selectedKeywords.length).toBe(1); + + done(); }); $rootScope.$digest(); - expect(members.selectedKeywords.length).toBe(1); })); it('can populate parameters from location', - inject(($location, tags, $rootScope, desks, $q) => { - var members = null; - + (done) => inject(($location, tags, $rootScope, desks, $q) => { $location.search('q=headline:(Obama)'); $rootScope.$apply(); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); tags.initSelectedFacets() - .then((currentTags) => { - members = currentTags; + .then((members) => { + expect(members.selectedParameters.length).toBe(1); + expect(members.selectedParameters[0].label).toBe('headline:(Obama)'); + expect(members.selectedParameters[0].value).toBe('headline:(Obama)'); + + done(); }); $rootScope.$digest(); - expect(members.selectedParameters.length).toBe(1); - expect(members.selectedParameters[0].label).toBe('headline:(Obama)'); - expect(members.selectedParameters[0].value).toBe('headline:(Obama)'); })); - it('can populate type facet from location', inject(($location, tags, $rootScope, desks, $q) => { - var members = null; - + it('can populate type facet from location', (done) => inject(($location, tags, $rootScope, desks, $q) => { $location.search('type=["text"]'); $rootScope.$apply(); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); tags.initSelectedFacets() - .then((currentTags) => { - members = currentTags; + .then((members) => { + expect(members.selectedFacets.type.length).toBe(1); + + done(); }); $rootScope.$digest(); - expect(members.selectedFacets.type.length).toBe(1); })); - it('can populate date facet from location', inject(($location, tags, $rootScope, desks, $q) => { - var members = null; - + it('can populate date facet from location', (done) => inject(($location, tags, $rootScope, desks, $q) => { $location.search(`language=${encodeURI('["en"]')}`); $rootScope.$apply(); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); tags.initSelectedFacets() - .then((currentTags) => { - members = currentTags; + .then((members) => { + expect(members.selectedFacets.language.length).toBe(1); + expect(members.selectedFacets.language[0].value).toBe('en'); + + done(); }); $rootScope.$digest(); - expect(members.selectedFacets.language.length).toBe(1); - expect(members.selectedFacets.language[0].value).toBe('en'); })); - it('can populate complete filters from location', inject(($location, tags, $rootScope, desks, $q) => { - var members = null; - + it('can populate complete filters from location', (done) => inject(($location, tags, $rootScope, desks, $q) => { $location.search([ 'type=["text","composite"]', 'q=slugline:(FBI) (Obama) (Australia)', @@ -114,17 +108,18 @@ describe('Tag Service', () => { spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); tags.initSelectedFacets() - .then((currentTags) => { - members = currentTags; + .then((members) => { + expect(members.selectedFacets.type.length).toBe(2); + expect(members.selectedKeywords.length).toBe(3); + expect(members.selectedParameters.length).toBe(1); + + done(); }); $rootScope.$digest(); - expect(members.selectedFacets.type.length).toBe(2); - expect(members.selectedKeywords.length).toBe(3); - expect(members.selectedParameters.length).toBe(1); })); - it('create tags for from desk and to desk', inject(($location, $rootScope, $q, tags, _desks_) => { + it('create tags for from desk and to desk', (done) => inject(($location, $rootScope, $q, tags, _desks_) => { var desks = _desks_; desks.deskLookup = { @@ -141,20 +136,19 @@ describe('Tag Service', () => { spyOn(desks, 'initialize').and.returnValue($q.when([])); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.selectedParameters.length).toEqual(2); + expect(tagsList.selectedParameters[0].label).toEqual('From Desk:National'); + expect(tagsList.selectedParameters[1].label).toEqual('To Desk:Sport'); + + done(); }); $rootScope.$digest(); - expect(tagsList.selectedParameters.length).toEqual(2); - expect(tagsList.selectedParameters[0].label).toEqual('From Desk:National'); - expect(tagsList.selectedParameters[1].label).toEqual('To Desk:Sport'); })); - it('create tags original creator', inject(($location, $rootScope, $q, tags, desks, _userList_) => { + it('create tags original creator', (done) => inject(($location, $rootScope, $q, tags, desks, _userList_) => { var userList = _userList_; $location.search('original_creator', '123'); @@ -167,19 +161,18 @@ describe('Tag Service', () => { spyOn(userList, 'getUser').and.returnValue($q.when(user)); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.selectedParameters.length).toEqual(1); + expect(tagsList.selectedParameters[0].label).toEqual('Creator:Test User'); + + done(); }); $rootScope.$digest(); - expect(tagsList.selectedParameters.length).toEqual(1); - expect(tagsList.selectedParameters[0].label).toEqual('Creator:Test User'); })); - it('create tags if creator is not known', inject(($location, $rootScope, $q, tags, desks, _userList_) => { + it('create tags if creator is not known', (done) => inject(($location, $rootScope, $q, tags, desks, _userList_) => { var userList = _userList_; $location.search('original_creator', '123'); @@ -187,36 +180,34 @@ describe('Tag Service', () => { spyOn(userList, 'getUser').and.returnValue($q.reject({})); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.selectedParameters.length).toEqual(1); + expect(tagsList.selectedParameters[0].label).toEqual('Creator:Unknown'); + + done(); }); $rootScope.$digest(); - expect(tagsList.selectedParameters.length).toEqual(1); - expect(tagsList.selectedParameters[0].label).toEqual('Creator:Unknown'); })); - it('create tags for unique name', inject(($location, $rootScope, $q, tags, desks) => { + it('create tags for unique name', (done) => inject(($location, $rootScope, $q, tags, desks) => { $location.search('unique_name', '123'); spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.selectedParameters.length).toEqual(1); + expect(tagsList.selectedParameters[0].label).toEqual('Unique Name:123'); + + done(); }); $rootScope.$digest(); - expect(tagsList.selectedParameters.length).toEqual(1); - expect(tagsList.selectedParameters[0].label).toEqual('Unique Name:123'); })); - it('create tags for ingest provider', inject(($location, $rootScope, $q, tags, desks, ingestSources) => { + it('create tags for ingest provider', (done) => inject(($location, $rootScope, $q, tags, desks, ingestSources) => { var providers = [{ name: 'Test Provider', _id: 123, @@ -226,92 +217,88 @@ describe('Tag Service', () => { spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); $location.search('ingest_provider', '123'); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.selectedParameters.length).toEqual(1); + expect(tagsList.selectedParameters[0]).toEqual( + {label: 'Provider:Test Provider', value: 'Provider:Test Provider'}, + ); + + done(); }); $rootScope.$digest(); - expect(tagsList.selectedParameters.length).toEqual(1); - expect(tagsList.selectedParameters[0]).toEqual( - {label: 'Provider:Test Provider', value: 'Provider:Test Provider'}, - ); })); - it('create tags for remove source facet', inject(($location, $rootScope, $q, tags, desks) => { + it('create tags for remove source facet', (done) => inject(($location, $rootScope, $q, tags, desks) => { spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); $location.search('notsource', '["REUTERS", "NTB"]'); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.removedFacets.notsource.length).toEqual(2); + expect(tagsList.removedFacets.notsource).toEqual([ + {label: 'Not Source', displayValue: 'REUTERS', value: 'REUTERS'}, + {label: 'Not Source', displayValue: 'NTB', value: 'NTB'}, + ]); + + done(); }); $rootScope.$digest(); - expect(tagsList.removedFacets.notsource.length).toEqual(2); - expect(tagsList.removedFacets.notsource).toEqual([ - {label: 'Not Source', displayValue: 'REUTERS', value: 'REUTERS'}, - {label: 'Not Source', displayValue: 'NTB', value: 'NTB'}, - ]); })); - it('create tags for remove desk facet', inject(($location, $rootScope, $q, tags, desks) => { + it('create tags for remove desk facet', (done) => inject(($location, $rootScope, $q, tags, desks) => { spyOn(desks, 'initialize').and.returnValue($q.when({})); $location.search('notdesk', '["123"]'); desks.deskLookup = deskList; - var tagsList = null; tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.removedFacets.notdesk.length).toEqual(1); + expect(tagsList.removedFacets.notdesk[0]).toEqual( + {label: 'Not Desk', displayValue: 'desk1', value: '123'}, + ); + + done(); }); $rootScope.$digest(); - expect(tagsList.removedFacets.notdesk.length).toEqual(1); - expect(tagsList.removedFacets.notdesk[0]).toEqual( - {label: 'Not Desk', displayValue: 'desk1', value: '123'}, - ); })); - it('create tags for remove category facet', inject(($location, $rootScope, $q, tags, desks) => { + it('create tags for remove category facet', (done) => inject(($location, $rootScope, $q, tags, desks) => { spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); $location.search('notcategory', '["International Sports", "Domestic Sports"]'); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.removedFacets.notcategory.length).toEqual(2); + expect(tagsList.removedFacets.notcategory).toEqual([ + {label: 'Not Category', displayValue: 'International Sports', value: 'International Sports'}, + {label: 'Not Category', displayValue: 'Domestic Sports', value: 'Domestic Sports'}, + ]); + + done(); }); $rootScope.$digest(); - expect(tagsList.removedFacets.notcategory.length).toEqual(2); - expect(tagsList.removedFacets.notcategory).toEqual([ - {label: 'Not Category', displayValue: 'International Sports', value: 'International Sports'}, - {label: 'Not Category', displayValue: 'Domestic Sports', value: 'Domestic Sports'}, - ]); })); - it('create tags for remove urgency facet', inject(($location, $rootScope, $q, tags, desks) => { + it('create tags for remove urgency facet', (done) => inject(($location, $rootScope, $q, tags, desks) => { spyOn(desks, 'initialize').and.returnValue($q.when({deskLookup: deskList})); $location.search('noturgency', '["1", "2"]'); - var tagsList = null; - tags.initSelectedFacets() - .then((value) => { - tagsList = value; + .then((tagsList) => { + expect(tagsList.removedFacets.noturgency.length).toEqual(2); + expect(tagsList.removedFacets.noturgency).toEqual([ + {label: 'Not Urgency', displayValue: '1', value: '1'}, + {label: 'Not Urgency', displayValue: '2', value: '2'}, + ]); + + done(); }); $rootScope.$digest(); - expect(tagsList.removedFacets.noturgency.length).toEqual(2); - expect(tagsList.removedFacets.noturgency).toEqual([ - {label: 'Not Urgency', displayValue: '1', value: '1'}, - {label: 'Not Urgency', displayValue: '2', value: '2'}, - ]); })); }); diff --git a/scripts/apps/users/import/tests/import.spec.ts b/scripts/apps/users/import/tests/import.spec.ts index fb71ed26a7..0dfaf77f2d 100644 --- a/scripts/apps/users/import/tests/import.spec.ts +++ b/scripts/apps/users/import/tests/import.spec.ts @@ -11,16 +11,18 @@ describe('user import', () => { expect(api.save).toHaveBeenCalledWith('import_profile', model); })); - it('can return an error', inject(($q, $rootScope, userImport, api) => { - var success = jasmine.createSpy('success'), - error = jasmine.createSpy('error'); + it('can return an error', (done) => inject(($q, $rootScope, userImport, api) => { + const success = jasmine.createSpy('success'); spyOn(api, 'save').and.returnValue($q.reject({status: 404, data: {_message: 'test'}})); - userImport.importUser({}).then(success, error); - $rootScope.$digest(); + userImport.importUser({}).then(success, (res) => { + expect(res).toEqual({profile_to_import: 1, message: 'test'}); + expect(success).not.toHaveBeenCalled(); + + done(); + }); - expect(success).not.toHaveBeenCalled(); - expect(error).toHaveBeenCalledWith({profile_to_import: 1, message: 'test'}); + $rootScope.$digest(); })); }); diff --git a/scripts/apps/users/tests/users.spec.ts b/scripts/apps/users/tests/users.spec.ts index 4c7f231e26..d7529995c4 100644 --- a/scripts/apps/users/tests/users.spec.ts +++ b/scripts/apps/users/tests/users.spec.ts @@ -51,15 +51,15 @@ describe('userlist service', () => { }); })); - it('can fetch users', inject((userList, $rootScope) => { - var res = null; - + it('can fetch users', (done) => inject((userList, $rootScope) => { userList.get() - .then((result) => { - res = result; + .then((res) => { + expect(res).toEqual({_items: [{_id: 1}, {_id: 2}, {_id: 3}]}); + + done(); }); + $rootScope.$digest(); - expect(res).toEqual({_items: [{_id: 1}, {_id: 2}, {_id: 3}]}); })); it('can return users from cache', inject((userList, $rootScope, api) => { @@ -74,15 +74,15 @@ describe('userlist service', () => { expect(spy).not.toHaveBeenCalled(); })); - it('can fetch single user', inject((userList, $rootScope) => { - var res = null; - + it('can fetch single user', (done) => inject((userList, $rootScope) => { userList.getUser(1) - .then((result) => { - res = result; + .then((res) => { + expect(res).toEqual({_id: 1}); + + done(); }); + $rootScope.$digest(); - expect(res).toEqual({_id: 1}); })); it('can return single user from default cacher', inject((userList, $rootScope, api) => { diff --git a/scripts/apps/workspace/content/tests/content.spec.ts b/scripts/apps/workspace/content/tests/content.spec.ts index 4882d0d3e6..9193bbbeda 100644 --- a/scripts/apps/workspace/content/tests/content.spec.ts +++ b/scripts/apps/workspace/content/tests/content.spec.ts @@ -19,107 +19,144 @@ describe('superdesk.apps.workspace.content', () => { spyOn(preferencesService, 'update').and.returnValue(true); })); - it('can create plain text items', inject((api, content, $rootScope) => { - content.createItem('text').then(done); + it('can create plain text items', (done) => inject((api, content, $rootScope) => { + content.createItem('text').then((result) => { + expect(result).toEqual(ITEM); + expect(api.save).toHaveBeenCalledWith('archive', {type: 'text', version: 0}); + + done(); + }); + $rootScope.$digest(); - expect(api.save).toHaveBeenCalledWith('archive', {type: 'text', version: 0}); - expect(done).toHaveBeenCalledWith(ITEM); })); - it('can create packages', inject((api, packages: IPackagesService, desks, session, $rootScope) => { + it('can create packages', (done) => inject((api, packages: IPackagesService, desks, session, $rootScope) => { session.identity = {_id: '1'}; desks.userDesks = {_items: []}; spyOn(desks, 'getCurrentDesk') .and .returnValue({_id: '1', name: 'sport', working_stage: '2', incoming_stage: '3'}); - packages.createEmptyPackage().then(done); + packages.createEmptyPackage().then((result) => { + expect(result).toEqual(ITEM); + + expect(api.save).toHaveBeenCalledWith( + 'archive', + { + headline: '', + slugline: '', + description_text: '', + type: 'composite', + groups: [ + { + role: 'grpRole:NEP', + refs: [{idRef: 'main', label: 'main'}], + id: 'root', + }, + { + refs: [], + id: 'main', + role: 'grpRole:main', + }, + ], + version: 0, + task: {desk: '1', stage: '2', user: '1'}, + }, + ); + + done(); + }); + $rootScope.$digest(); - expect(api.save).toHaveBeenCalledWith('archive', {headline: '', slugline: '', - description_text: '', type: 'composite', - groups: [{role: 'grpRole:NEP', refs: [{idRef: 'main', label: 'main'}], id: 'root'}, - {refs: [], id: 'main', role: 'grpRole:main'}], version: 0, - task: {desk: '1', stage: '2', user: '1'}}); - expect(done).toHaveBeenCalledWith(ITEM); })); - it('can create packages from items', inject((api, content, session, desks, $rootScope) => { + it('can create packages from items', (done) => inject((api, content, session, desks, $rootScope) => { session.identity = {_id: '1'}; spyOn(desks, 'getCurrentDesk') .and .returnValue({_id: '1', name: 'sport', working_stage: '2', incoming_stage: '3'}); - content.createPackageFromItems({data: 123}).then(done); + content.createPackageFromItems({data: 123}).then(() => { + expect(api.save).toHaveBeenCalledWith('archive', { + headline: '', slugline: '', + description_text: '', + state: 'draft', + type: 'composite', + version: 0, + task: {desk: '1', stage: '2', user: '1'}, + groups: [ + {role: 'grpRole:NEP', refs: [{idRef: 'main', label: 'main'}], id: 'root'}, + {refs: [{headline: '', residRef: undefined, location: 'archive', + slugline: '', renditions: {}, itemClass: '', type: ''}], + id: 'main', role: 'grpRole:main'}]}); + + done(); + }); + $rootScope.$digest(); - expect(api.save).toHaveBeenCalledWith('archive', { - headline: '', slugline: '', - description_text: '', - state: 'draft', - type: 'composite', - version: 0, - task: {desk: '1', stage: '2', user: '1'}, - groups: [ - {role: 'grpRole:NEP', refs: [{idRef: 'main', label: 'main'}], id: 'root'}, - {refs: [{headline: '', residRef: undefined, location: 'archive', - slugline: '', renditions: {}, itemClass: '', type: ''}], - id: 'main', role: 'grpRole:main'}]}); })); - it('can fetch content types', inject((api, content, $rootScope, $q) => { + it('can fetch content types', (done) => inject((api, content, $rootScope, $q) => { var types = [{_id: 'foo'}]; spyOn(api, 'getAll').and.returnValue($q.when(types)); - var success = jasmine.createSpy('ok'); - content.getTypes().then(success); + content.getTypes().then((result) => { + expect(result).toEqual(types); + + expect(api.getAll).toHaveBeenCalledWith('content_types', {where: {enabled: true}}, false); + + done(); + }); + $rootScope.$digest(); - expect(api.getAll).toHaveBeenCalledWith('content_types', {where: {enabled: true}}, false); - expect(success).toHaveBeenCalledWith(types); })); - it('can fetch content types and filter by desk', inject((content, $rootScope, $q) => { + it('can fetch content types and filter by desk', (done) => inject((content, $rootScope, $q) => { spyOn(content, 'getTypes').and.returnValue($q.when([ {_id: 'foo'}, {_id: 'bar'}, {_id: 'baz'}, ])); - var profiles; + content.getDeskProfiles({content_profiles: {bar: 1}}, 'baz').then((profiles) => { + expect(profiles.length).toBe(2); + expect(profiles[0]._id).toBe('bar'); + expect(profiles[1]._id).toBe('baz'); - content.getDeskProfiles({content_profiles: {bar: 1}}, 'baz').then((_profiles) => { - profiles = _profiles; + done(); }); $rootScope.$digest(); - expect(profiles.length).toBe(2); - expect(profiles[0]._id).toBe('bar'); - expect(profiles[1]._id).toBe('baz'); })); - it('can generate content types lookup dict', inject((content, $q, $rootScope) => { + it('can generate content types lookup dict', (done) => inject((content, $q, $rootScope) => { spyOn(content, 'getTypes').and.returnValue($q.when([{_id: 'foo', name: 'Foo'}, {_id: 'bar'}])); - var lookup; - content.getTypesLookup().then((_lookup) => { - lookup = _lookup; + content.getTypesLookup().then((lookup) => { + expect(lookup.foo.name).toBe('Foo'); + + done(); }); $rootScope.$digest(); - expect(lookup.foo.name).toBe('Foo'); })); - it('can get content type', inject((api, content, $rootScope, $q) => { + it('can get content type', (done) => inject((api, content, $rootScope, $q) => { var type = {_id: 'foo'}; spyOn(api, 'getAll').and.returnValue($q.when([])); spyOn(api, 'find').and.returnValue($q.when(type)); - var success = jasmine.createSpy('ok'); - content.getType('foo').then(success); + content.getType('foo').then((res) => { + expect(res).toEqual(type); + + expect(api.find).toHaveBeenCalledWith('content_types', 'foo'); + + done(); + }); $rootScope.$digest(); - expect(api.find).toHaveBeenCalledWith('content_types', 'foo'); - expect(success).toHaveBeenCalledWith(type); })); it('can filter custom fields per profile', inject((content) => { diff --git a/scripts/apps/workspace/tests/workspace.spec.ts b/scripts/apps/workspace/tests/workspace.spec.ts index 1504321550..c732fad57c 100644 --- a/scripts/apps/workspace/tests/workspace.spec.ts +++ b/scripts/apps/workspace/tests/workspace.spec.ts @@ -38,20 +38,18 @@ describe('workspace', () => { expect(ctrl.widgets[0].name).toBe('foo'); })); - it('can fetch workspaces for current user', inject((workspaces, api, session, $q, $rootScope) => { + it('can fetch workspaces for current user', (done) => inject((workspaces, api, session, $rootScope) => { spyOn(api, 'query').and.returnValue({_items: []}); session.testUser('foo'); - var items; + workspaces.queryUserWorkspaces().then((items) => { + expect(items).toEqual([]); + expect(api.query).toHaveBeenCalledWith('workspaces', {where: {user: 'foo'}}); - workspaces.queryUserWorkspaces().then((_items) => { - items = _items; + done(); }); $rootScope.$digest(); - - expect(items).toEqual([]); - expect(api.query).toHaveBeenCalledWith('workspaces', {where: {user: 'foo'}}); })); describe('active workspace', () => { diff --git a/scripts/core/activity/superdesk-service.spec.ts b/scripts/core/activity/superdesk-service.spec.ts index 67838e2a13..aa375f3e5e 100644 --- a/scripts/core/activity/superdesk-service.spec.ts +++ b/scripts/core/activity/superdesk-service.spec.ts @@ -53,55 +53,47 @@ describe('Superdesk service', () => { expect(superdesk.activities.testActivity.label).toBe(testActivity.label); })); - it('can run activities', inject(($rootScope, superdesk, activityService) => { - var result = null; - + it('can run activities', (done) => inject(($rootScope, superdesk, activityService) => { activityService.start(superdesk.activities.testActivity) - .then((res) => { - result = res; + .then((result) => { + expect(result).toBe('test'); + + done(); }); $rootScope.$digest(); - - expect(result).toBe('test'); })); - it('can run activities by intent', inject(($rootScope, superdesk) => { - var successResult = null; - var failureResult = null; - + it('can run activities by intent', (done) => inject(($rootScope, superdesk) => { superdesk.intent('testAction', 'testType', 'testData') - .then((result) => { - successResult = result; - }); - superdesk.intent('testAction2', 'testType2', 'testData2') - .then(null, (result) => { - failureResult = result; + .then((successResult) => { + expect(successResult).toBe('test'); + + superdesk.intent('testAction2', 'testType2', 'testData2') + .then(null, (failureResult) => { + expect(failureResult).toBe(undefined); + + done(); + }); }); $rootScope.$digest(); - - expect(successResult).toBe('test'); - expect(failureResult).toBe(undefined); })); - it('can run activities by intent provided with an id', inject(($rootScope, superdesk) => { - var successResult = null; - var failureResult = null; - + it('can run activities by intent provided with an id', (done) => inject(($rootScope, superdesk) => { superdesk.intent('testAction', 'testType', 'testData', 'testId') - .then((result) => { - successResult = result; - }); - superdesk.intent('testAction2', 'testType2', 'testData2', 'testId2') - .then(null, (result) => { - failureResult = result; + .then((successResult) => { + expect(successResult).toBe('test'); + + superdesk.intent('testAction2', 'testType2', 'testData2', 'testId2') + .then(null, (failureResult) => { + expect(failureResult).toBe(undefined); + + done(); + }); }); $rootScope.$digest(); - - expect(successResult).toBe('test'); - expect(failureResult).toBe(undefined); })); it('can find activities', inject((superdesk) => { diff --git a/scripts/core/api/api-service.spec.ts b/scripts/core/api/api-service.spec.ts index 57329f7562..3fbb48f5f8 100644 --- a/scripts/core/api/api-service.spec.ts +++ b/scripts/core/api/api-service.spec.ts @@ -79,7 +79,7 @@ describe('API Provider', () => { $httpBackend.verifyNoOutstandingRequest(); })); - it('can query', inject((api, urls, $q, $httpBackend, $http) => { + it('can query', (done) => inject((api, urls, $q, $httpBackend, $http) => { var headers = $http.defaults.headers.common; headers['X-Filter'] = 'User.*'; @@ -88,53 +88,46 @@ describe('API Provider', () => { $httpBackend.expectGET(USERS_URL, headers).respond(collection([{}])); - var users; + api.http.query().then((users) => { + expect(users._items.length).toBe(1); + expect(urls.resource).toHaveBeenCalledWith('users'); - api.http.query().then((_users) => { - users = _users; + done(); }); $httpBackend.flush(); - - expect(users._items.length).toBe(1); - expect(urls.resource).toHaveBeenCalledWith('users'); })); - it('rejects on query error', inject((api, urls, $q, $httpBackend) => { + it('rejects on query error', (done) => inject((api, urls, $q, $httpBackend) => { $httpBackend.expectGET(USERS_URL).respond(400); spyOn(urls, 'resource').and.returnValue($q.when(USERS_URL)); - var reject; - - api.http.query().then(null, (reason) => { - reject = true; + api.http.query().then(null, () => { + done(); }); $httpBackend.flush(); - - expect(reject).toBe(true); })); - it('can create new resource', inject((api, urls, $q, $httpBackend) => { - var userData = {username: 'test'}, - user; + it('can create new resource', (done) => inject((api, urls, $q, $httpBackend) => { + var userData = {username: 'test'}; spyOn(urls, 'resource').and.returnValue($q.when(USERS_URL)); $httpBackend.expectPOST(USERS_URL, userData).respond(201, {_links: {self: {href: 'user_href'}}}); - api.http.save({username: 'test'}).then((_user) => { - user = _user; + api.http.save({username: 'test'}).then((user) => { + expect(user._links.self.href).toBe('user_href'); + expect(urls.resource).toHaveBeenCalledWith('users'); + + done(); }); $httpBackend.flush(); - - expect(user._links.self.href).toBe('user_href'); - expect(urls.resource).toHaveBeenCalledWith('users'); })); - it('can fail creating new resource', inject((api, urls, $q, $httpBackend) => { + it('can fail creating new resource', (done) => inject((api, urls, $q, $httpBackend) => { var userData = {username: 'test'}; spyOn(urls, 'resource').and.returnValue($q.when(USERS_URL)); @@ -144,17 +137,14 @@ describe('API Provider', () => { _issues: {first_name: {required: 1}}, }); - var test = null; + const onSuccess = jasmine.createSpy('onSuccess'); - api.http.save({username: 'test'}).then((response) => { - test = true; - }, (response) => { - test = false; + api.http.save({username: 'test'}).then(onSuccess, (response) => { + expect(onSuccess).not.toHaveBeenCalled(); + done(); }); $httpBackend.flush(); - - expect(test).toBe(false); })); it('can create new with diff', inject((api, urls, $q, $httpBackend) => { @@ -173,8 +163,7 @@ describe('API Provider', () => { expect(urls.resource).toHaveBeenCalledWith('users'); })); - it('can update endpoint', inject((api, $httpBackend) => { - var user; + it('can update endpoint', (done) => inject((api, $httpBackend) => { var userData = { _links: {self: {href: USER_PATH}}, _id: 2, @@ -184,14 +173,14 @@ describe('API Provider', () => { $httpBackend.expectPATCH(USER_URL, {username: 'test', Avatar: {href: 'test'}}).respond(200); - api.http.save(userData).then((_user) => { - user = _user; + api.http.save(userData).then((user) => { + expect(user.username).toBe('test'); + expect(user._links.self.href).toBe(USER_PATH); + + done(); }); $httpBackend.flush(); - - expect(user.username).toBe('test'); - expect(user._links.self.href).toBe(USER_PATH); })); it('can update with diff', inject((api, $httpBackend) => { @@ -205,76 +194,70 @@ describe('API Provider', () => { $httpBackend.flush(); })); - it('can delete', inject((api, $httpBackend) => { - var user = {_links: {self: {href: USER_PATH}}}, - then = jasmine.createSpy('then'); + it('can delete', (done) => inject((api, $httpBackend) => { + var user = {_links: {self: {href: USER_PATH}}}; $httpBackend.expectDELETE(USER_URL).respond(204); - api.http.remove(user).then(then); + api.http.remove(user).then(() => { + done(); + }); $httpBackend.flush(); - - expect(then).toHaveBeenCalled(); })); - it('handles delete on deleted resource as success', inject((api, $httpBackend) => { - var user = {_links: {self: {href: USER_PATH}}}, - then = jasmine.createSpy('then'); + it('handles delete on deleted resource as success', (done) => inject((api, $httpBackend) => { + var user = {_links: {self: {href: USER_PATH}}}; $httpBackend.expectDELETE(USER_URL).respond(404); - api.http.remove(user).then(then); + api.http.remove(user).then(() => { + done(); + }); $httpBackend.flush(); - - expect(then).toHaveBeenCalled(); })); - it('rejects other delete errors as errors', inject((api, $httpBackend) => { + it('rejects other delete errors as errors', (done) => inject((api, $httpBackend) => { var user = {_links: {self: {href: USER_PATH}}}, - success = jasmine.createSpy('success'), - error = jasmine.createSpy('error'); + success = jasmine.createSpy('success'); $httpBackend.expectDELETE(USER_URL).respond(405); - api.http.remove(user).then(success, error); + api.http.remove(user).then(success, () => { + expect(success).not.toHaveBeenCalled(); - $httpBackend.flush(); + done(); + }); - expect(success).not.toHaveBeenCalled(); - expect(error).toHaveBeenCalled(); + $httpBackend.flush(); })); - it('can get item by url', inject((api, $httpBackend) => { - var user; - + it('can get item by url', (done) => inject((api, $httpBackend) => { $httpBackend.expectGET(USER_URL).respond({username: 'foo'}); - api.http.getByUrl(USER_PATH).then((_user) => { - user = _user; + api.http.getByUrl(USER_PATH).then((user) => { + expect(user.username).toBe('foo'); + + done(); }); $httpBackend.flush(); - - expect(user.username).toBe('foo'); })); - it('can get item by id', inject((api, urls, $q, $httpBackend) => { - var user; - + it('can get item by id', (done) => inject((api, urls, $q, $httpBackend) => { spyOn(urls, 'resource').and.returnValue($q.when(SERVER_URL + '/users')); $httpBackend.expectGET(SERVER_URL + '/users/1').respond({username: 'foo'}); - api.http.getById(1).then((_user) => { - user = _user; + api.http.getById(1).then((user) => { + expect(user.username).toBe('foo'); + expect(urls.resource).toHaveBeenCalledWith('users'); + + done(); }); $httpBackend.flush(); - - expect(user.username).toBe('foo'); - expect(urls.resource).toHaveBeenCalledWith('users'); })); it('can replace resource on given dest', inject((api, $httpBackend) => { @@ -287,33 +270,30 @@ describe('API Provider', () => { $httpBackend.flush(); })); - it('rejects non success responses', inject((api, $httpBackend) => { + it('rejects non success responses', (done) => inject((api, $httpBackend) => { $httpBackend.expectGET(USER_URL).respond(400); - var success = jasmine.createSpy('success'), - error = jasmine.createSpy('error'); + var success = jasmine.createSpy('success'); - api.http.getByUrl(USER_PATH).then(success, error); + api.http.getByUrl(USER_PATH).then(success, () => { + expect(success).not.toHaveBeenCalled(); + done(); + }); $httpBackend.flush(); - - expect(success).not.toHaveBeenCalled(); - expect(error).toHaveBeenCalled(); })); - it('can get resource url', inject((api, urls, $q, $rootScope) => { - var url; - + it('can get resource url', (done) => inject((api, urls, $q, $rootScope) => { spyOn(urls, 'resource').and.returnValue($q.when(USERS_URL)); - api.http.getUrl().then((_url) => { - url = _url; + api.http.getUrl().then((url) => { + expect(url).toBe(USERS_URL); + expect(urls.resource).toHaveBeenCalledWith('users'); + + done(); }); $rootScope.$digest(); - - expect(url).toBe(USERS_URL); - expect(urls.resource).toHaveBeenCalledWith('users'); })); it('can get resource headers', inject((api) => { @@ -367,19 +347,17 @@ describe('API Provider', () => { $httpBackend.verifyNoOutstandingExpectation(); })); - it('can query resource', inject((api, $httpBackend) => { + it('can query resource', (done) => inject((api, $httpBackend) => { $httpBackend.expectGET(USERS_URL + '?limit=1').respond(200, {_items: []}); - var users; - api('users').query({limit: 1}) - .then((_users) => { - users = _users; + .then((users) => { + expect(users._items.length).toBe(0); + + done(); }); $httpBackend.flush(); - - expect(users._items.length).toBe(0); })); it('can query subresource', inject((api, $httpBackend) => { @@ -392,35 +370,35 @@ describe('API Provider', () => { $httpBackend.flush(); })); - it('rejects on status error', inject((api, $httpBackend) => { + it('rejects on status error', (done) => inject((api, $httpBackend) => { $httpBackend.expectGET(USERS_URL).respond(400); - var success = jasmine.createSpy('success'), - error = jasmine.createSpy('error'); + var success = jasmine.createSpy('success'); api('users').query() - .then(success, error); + .then(success, () => { + expect(success).not.toHaveBeenCalled(); - $httpBackend.flush(); + done(); + }); - expect(success).not.toHaveBeenCalled(); - expect(error).toHaveBeenCalled(); + $httpBackend.flush(); })); - it('rejects on data error', inject((api, $httpBackend) => { + it('rejects on data error', (done) => inject((api, $httpBackend) => { $httpBackend.expectPOST(USERS_URL).respond(200, {_status: 'ERR'}); - var success = jasmine.createSpy('success'), - error = jasmine.createSpy('error'); + var success = jasmine.createSpy('success'); api('users') .save({}) - .then(success, error); + .then(success, () => { + expect(success).not.toHaveBeenCalled(); - $httpBackend.flush(); + done(); + }); - expect(success).not.toHaveBeenCalled(); - expect(error).toHaveBeenCalled(); + $httpBackend.flush(); })); it('cleans data before saving it', inject((api, $httpBackend) => { @@ -429,16 +407,17 @@ describe('API Provider', () => { $httpBackend.flush(); })); - it('can fetch an item by id', inject((api, $httpBackend) => { - var data = {_id: 1}, user; + it('can fetch an item by id', (done) => inject((api, $httpBackend) => { + var data = {_id: 1}; $httpBackend.expectGET(USER_URL).respond(200, data); api('users').getById(1) - .then((_user) => { - user = _user; + .then((user) => { + expect(user._id).toBe(1); + + done(); }); $httpBackend.flush(); - expect(user._id).toBe(1); })); it('can remove an item', inject((api, $httpBackend) => { diff --git a/scripts/core/api/request-service.spec.ts b/scripts/core/api/request-service.spec.ts index 17bb06e0b3..833ad695a3 100644 --- a/scripts/core/api/request-service.spec.ts +++ b/scripts/core/api/request-service.spec.ts @@ -10,20 +10,18 @@ describe('request service', () => { })); beforeEach(window.module('superdesk.core.upload')); - it('can resend $http request', inject((request, $httpBackend) => { + it('can resend $http request', (done) => inject((request, $httpBackend) => { var config = {url: 'test', method: 'GET'}; $httpBackend.expectGET('test').respond('data'); - var response; + request.resend(config).then((response) => { + expect(response.status).toBe(200); - request.resend(config).then((_response) => { - response = _response; + done(); }); $httpBackend.flush(); - - expect(response.status).toBe(200); })); it('can resend upload request', inject((request, upload) => { diff --git a/scripts/core/api/url-resolver.spec.ts b/scripts/core/api/url-resolver.spec.ts index 3fd6bc4b27..d9d28ef446 100644 --- a/scripts/core/api/url-resolver.spec.ts +++ b/scripts/core/api/url-resolver.spec.ts @@ -14,19 +14,17 @@ describe('url resolver', () => { Object.assign(appConfig, testConfig); }); - it('can resolve resource urls', inject((urls, $httpBackend, $rootScope) => { + it('can resolve resource urls', (done) => inject((urls, $httpBackend, $rootScope) => { $httpBackend.expectGET(SERVER_URL).respond(RESOURCES); - var url; + urls.resource('users').then((url) => { + expect(url).toBe(SERVER_URL + USERS_URL); - urls.resource('users').then((_url) => { - url = _url; + done(); }); $httpBackend.flush(); $rootScope.$digest(); - - expect(url).toBe(SERVER_URL + USERS_URL); })); it('can resolve item urls', inject((urls) => { diff --git a/scripts/core/auth/auth-interceptor.spec.ts b/scripts/core/auth/auth-interceptor.spec.ts index aa50ea8239..7fc0a78c1e 100644 --- a/scripts/core/auth/auth-interceptor.spec.ts +++ b/scripts/core/auth/auth-interceptor.spec.ts @@ -31,26 +31,26 @@ describe('auth interceptor', () => { })); it('should intercept 401 response and reject the request if payload has credentials 1', - inject(($injector, $q, $rootScope, session, request, AuthExpiredInterceptor) => { + (done) => inject(($q, $rootScope, session, request, AuthExpiredInterceptor) => { var interceptor = AuthExpiredInterceptor, config = {method: 'POST', url: 'http://localhost:5000/auth', headers: {}}, response = {status: 401, config: config, data: {_issues: {credentials: 1}}}; + const onSuccess = jasmine.createSpy('onSuccess'); + spyOn(session, 'expire'); spyOn(session, 'getIdentity').and.returnValue($q.when()); spyOn(request, 'resend'); - var result; + interceptor.responseError(response).then(onSuccess, (result) => { + expect(result.data._issues.credentials).toBe(1); + expect(session.expire).not.toHaveBeenCalled(); + expect(request.resend).not.toHaveBeenCalled(); + expect(onSuccess).not.toHaveBeenCalled(); - interceptor.responseError(response).then((success) => { - result = success; - }, (rejection) => { - result = rejection; + done(); }); $rootScope.$digest(); - expect(result.data._issues.credentials).toBe(1); - expect(session.expire).not.toHaveBeenCalled(); - expect(request.resend).not.toHaveBeenCalled(); })); }); diff --git a/scripts/core/auth/auth-service.spec.ts b/scripts/core/auth/auth-service.spec.ts index 7fa37a1fbb..aaff74c018 100644 --- a/scripts/core/auth/auth-service.spec.ts +++ b/scripts/core/auth/auth-service.spec.ts @@ -29,41 +29,38 @@ describe('auth service', () => { spyOn(api.users, 'getById').and.returnValue($q.when({username: 'foo'})); })); - it('can login', inject((auth, session, $httpBackend, $rootScope) => { - const success = jasmine.createSpy('authenticated'); - + it('can login', (done) => inject((auth, session, $httpBackend, $rootScope) => { $httpBackend.expectPOST('http://localhost:5000/api/auth').respond(200, {user: 'foo', token: 'bar'}); expect(session.identity).toBe(null); expect(session.token).toBe(null); - auth.login('admin', 'admin').then(success); + auth.login('admin', 'admin').then(() => { + expect(session.start).toHaveBeenCalled(); + + done(); + }); $rootScope.$apply(); $httpBackend.flush(); $rootScope.$apply(); - expect(session.start).toHaveBeenCalled(); - expect(success).toHaveBeenCalled(); $httpBackend.verifyNoOutstandingExpectation(); })); - it('checks credentials', inject((auth, $httpBackend, $rootScope) => { - var resolved = false, rejected = false; + it('checks credentials', (done) => inject((auth, $httpBackend, $rootScope) => { + const onSuccess = jasmine.createSpy('onSuccess'); $httpBackend.expectPOST('http://localhost:5000/api/auth').respond(403, {}); - auth.login('wrong', 'credentials').then(() => { - resolved = true; - }, () => { - rejected = true; + auth.login('wrong', 'credentials').then(onSuccess, () => { + expect(onSuccess).not.toHaveBeenCalled(); + + done(); }); $httpBackend.flush(); $rootScope.$apply(); - - expect(resolved).toBe(false); - expect(rejected).toBe(true); })); it('handles oauth login', inject((auth, session, $http, $rootScope) => { diff --git a/scripts/core/auth/basic-auth-adapter.spec.ts b/scripts/core/auth/basic-auth-adapter.spec.ts index 5c3fb43958..f3eec8fc84 100644 --- a/scripts/core/auth/basic-auth-adapter.spec.ts +++ b/scripts/core/auth/basic-auth-adapter.spec.ts @@ -34,42 +34,38 @@ describe('basic auth adapter', () => { $httpBackend.verifyNoOutstandingRequest(); }); - it('can login', inject((authAdapter, urls, $q) => { + it('can login', (done) => inject((authAdapter, urls, $q) => { $httpBackend .expectPOST(LOGIN_URL, {username: username, password: password}) .respond({token: session, user: '1'}); spyOn(urls, 'resource').and.returnValue($q.when(LOGIN_URL)); - var identity; + authAdapter.authenticate(username, password).then((identity) => { + expect(urls.resource).toHaveBeenCalledWith('auth_db'); + expect(identity.token).toBe('Basic ' + btoa(session + ':')); - authAdapter.authenticate(username, password).then((_identity) => { - identity = _identity; + done(); }); $httpBackend.flush(); - - expect(urls.resource).toHaveBeenCalledWith('auth_db'); - expect(identity.token).toBe('Basic ' + btoa(session + ':')); })); - it('can reject on failed auth', inject((authAdapter, urls, $q) => { - var resolved = false, rejected = false; + it('can reject on failed auth', (done) => inject((authAdapter, urls, $q) => { + const onSuccess = jasmine.createSpy('onSuccess'); + spyOn(urls, 'resource').and.returnValue($q.when(LOGIN_URL)); $httpBackend.expectPOST(LOGIN_URL).respond(400); authAdapter.authenticate(username, password) - .then(() => { - resolved = true; - }, () => { - rejected = true; + .then(onSuccess, () => { + expect(onSuccess).not.toHaveBeenCalled(); + + done(); }); $httpBackend.flush(); - - expect(resolved).toBe(false); - expect(rejected).toBe(true); })); }); diff --git a/scripts/core/auth/session-service.spec.ts b/scripts/core/auth/session-service.spec.ts index 1a236039b6..b8b5518749 100644 --- a/scripts/core/auth/session-service.spec.ts +++ b/scripts/core/auth/session-service.spec.ts @@ -33,21 +33,19 @@ describe('session service', () => { expect($rootScope.$broadcast).toHaveBeenCalledWith('logout'); })); - it('can resolve identity on start', inject((session, $rootScope) => { - var identity; - - session.getIdentity().then((_identity) => { - identity = _identity; - }); - - session.getIdentity().then((i2) => { - expect(identity).toBe(i2); + it('can resolve identity on start', (done) => inject((session, $rootScope) => { + session.getIdentity().then((identity) => { + session.getIdentity().then((i2) => { + expect(identity.name).toBe('foo'); + expect(identity).toBe(i2); + + done(); + }); }); session.start(SESSION, {name: 'foo'}); $rootScope.$apply(); - expect(identity.name).toBe('foo'); })); it('can store state for future requests', inject((session, $rootScope) => { @@ -111,19 +109,18 @@ describe('session service', () => { expect(nextSession.identity.name).toBe('baz'); })); - it('can return identity after session start', inject((session, $rootScope) => { + it('can return identity after session start', (done) => inject((session, $rootScope) => { session.start(SESSION, {name: 'bar'}); $rootScope.$digest(); - var success = jasmine.createSpy('success'); - - session.getIdentity().then(success); + session.getIdentity().then(() => { + done(); + }); $rootScope.$digest(); - expect(success).toHaveBeenCalled(); })); - it('should not resolve identity after expiry', inject((session, $rootScope) => { + it('should not resolve identity after expiry', (done) => inject((session, $rootScope) => { session.start(SESSION, {name: 'bar'}); $rootScope.$digest(); @@ -134,7 +131,12 @@ describe('session service', () => { session.getIdentity().then(success); + setTimeout(() => { + expect(success).not.toHaveBeenCalled(); + + done(); + }, 2000); + $rootScope.$digest(); - expect(success).not.toHaveBeenCalled(); })); }); diff --git a/scripts/core/beta/beta.spec.ts b/scripts/core/beta/beta.spec.ts index 8d80e4c18d..2151f5c070 100644 --- a/scripts/core/beta/beta.spec.ts +++ b/scripts/core/beta/beta.spec.ts @@ -2,7 +2,7 @@ describe('beta service', () => { beforeEach(window.module('superdesk.core.services.beta')); it('can filter out sd-beta from html when beta is off', - inject((betaService, $rootScope, $http, $httpBackend) => { + (done) => inject((betaService, $rootScope, $http, $httpBackend) => { $rootScope.beta = false; var isBeta = null; @@ -13,43 +13,56 @@ describe('beta service', () => { $rootScope.$digest(); expect(isBeta).toBe(false); - var template = '
normal
beta
', - data; + var template = '
normal
beta
'; $httpBackend.expectGET('view_off.html').respond(200, template); $http.get('view_off.html').then((response) => { - data = response.data; + expect(response.data).not.toContain('beta'); + + done(); }); $httpBackend.flush(); - - expect(data).not.toContain('beta'); })); it('keeps it there when beta is on', - inject((betaService, preferencesService, $rootScope, $http, $httpBackend, $q) => { + (done) => inject((betaService, preferencesService, $rootScope, $http, $httpBackend, $q) => { $rootScope.beta = true; spyOn(preferencesService, 'get').and.returnValue($q.when({enabled: true})); - betaService.isBeta().then((_beta) => { - expect(_beta).toBe(true); - }); + let promise = Promise.resolve(); - $rootScope.$digest(); + promise = promise.then(() => new Promise((resolve) => { + betaService.isBeta().then((_beta) => { + expect(_beta).toBe(true); - var template = '
beta
', - data; + resolve(); + }); - $httpBackend.expectGET('view_on.html').respond(200, template); + $rootScope.$digest(); + })); - $http.get('view_on.html').then((response) => { - data = response.data; - }); + promise = promise.then(() => new Promise((resolve) => { + var template = '
beta
', + data; - $httpBackend.flush(); + $httpBackend.expectGET('view_on.html').respond(200, template); + + $http.get('view_on.html').then((response) => { + data = response.data; + + expect(data).toContain('beta'); - expect(data).toContain('beta'); + resolve(); + }); + + $httpBackend.flush(); + })); + + promise = promise.then(() => { + done(); + }); })); }); diff --git a/scripts/core/directives/PermissionsDirective.ts b/scripts/core/directives/PermissionsDirective.ts deleted file mode 100644 index 4e671892f8..0000000000 --- a/scripts/core/directives/PermissionsDirective.ts +++ /dev/null @@ -1,57 +0,0 @@ -export default angular.module('superdesk.core.directives.permissions', []) - /** - * @ngdoc directive - * @module superdesk.core.directives - * @name sdPermissions - * - * @param {Object} dataModel Model to assign permission to - * @param {String} dataPermission ID of required permission. - * @param {Object} dataRole Role to check. - * @param {Object} dataUser User to check. - * - * @description Checks if user has specified permissions and assigns - * to specified model to use in displaying/hiding/disabling elements. - * - * Checking for a user: - * ```js - *
- * ``` - * - * Checking for a role: - * ```js - *
- * ``` - * - * Checking for current user (default if no user/role specified): - * ```js - *
- * ``` - */ - .directive('sdPermissions', ['permissions', 'permissionsService', function(permissions, permissionsService) { - return { - scope: { - model: '=', - permission: '@', - role: '=', - user: '=', - }, - link: function(scope, element, attrs) { - scope.model = false; - if (permissions[scope.permission]) { - var requiredPermissions = permissions[scope.permission].permissions; - - if (scope.role) { - scope.model = permissionsService.isRoleAllowed(requiredPermissions, scope.role); - } else if (scope.user) { - permissionsService.isUserAllowed(requiredPermissions, scope.user).then((result) => { - scope.model = result; - }); - } else { - permissionsService.isUserAllowed(requiredPermissions).then((result) => { - scope.model = result; - }); - } - } - }, - }; - }]); diff --git a/scripts/core/directives/index.ts b/scripts/core/directives/index.ts index 3bdfdbec7f..6e55b10ea0 100644 --- a/scripts/core/directives/index.ts +++ b/scripts/core/directives/index.ts @@ -7,7 +7,6 @@ import './CheckAllDirective'; import './SwitchInvertedDirective'; import './SelectDirective'; import './SelectPopupDirective'; -import './PermissionsDirective'; import './SortableDirective'; import './DroppableDirective'; import './DraggableDirective'; @@ -40,7 +39,6 @@ export default angular 'superdesk.core.directives.switchInverted', 'superdesk.core.directives.select', 'superdesk.core.directives.selectPopup', - 'superdesk.core.directives.permissions', 'superdesk.core.directives.sortable', 'superdesk.core.directives.draggable', 'superdesk.core.directives.droppable', diff --git a/scripts/core/notification/tests/notification.spec.ts b/scripts/core/notification/tests/notification.spec.ts index 8f25b5a584..d0c0281925 100644 --- a/scripts/core/notification/tests/notification.spec.ts +++ b/scripts/core/notification/tests/notification.spec.ts @@ -15,8 +15,8 @@ describe('Reload Service', () => { var rootScope, reloadService, msg; - beforeEach(() => { - inject(($rootScope, _reloadService_, session, $q, api, preferencesService, desks, $window) => { + beforeEach((done) => { + inject(($rootScope, _reloadService_, session, $q, preferencesService, desks) => { rootScope = $rootScope; reloadService = _reloadService_; session.start({}, USER); @@ -31,12 +31,14 @@ describe('Reload Service', () => { desks.fetchCurrentUserDesks().then((_userDesks) => { reloadService.userDesks = _userDesks; + + // eslint-disable-next-line jasmine/no-expect-in-setup-teardown + expect(reloadService.userDesks.length).toBe(2); + + done(); }); rootScope.$apply(); - - // eslint-disable-next-line jasmine/no-expect-in-setup-teardown - expect(reloadService.userDesks.length).toBe(2); }); }); diff --git a/scripts/core/services/data.spec.ts b/scripts/core/services/data.spec.ts index 0fa8bd1c89..1fac6e8ad0 100644 --- a/scripts/core/services/data.spec.ts +++ b/scripts/core/services/data.spec.ts @@ -23,21 +23,21 @@ describe('DataService', () => { httpBackend = $injector.get('$httpBackend'); })); - it('cat query resource', () => { - var data = new DataAdapter('users'), - users = {_items: [{_id: 'foo'}]}, - promise = data.query({max_results: 99}); + it('cat query resource', (done) => { + const data = new DataAdapter('users'); + const users = {_items: [{_id: 'foo'}]}; httpBackend .expectGET('http://localhost/users?max_results=99') .respond(200, users); - promise.then((result) => { + data.query({max_results: 99}).then((result) => { expect(result).toEqual(users); + expect(data._items.length).toBe(1); + + done(); }); httpBackend.flush(); - - expect(data._items.length).toBe(1); }); }); diff --git a/scripts/core/services/index.ts b/scripts/core/services/index.ts index 8b22303ecb..6f8cce857c 100644 --- a/scripts/core/services/index.ts +++ b/scripts/core/services/index.ts @@ -7,7 +7,6 @@ */ import './translate'; import './preferencesService'; -import './permissionsService'; import './data'; import './entity'; import './server'; @@ -28,7 +27,6 @@ angular.module('superdesk.core.services', [ 'superdesk.core.services.dragdrop', 'superdesk.core.services.server', 'superdesk.core.services.entity', - 'superdesk.core.services.permissions', 'superdesk.core.services.storage', 'superdesk.core.services.pageTitle', ]) diff --git a/scripts/core/services/permissions.spec.ts b/scripts/core/services/permissions.spec.ts deleted file mode 100644 index 3dcfb3c28f..0000000000 --- a/scripts/core/services/permissions.spec.ts +++ /dev/null @@ -1,121 +0,0 @@ -import {ISuperdeskGlobalConfig} from 'superdesk-api'; -import {appConfig} from 'appConfig'; - -describe('PermissionsService', () => { - beforeEach(window.module('superdesk.core.services.entity')); - beforeEach(window.module('superdesk.core.services.server')); - beforeEach(window.module('superdesk.core.services.permissions')); - - beforeEach(() => { - const testConfig: Partial = {server: {url: 'http://localhost', ws: undefined}}; - - Object.assign(appConfig, testConfig); - }); - - var rootScope, httpBackend, permissionsService; - - var testPermissions = { - testResource_1: {read: true}, - testResource_2: {write: true}, - testResource_3: {read: true, write: true}, - }; - - beforeEach(() => { - inject(($rootScope, $httpBackend, _em_, _permissionsService_) => { - rootScope = $rootScope; - httpBackend = $httpBackend; - permissionsService = _permissionsService_; - }); - }); - - it('can succeed checking role', () => { - permissionsService.isRoleAllowed(testPermissions, { - permissions: testPermissions, - }).then((result) => { - expect(result).toBe(true); - }); - }); - - it('can fail checking role', () => { - permissionsService.isRoleAllowed(testPermissions, { - permissions: { - testResource_1: {read: true}, - testResource_3: {write: true}, - }, - }).then((result) => { - expect(result).toBe(false); - }); - }); - - it('can succeed checking user', () => { - var result = false; - - httpBackend - .expectGET('http://localhost/user_roles/testRoleId') - .respond(200, {permissions: testPermissions}); - - permissionsService.isUserAllowed(testPermissions, { - role: 'testRoleId', - }).then((isAllowed) => { - result = isAllowed; - }); - - httpBackend.flush(); - - expect(result).toBe(true); - }); - - it('can fail checking user', () => { - var result = false; - - httpBackend - .expectGET('http://localhost/user_roles/testRoleId') - .respond(200, {permissions: {testResource_1: {read: true}}}); - - permissionsService.isUserAllowed(testPermissions, { - role: 'testRoleId', - }).then((isAllowed) => { - result = isAllowed; - }); - - httpBackend.flush(); - - expect(result).toBe(false); - }); - - it('can succeed checking current user', () => { - var result = false; - - rootScope.currentUser = {role: 'testRoleId'}; - - httpBackend - .expectGET('http://localhost/user_roles/testRoleId') - .respond(200, {permissions: testPermissions}); - - permissionsService.isUserAllowed(testPermissions, false).then((isAllowed) => { - result = isAllowed; - }); - - httpBackend.flush(); - - expect(result).toBe(true); - }); - - it('can fail checking current user', () => { - var result = false; - - rootScope.currentUser = {role: 'testRoleId'}; - - httpBackend - .expectGET('http://localhost/user_roles/testRoleId') - .respond(200, {permissions: {testResource_1: {read: true}}}); - - permissionsService.isUserAllowed(testPermissions, false).then((isAllowed) => { - result = isAllowed; - }); - - httpBackend.flush(); - - expect(result).toBe(false); - }); -}); diff --git a/scripts/core/services/permissionsService.ts b/scripts/core/services/permissionsService.ts deleted file mode 100644 index e1fa4c75fe..0000000000 --- a/scripts/core/services/permissionsService.ts +++ /dev/null @@ -1,106 +0,0 @@ -import _ from 'lodash'; - -/** - * @ngdoc service - * @module superdesk.core.services - * @name permissionsService - * - * @description - * #### Permissions service - * - * Permissions service checks if a given user or role is able to perform given actions. - * - * Usage: - * - * Checking user/permissions: - * - * ```js - * permissionsService.isUserAllowed(permissions, user); - * ``` - * - * Params: - * - * {Object} permissions - permissions object in {resource: {action: true/false, ...}, ...} - * format. - * - * {Object} user - user object as returned from server. - * - * If no user is given, current logged in user will be assumed. - * - * Checking role/permissions: - * - * ```js - * permissionsService.isRoleAllowed(permissions, role); - * ``` - * - * {Object} permissions - permissions object in {resource: {action: true/false, ...}, ...} - * format. - * - * {Object} role - role object as returned from server. - */ -export default angular.module('superdesk.core.services.permissions', []) - .service('permissionsService', ['$q', '$rootScope', 'em', function($q, $rootScope, em) { - this.isUserAllowed = function(permissions, user) { - var self = this; - var delay = $q.defer(); - var usr = user || $rootScope.currentUser; - - if (usr.role) { - if (typeof usr.role === 'string') { - em.repository('user_roles') - .find(usr.role) - .then((role) => { - delay.resolve(self.isRoleAllowed(permissions, role)); - }); - } else { - delay.resolve(this.isRoleAllowed(permissions, usr.role)); - } - } else { - delay.resolve(false); - } - - return delay.promise; - }; - - this._isRoleAllowedSingle = function(resource, method, role) { - var self = this; - - var delay = $q.defer(); - - if (role.permissions && role.permissions[resource] && role.permissions[resource][method]) { - delay.resolve(true); - } else if (role.extends) { - em.repository('user_roles') - .find(role.extends) - .then((extendedFrom) => { - delay.resolve(self._isRoleAllowedSingle(resource, method, extendedFrom)); - }); - } - - return delay.promise; - }; - - this.isRoleAllowed = function(permissions, role) { - var self = this; - - var delay = $q.defer(); - - var promises = []; - - _.forEach(permissions, (methods, resource) => { - _.forEach(methods, (status, method) => { - promises.push(self._isRoleAllowedSingle(resource, method, role)); - }); - }); - - $q.all(promises).then((results) => { - if (results.indexOf(false) === -1) { - delay.resolve(true); - } else { - delay.resolve(false); - } - }); - - return delay.promise; - }; - }]); diff --git a/scripts/core/services/preferences.spec.ts b/scripts/core/services/preferences.spec.ts index c60c735823..26596c5964 100644 --- a/scripts/core/services/preferences.spec.ts +++ b/scripts/core/services/preferences.spec.ts @@ -51,7 +51,7 @@ describe('Preferences Service', () => { }, }; - beforeEach(inject((api, $q) => { + beforeEach(inject(($injector, $q, session, api) => { spyOn(api, 'find').and.callFake((resource, id, params, cache) => { if (cache) { return $q.when(testPreferences); @@ -60,57 +60,52 @@ describe('Preferences Service', () => { return $q.when(testUncachedPreferences); }); spyOn(api, 'save').and.returnValue($q.when({user_preferences: update})); - })); - beforeEach(inject(($injector, $q, session) => { preferencesService = $injector.get('preferencesService'); spyOn(session, 'getIdentity').and.returnValue($q.when({sessionId: 1})); session.sessionId = 1; })); - it('can get user preferences', inject((api, $rootScope) => { + it('can get user preferences', (done) => inject((api, $rootScope) => { preferencesService.get(); $rootScope.$digest(); - var preferences; + preferencesService.get().then((preferences) => { + expect(preferences).not.toBe(null); + expect(preferences['archive:view'].view).toBe('mgrid'); + expect(api.find).toHaveBeenCalledWith('preferences', 1, null, true); - preferencesService.get().then((_preferences) => { - preferences = _preferences; + done(); }); $rootScope.$digest(); - - expect(preferences).not.toBe(null); - expect(preferences['archive:view'].view).toBe('mgrid'); - expect(api.find).toHaveBeenCalledWith('preferences', 1, null, true); })); - it('can get user preferences by key', inject((api, $rootScope) => { + it('can get user preferences by key', (done) => inject(($rootScope) => { preferencesService.get(); $rootScope.$digest(); - var preferences; - preferencesService.get('archive:view').then((_preferences) => { - preferences = _preferences; + preferencesService.get('archive:view').then((preferences) => { + expect(preferences.view).toBe('mgrid'); + + done(); }); $rootScope.$digest(); - expect(preferences.view).toBe('mgrid'); })); - it('can get user preferences by key bypass the cache', inject((api, $rootScope) => { - var preferences; + it('can get user preferences by key bypass the cache', (done) => inject(($rootScope) => { + preferencesService.get('feature:preview', true).then((preferences) => { + expect(preferences.enabled).toBe(false); - preferencesService.get('feature:preview', true).then((_preferences) => { - preferences = _preferences; + done(); }); $rootScope.$digest(); - expect(preferences.enabled).toBe(false); })); - it('update user preferences by key', inject((api, $q, $rootScope) => { + it('update user preferences by key', (done) => inject((api, $rootScope) => { preferencesService.get(); $rootScope.$digest(); @@ -119,28 +114,26 @@ describe('Preferences Service', () => { $rootScope.$digest(); expect(api.save.calls.count()).toBe(1); - var preferences; + preferencesService.get('feature:preview').then((preferences) => { + expect(preferences.enabled).toBe(false); - preferencesService.get('feature:preview').then((_preferences) => { - preferences = _preferences; + done(); }); $rootScope.$digest(); - expect(preferences.enabled).toBe(false); })); - it('can get all active privileges', inject((api, $rootScope) => { + it('can get all active privileges', (done) => inject(($rootScope) => { preferencesService.get(); $rootScope.$digest(); - var privileges; + preferencesService.getPrivileges().then((privileges) => { + expect(privileges.privilege1).toBe(1); - preferencesService.getPrivileges().then((_privileges) => { - privileges = _privileges; + done(); }); $rootScope.$digest(); - expect(privileges.privilege1).toBe(1); })); }); @@ -156,15 +149,16 @@ describe('preferences error handling', () => { $httpBackend.expectGET('/preferences/sess2').respond({}); })); - it('can reload on session expiry', inject((preferencesService, session, $rootScope, $httpBackend) => { - var success = jasmine.createSpy('success'); + it('can reload on session expiry', (done) => inject((preferencesService, session, $rootScope, $httpBackend) => { var error = jasmine.createSpy('error'); - preferencesService.get().then(success, error); + preferencesService.get().then(() => { + expect(error).not.toHaveBeenCalled(); + + done(); + }, error); $rootScope.$digest(); session.sessionId = 'sess2'; $httpBackend.flush(); - expect(success).toHaveBeenCalled(); - expect(error).not.toHaveBeenCalled(); })); }); diff --git a/scripts/core/spellcheck/spellcheck.spec.ts b/scripts/core/spellcheck/spellcheck.spec.ts index caeec2c0e7..d6e5dd266d 100644 --- a/scripts/core/spellcheck/spellcheck.spec.ts +++ b/scripts/core/spellcheck/spellcheck.spec.ts @@ -50,140 +50,224 @@ describe('spellcheck', () => { })); it('can spellcheck using multiple dictionaries', - inject((spellcheck, dictionaries, $q, $rootScope) => { + (done) => inject((spellcheck, dictionaries, $rootScope) => { var p = createParagraph('test what if foo bar baz'); - spellcheck.errors(p).then(assignErrors); + spellcheck.errors(p).then((errors) => { + assignErrors(errors); + + expect(errors).toContain({word: 'test', index: 0, sentenceWord: true}); + expect(errors).toContain({word: 'if', index: 10, sentenceWord: false}); + expect(dictionaries.getActive).toHaveBeenCalledWith(LANG, 'en'); + + done(); + }); + $rootScope.$digest(); - expect(errors).toContain({word: 'test', index: 0, sentenceWord: true}); - expect(errors).toContain({word: 'if', index: 10, sentenceWord: false}); - expect(dictionaries.getActive).toHaveBeenCalledWith(LANG, 'en'); })); it('can spellcheck using base dictionary', - inject((spellcheck, dictionaries, $q, $rootScope) => { + (done) => inject((spellcheck, dictionaries, $q, $rootScope) => { spellcheck.setLanguage('en'); var p = createParagraph('test what if foo bar baz'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); + spellcheck.errors(p).then((errors) => { + assignErrors(errors); - expect(errors).toContain({word: 'test', index: 0, sentenceWord: true}); - expect(errors).toContain({word: 'if', index: 10, sentenceWord: false}); - expect(dictionaries.getActive).toHaveBeenCalledWith('en', null); + expect(errors).toContain({word: 'test', index: 0, sentenceWord: true}); + expect(errors).toContain({word: 'if', index: 10, sentenceWord: false}); + expect(dictionaries.getActive).toHaveBeenCalledWith('en', null); + + done(); + }); + + $rootScope.$digest(); })); - it('can add words to user dictionary', inject((spellcheck, api, $rootScope) => { + it('can add words to user dictionary', (done) => inject((spellcheck, api, $rootScope) => { var p = createParagraph('Test'); spyOn(api, 'save'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(1); - spellcheck.addWordToUserDictionary('test'); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); + expect(errors.length).toBe(1); + + spellcheck.addWordToUserDictionary('test'); + + spellcheck.errors(p).then((_err2) => { + assignErrors(_err2); + expect(errors.length).toBe(0); + + done(); + }); + }); - expect(errors.length).toBe(0); + $rootScope.$digest(); })); - it('can report error if paragraph starts with small letter', inject((spellcheck, api, $rootScope) => { + it('can report error if paragraph starts with small letter', (done) => inject((spellcheck, $rootScope) => { // Test with existing words in dictionary var p = createParagraph('Foo what'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(0); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(0); + + // now test if existing word starts with small letter. + p = createParagraph('foo what'); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + + expect(errors.length).toBe(1); + expect(errors).toContain({word: 'foo', index: 0, sentenceWord: true}); - // now test if existing word starts with small letter. - p = createParagraph('foo what'); + done(); + }); + }); - spellcheck.errors(p).then(assignErrors); $rootScope.$digest(); - expect(errors.length).toBe(1); - expect(errors).toContain({word: 'foo', index: 0, sentenceWord: true}); })); it('can report error if word comes after .|?|!|: (i.e, after : or at new sentence) starts with small letter', - inject((spellcheck, api, $rootScope) => { - // Test with existing words in dictionary + (done) => inject((spellcheck, $rootScope) => { + // Test with existing words in dictionary var p = createParagraph('Foo what? Foo is foo. Foo is foo! What foo: Foo?'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(0); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(0); - // now test if existing word comes after .|?|!|: starts with small letter. - p = createParagraph('Foo what? foo is foo. foo is foo! what foo: foo?'); + // now test if existing word comes after .|?|!|: starts with small letter. + p = createParagraph('Foo what? foo is foo. foo is foo! what foo: foo?'); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + + expect(errors.length).toBe(4); + + done(); + }); + }); - spellcheck.errors(p).then(assignErrors); $rootScope.$digest(); - expect(errors.length).toBe(4); })); - it('can report if text contains multiple spaces', inject((spellcheck, api, $rootScope) => { + it('can report if text contains multiple spaces', (done) => inject((spellcheck, $rootScope) => { // Test with existing words in dictionary var p = createParagraph('Foo what? Foo is foo.'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(0); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(0); + + // now test if existing word comes after .|?|!|: starts with small letter. + p = createParagraph('Foo what? Foo is foo.'); - // now test if existing word comes after .|?|!|: starts with small letter. - p = createParagraph('Foo what? Foo is foo.'); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + + expect(errors.length).toBe(2); + + done(); + }); + }); - spellcheck.errors(p).then(assignErrors); $rootScope.$digest(); - expect(errors.length).toBe(2); })); it('can report error for sentences beginning with any quotes and starts with small letter', - inject((spellcheck, api, $rootScope) => { - // Test with existing words in dictionary. - var p = createParagraph('"Foo what."'); + (done) => inject((spellcheck, $rootScope) => { + let promises = Promise.resolve(); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(0); + promises = promises.then(() => new Promise((resolve) => { + // Test with existing words in dictionary. + var p = createParagraph('"Foo what."'); - // now test if existing word starts with small letter within quotes. - p = createParagraph('"foo what."'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(1); - expect(errors).toContain({word: 'foo', index: 1, sentenceWord: true}); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); - // now test if different variety of quote (“ ” or ' ') is used at beginning. - p = createParagraph('“foo what.”'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(1); - expect(errors).toContain({word: 'foo', index: 1, sentenceWord: true}); + expect(errors.length).toBe(0); - p = createParagraph('\'foo what.\''); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(1); - expect(errors).toContain({word: 'foo', index: 1, sentenceWord: true}); + resolve(); + }); + + $rootScope.$digest(); + })); + + promises = promises.then(() => new Promise((resolve) => { + // now test if existing word starts with small letter within quotes. + const p = createParagraph('"foo what."'); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(1); + expect(errors).toContain({word: 'foo', index: 1, sentenceWord: true}); + + resolve(); + }); + + $rootScope.$digest(); + })); + + promises = promises.then(() => new Promise((resolve) => { + // now test if different variety of quote (“ ” or ' ') is used at beginning. + const p = createParagraph('“foo what.”'); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + + expect(errors.length).toBe(1); + expect(errors).toContain({word: 'foo', index: 1, sentenceWord: true}); + + resolve(); + }); + + $rootScope.$digest(); + })); + + promises = promises.then(() => new Promise((resolve) => { + const p = createParagraph('\'foo what.\''); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + + expect(errors.length).toBe(1); + expect(errors).toContain({word: 'foo', index: 1, sentenceWord: true}); + + resolve(); + }); + + $rootScope.$digest(); + })); + + promises = promises.then(() => { + done(); + }); })); it('can avoid reporting error if a valid word is in middle of sentence and starts with capital letter', - inject((spellcheck, api, $rootScope) => { + (done) => inject((spellcheck, $rootScope) => { // Test with existing words in dictionary var p = createParagraph('Foo what, Foo is foo.'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(0); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(0); - // now test if valid word, e.g. 'what' in middle of sentence starts with capital letter, i.e. 'What'. - p = createParagraph('Foo What, Foo is foo.'); + // now test if valid word, e.g. 'what' in middle of sentence starts with capital letter, i.e. 'What'. + p = createParagraph('Foo What, Foo is foo.'); - spellcheck.errors(p).then(assignErrors); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(0); + + done(); + }); + }); $rootScope.$digest(); - expect(errors.length).toBe(0); })); it('can suggest', inject((spellcheck, api, $q) => { @@ -192,56 +276,103 @@ describe('spellcheck', () => { expect(api.save).toHaveBeenCalledWith('spellcheck', {word: 'test', language_id: LANG}); })); - it('can reset dict when language is set to null', inject((spellcheck, $rootScope) => { + it('can reset dict when language is set to null', (done) => inject((spellcheck, $rootScope) => { spellcheck.setLanguage(null); var then = jasmine.createSpy('then'); spellcheck.errors('test').then(then); + $rootScope.$digest(); - expect(then).not.toHaveBeenCalled(); + + setTimeout(() => { + expect(then).not.toHaveBeenCalled(); + + done(); + }, 2000); })); - it('can ignore word', inject((spellcheck, $rootScope, $location) => { + it('can ignore word', (done) => inject((spellcheck, $rootScope, $location) => { $location.search('item', 'foo'); - var p = createParagraph('ignore errors'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(2); + const p = createParagraph('ignore errors'); - spellcheck.ignoreWord('ignore'); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(1); + let promises = Promise.resolve(); - $location.search('item', 'bar'); - $rootScope.$digest(); + promises = promises.then(() => new Promise((resolve) => { + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(2); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(2); + resolve(); + }); - $location.search('item', 'foo'); - $rootScope.$digest(); + $rootScope.$digest(); + })); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(1); + promises = promises.then(() => new Promise((resolve) => { + spellcheck.ignoreWord('ignore'); - $rootScope.$broadcast('item:unlock', {item: 'foo'}); - spellcheck.errors(p).then(assignErrors); - $rootScope.$digest(); - expect(errors.length).toBe(2); - })); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(1); + + resolve(); + }); + + $rootScope.$digest(); + })); + + promises = promises.then(() => new Promise((resolve) => { + $location.search('item', 'bar'); + $rootScope.$digest(); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(2); + + resolve(); + }); + + $rootScope.$digest(); + })); - it('can resolve abbreviations without language specified', inject((spellcheck, $rootScope) => { - var spy = jasmine.createSpy('success'); + promises = promises.then(() => new Promise((resolve) => { + $location.search('item', 'foo'); + $rootScope.$digest(); + + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(1); + + resolve(); + }); + + $rootScope.$digest(); + })); + + promises = promises.then(() => new Promise((resolve) => { + $rootScope.$broadcast('item:unlock', {item: 'foo'}); + spellcheck.errors(p).then((_err) => { + assignErrors(_err); + expect(errors.length).toBe(2); + + resolve(); + }); + $rootScope.$digest(); + })); + + promises = promises.then(() => { + done(); + }); + })); + it('can resolve abbreviations without language specified', (done) => inject((spellcheck, $rootScope) => { spellcheck.setLanguage(''); - spellcheck.getAbbreviationsDict().then(spy); + spellcheck.getAbbreviationsDict().then(() => { + done(); + }); $rootScope.$digest(); - expect(spy).toHaveBeenCalled(); })); it('can cache active dictionaries for a language', inject((spellcheck, dictionaries, $rootScope) => { diff --git a/scripts/core/tests/config.spec.ts b/scripts/core/tests/config.spec.ts index d42e5ff6a5..2ffce768ae 100644 --- a/scripts/core/tests/config.spec.ts +++ b/scripts/core/tests/config.spec.ts @@ -1,22 +1,46 @@ +import {appConfig} from 'appConfig'; +import {ISuperdeskGlobalConfig} from 'superdesk-api'; + +const SERVER_URL = 'http://localhost/api'; describe('superdesk.config', () => { angular.module('test.config', ['superdesk.config']); + let prevConfig; + beforeEach(window.module('test.config')); + + beforeEach(() => { + prevConfig = appConfig.server; + + const testConfig: Partial = { + server: {url: SERVER_URL, ws: undefined}, + }; + + Object.assign(appConfig, testConfig); + }); + + afterEach(() => { + appConfig.server = prevConfig; + }); + describe('deployConfig service', () => { - it('can provide config', inject((deployConfig, $rootScope) => { - const getSpy = jasmine.createSpy('get'); - const allSpy = jasmine.createSpy('all'); + it('can provide config', (done) => inject((deployConfig, $rootScope, $httpBackend) => { + $httpBackend.expectGET(SERVER_URL).respond({}); deployConfig.config = {foo: 1, bar: 2, baz: 'x'}; - deployConfig.get('foo').then(getSpy); - deployConfig.all({x: 'foo', y: 'baz'}).then(allSpy); + deployConfig.get('foo').then((result1) => { + expect(result1).toEqual(1); - $rootScope.$digest(); + deployConfig.all({x: 'foo', y: 'baz'}).then((result2) => { + expect(result2).toEqual({x: 1, y: 'x'}); + + done(); + }); + }); - expect(getSpy).toHaveBeenCalledWith(1); - expect(allSpy).toHaveBeenCalledWith({x: 1, y: 'x'}); + $rootScope.$digest(); })); }); }); diff --git a/tasks/options/karma.js b/tasks/options/karma.js index d1789655d6..ac532c37b4 100644 --- a/tasks/options/karma.js +++ b/tasks/options/karma.js @@ -11,7 +11,7 @@ module.exports = { watch: { singleRun: false, autoWatch: true, - reporters: 'progress', + reporters: ['progress'], }, unit: { coverageReporter: {