79768: Update & add MetadataService unit tests

This commit is contained in:
Yura Bondarenko
2021-07-01 22:37:07 +02:00
parent 50400895de
commit fb8f28f17d
2 changed files with 49 additions and 17 deletions

View File

@@ -1,6 +1,6 @@
import { fakeAsync, tick } from '@angular/core/testing'; import { fakeAsync, tick } from '@angular/core/testing';
import { Meta, Title } from '@angular/platform-browser'; 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 { TranslateService } from '@ngx-translate/core';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
@@ -8,11 +8,8 @@ import { Observable, of } from 'rxjs';
import { RemoteData } from '../data/remote-data'; import { RemoteData } from '../data/remote-data';
import { Item } from '../shared/item.model'; import { Item } from '../shared/item.model';
import { ItemMock, MockBitstream1, MockBitstream3, } from '../../shared/mocks/item.mock'; import { ItemMock, MockBitstream1, MockBitstream3 } from '../../shared/mocks/item.mock';
import { import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
createSuccessfulRemoteDataObject$,
createSuccessfulRemoteDataObject
} from '../../shared/remote-data.utils';
import { PaginatedList } from '../data/paginated-list.model'; import { PaginatedList } from '../data/paginated-list.model';
import { Bitstream } from '../shared/bitstream.model'; import { Bitstream } from '../shared/bitstream.model';
import { MetadataValue } from '../shared/metadata.models'; 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 { getMockTranslateService } from '../../shared/mocks/translate.service.mock';
import { DSONameService } from '../breadcrumbs/dso-name.service'; import { DSONameService } from '../breadcrumbs/dso-name.service';
import { HardRedirectService } from '../services/hard-redirect.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', () => { describe('MetadataService', () => {
let metadataService: MetadataService; let metadataService: MetadataService;
@@ -41,6 +43,10 @@ describe('MetadataService', () => {
let hardRedirectService: HardRedirectService; let hardRedirectService: HardRedirectService;
let router: Router; let router: Router;
let store;
const initialState = { 'core': { metaTag: { tagsInUse: ['title', 'description'] }}};
beforeEach(() => { beforeEach(() => {
rootService = jasmine.createSpyObj({ rootService = jasmine.createSpyObj({
@@ -53,7 +59,7 @@ describe('MetadataService', () => {
findByItemAndName: mockBundleRD$([MockBitstream3]) findByItemAndName: mockBundleRD$([MockBitstream3])
}); });
translateService = getMockTranslateService(); translateService = getMockTranslateService();
meta = jasmine.createSpyObj({ meta = jasmine.createSpyObj('meta', {
addTag: {}, addTag: {},
removeTag: {} removeTag: {}
}); });
@@ -73,6 +79,11 @@ describe('MetadataService', () => {
hardRedirectService = jasmine.createSpyObj( { hardRedirectService = jasmine.createSpyObj( {
getRequestOrigin: 'https://request.org', getRequestOrigin: 'https://request.org',
}); });
//@ts-ignore
store = getMockStore({ initialState });
spyOn(store, 'dispatch');
metadataService = new MetadataService( metadataService = new MetadataService(
router, router,
translateService, translateService,
@@ -83,6 +94,7 @@ describe('MetadataService', () => {
bitstreamDataService, bitstreamDataService,
undefined, undefined,
rootService, rootService,
store,
hardRedirectService 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 mockType = (mockItem: Item, type: string): Item => {
const typedMockItem = Object.assign(new Item(), mockItem) as Item; const typedMockItem = Object.assign(new Item(), mockItem) as Item;
typedMockItem.metadata['dc.type'] = [{ value: type }] as MetadataValue[]; typedMockItem.metadata['dc.type'] = [{ value: type }] as MetadataValue[];

View File

@@ -5,10 +5,10 @@ import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject, combineLatest, Observable, of as observableOf, EMPTY } from 'rxjs'; import { BehaviorSubject, combineLatest, EMPTY, Observable, of as observableOf } from 'rxjs';
import { filter, map, take, switchMap, expand } from 'rxjs/operators'; 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 { DSONameService } from '../breadcrumbs/dso-name.service';
import { BitstreamDataService } from '../data/bitstream-data.service'; import { BitstreamDataService } from '../data/bitstream-data.service';
import { BitstreamFormatDataService } from '../data/bitstream-format-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 { Bitstream } from '../shared/bitstream.model';
import { DSpaceObject } from '../shared/dspace-object.model'; import { DSpaceObject } from '../shared/dspace-object.model';
import { Item } from '../shared/item.model'; import { Item } from '../shared/item.model';
import { import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../shared/operators';
getFirstSucceededRemoteDataPayload,
getFirstCompletedRemoteData
} from '../shared/operators';
import { RootDataService } from '../data/root-data.service'; import { RootDataService } from '../data/root-data.service';
import { getBitstreamDownloadRoute } from '../../app-routing-paths'; import { getBitstreamDownloadRoute } from '../../app-routing-paths';
import { BundleDataService } from '../data/bundle-data.service'; 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 { URLCombiner } from '../url-combiner/url-combiner';
import { HardRedirectService } from '../services/hard-redirect.service'; import { HardRedirectService } from '../services/hard-redirect.service';
import { MetaTagState } from './meta-tag.reducer'; 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 { AddMetaTagAction, ClearMetaTagAction } from './meta-tag.actions';
import { coreSelector } from '../core.selectors'; import { coreSelector } from '../core.selectors';
import { CoreState } from '../core.reducers'; 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 * The base selector function to select the metaTag section in the store
@@ -84,7 +80,7 @@ export class MetadataService {
private bitstreamDataService: BitstreamDataService, private bitstreamDataService: BitstreamDataService,
private bitstreamFormatDataService: BitstreamFormatDataService, private bitstreamFormatDataService: BitstreamFormatDataService,
private rootService: RootDataService, private rootService: RootDataService,
private store: Store<MetaTagState>, private store: Store<CoreState>,
private hardRedirectService: HardRedirectService, private hardRedirectService: HardRedirectService,
) { ) {
} }