From fb8f28f17d1047986e3ace7331e3f32111b7c46a Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Thu, 1 Jul 2021 22:37:07 +0200 Subject: [PATCH] 79768: Update & add MetadataService unit tests --- .../core/metadata/metadata.service.spec.ts | 50 ++++++++++++++++--- src/app/core/metadata/metadata.service.ts | 16 +++--- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/app/core/metadata/metadata.service.spec.ts b/src/app/core/metadata/metadata.service.spec.ts index d18897cc55..f946120cd2 100644 --- a/src/app/core/metadata/metadata.service.spec.ts +++ b/src/app/core/metadata/metadata.service.spec.ts @@ -1,6 +1,6 @@ import { fakeAsync, tick } from '@angular/core/testing'; import { Meta, Title } from '@angular/platform-browser'; -import { Router, NavigationEnd } from '@angular/router'; +import { NavigationEnd, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { Observable, of } from 'rxjs'; @@ -8,11 +8,8 @@ import { Observable, of } from 'rxjs'; import { RemoteData } from '../data/remote-data'; import { Item } from '../shared/item.model'; -import { ItemMock, MockBitstream1, MockBitstream3, } from '../../shared/mocks/item.mock'; -import { - createSuccessfulRemoteDataObject$, - createSuccessfulRemoteDataObject -} from '../../shared/remote-data.utils'; +import { ItemMock, MockBitstream1, MockBitstream3 } from '../../shared/mocks/item.mock'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { PaginatedList } from '../data/paginated-list.model'; import { Bitstream } from '../shared/bitstream.model'; import { MetadataValue } from '../shared/metadata.models'; @@ -24,6 +21,11 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { getMockTranslateService } from '../../shared/mocks/translate.service.mock'; import { DSONameService } from '../breadcrumbs/dso-name.service'; import { HardRedirectService } from '../services/hard-redirect.service'; +import { getMockStore, MockStore } from '@ngrx/store/testing'; +import { CoreState } from '../core.reducers'; +import { MetaTagState } from './meta-tag.reducer'; +import { AddMetaTagAction, ClearMetaTagAction } from './meta-tag.actions'; +import { Community } from '../shared/community.model'; describe('MetadataService', () => { let metadataService: MetadataService; @@ -41,6 +43,10 @@ describe('MetadataService', () => { let hardRedirectService: HardRedirectService; let router: Router; + let store; + + const initialState = { 'core': { metaTag: { tagsInUse: ['title', 'description'] }}}; + beforeEach(() => { rootService = jasmine.createSpyObj({ @@ -53,7 +59,7 @@ describe('MetadataService', () => { findByItemAndName: mockBundleRD$([MockBitstream3]) }); translateService = getMockTranslateService(); - meta = jasmine.createSpyObj({ + meta = jasmine.createSpyObj('meta', { addTag: {}, removeTag: {} }); @@ -73,6 +79,11 @@ describe('MetadataService', () => { hardRedirectService = jasmine.createSpyObj( { getRequestOrigin: 'https://request.org', }); + + //@ts-ignore + store = getMockStore({ initialState }); + spyOn(store, 'dispatch'); + metadataService = new MetadataService( router, translateService, @@ -83,6 +94,7 @@ describe('MetadataService', () => { bitstreamDataService, undefined, rootService, + store, hardRedirectService ); }); @@ -332,6 +344,30 @@ describe('MetadataService', () => { }); }); + describe('tagstore', () => { + beforeEach(fakeAsync(() => { + (metadataService as any).processRouteChange({ + data: { + value: { + dso: createSuccessfulRemoteDataObject(ItemMock), + } + } + }); + tick(); + })); + + it('should remove previous tags on route change', fakeAsync(() => { + expect(meta.removeTag).toHaveBeenCalledWith('property=\'title\''); + expect(meta.removeTag).toHaveBeenCalledWith('property=\'description\''); + })); + + it('should clear all tags and add new ones on route change', () => { + expect(store.dispatch.calls.argsFor(0)).toEqual([new ClearMetaTagAction()]); + expect(store.dispatch.calls.argsFor(1)).toEqual([new AddMetaTagAction('title')]); + expect(store.dispatch.calls.argsFor(2)).toEqual([new AddMetaTagAction('description')]); + }); + }); + const mockType = (mockItem: Item, type: string): Item => { const typedMockItem = Object.assign(new Item(), mockItem) as Item; typedMockItem.metadata['dc.type'] = [{ value: type }] as MetadataValue[]; diff --git a/src/app/core/metadata/metadata.service.ts b/src/app/core/metadata/metadata.service.ts index 8c1e1027dd..f42747fbc5 100644 --- a/src/app/core/metadata/metadata.service.ts +++ b/src/app/core/metadata/metadata.service.ts @@ -5,10 +5,10 @@ import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, combineLatest, Observable, of as observableOf, EMPTY } from 'rxjs'; -import { filter, map, take, switchMap, expand } from 'rxjs/operators'; +import { BehaviorSubject, combineLatest, EMPTY, Observable, of as observableOf } from 'rxjs'; +import { expand, filter, map, switchMap, take } from 'rxjs/operators'; -import { hasValue, hasNoValue } from '../../shared/empty.util'; +import { hasNoValue, hasValue } from '../../shared/empty.util'; import { DSONameService } from '../breadcrumbs/dso-name.service'; import { BitstreamDataService } from '../data/bitstream-data.service'; import { BitstreamFormatDataService } from '../data/bitstream-format-data.service'; @@ -18,10 +18,7 @@ import { BitstreamFormat } from '../shared/bitstream-format.model'; import { Bitstream } from '../shared/bitstream.model'; import { DSpaceObject } from '../shared/dspace-object.model'; import { Item } from '../shared/item.model'; -import { - getFirstSucceededRemoteDataPayload, - getFirstCompletedRemoteData -} from '../shared/operators'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../shared/operators'; import { RootDataService } from '../data/root-data.service'; import { getBitstreamDownloadRoute } from '../../app-routing-paths'; import { BundleDataService } from '../data/bundle-data.service'; @@ -31,11 +28,10 @@ import { PaginatedList } from '../data/paginated-list.model'; import { URLCombiner } from '../url-combiner/url-combiner'; import { HardRedirectService } from '../services/hard-redirect.service'; import { MetaTagState } from './meta-tag.reducer'; -import { Store, createSelector, select, MemoizedSelector } from '@ngrx/store'; +import { createSelector, select, Store } from '@ngrx/store'; import { AddMetaTagAction, ClearMetaTagAction } from './meta-tag.actions'; import { coreSelector } from '../core.selectors'; import { CoreState } from '../core.reducers'; -import { ObjectCacheEntry, ObjectCacheState } from '../cache/object-cache.reducer'; /** * The base selector function to select the metaTag section in the store @@ -84,7 +80,7 @@ export class MetadataService { private bitstreamDataService: BitstreamDataService, private bitstreamFormatDataService: BitstreamFormatDataService, private rootService: RootDataService, - private store: Store, + private store: Store, private hardRedirectService: HardRedirectService, ) { }