79768: Update & add unit tests

This commit is contained in:
Yura Bondarenko
2021-06-04 13:57:30 +02:00
parent 1caba78b4d
commit cb4446b79d
3 changed files with 154 additions and 48 deletions

View File

@@ -15,11 +15,9 @@ import { RemoteData } from '../data/remote-data';
import { Item } from '../shared/item.model'; import { Item } from '../shared/item.model';
import { import {
ItemMock, ItemMock, MockBitstream1, MockBitstream2, MockBitstream3, MockBitstreamFormat1, MockBitstreamFormat2,
MockBitstream1, MockBitstreamFormat3,
MockBitstream2, MockOriginalBundle,
MockBitstreamFormat1,
MockBitstreamFormat2
} from '../../shared/mocks/item.mock'; } from '../../shared/mocks/item.mock';
import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock';
import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationsService } from '../../shared/notifications/notifications.service';
@@ -51,10 +49,11 @@ import { UUIDService } from '../shared/uuid.service';
import { MetadataService } from './metadata.service'; import { MetadataService } from './metadata.service';
import { environment } from '../../../environments/environment'; import { environment } from '../../../environments/environment';
import { storeModuleConfig } from '../../app.reducer'; import { storeModuleConfig } from '../../app.reducer';
import { HardRedirectService } from '../services/hard-redirect.service';
import { URLCombiner } from '../url-combiner/url-combiner';
import { RootDataService } from '../data/root-data.service'; import { RootDataService } from '../data/root-data.service';
import { Root } from '../data/root.model'; import { Root } from '../data/root.model';
import { Bundle } from '../shared/bundle.model';
import { BundleDataService } from '../data/bundle-data.service';
import { createPaginatedList } from '../../shared/testing/utils.test';
/* tslint:disable:max-classes-per-file */ /* tslint:disable:max-classes-per-file */
@Component({ @Component({
@@ -92,6 +91,8 @@ describe('MetadataService', () => {
let uuidService: UUIDService; let uuidService: UUIDService;
let remoteDataBuildService: RemoteDataBuildService; let remoteDataBuildService: RemoteDataBuildService;
let itemDataService: ItemDataService; let itemDataService: ItemDataService;
let bundleDataService;
let bitstreamDataService;
let authService: AuthService; let authService: AuthService;
let rootService: RootDataService; let rootService: RootDataService;
let translateService: TranslateService; let translateService: TranslateService;
@@ -111,7 +112,7 @@ describe('MetadataService', () => {
uuidService = new UUIDService(); uuidService = new UUIDService();
requestService = new RequestService(objectCacheService, uuidService, store, undefined); requestService = new RequestService(objectCacheService, uuidService, store, undefined);
remoteDataBuildService = new RemoteDataBuildService(objectCacheService, undefined, requestService); remoteDataBuildService = new RemoteDataBuildService(objectCacheService, undefined, requestService);
const mockBitstreamDataService = { bitstreamDataService = {
findAllByItemAndBundleName(item: Item, bundleName: string, options?: FindListOptions, ...linksToFollow: FollowLinkConfig<Bitstream>[]): Observable<RemoteData<PaginatedList<Bitstream>>> { findAllByItemAndBundleName(item: Item, bundleName: string, options?: FindListOptions, ...linksToFollow: FollowLinkConfig<Bitstream>[]): Observable<RemoteData<PaginatedList<Bitstream>>> {
if (item.equals(ItemMock)) { if (item.equals(ItemMock)) {
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [MockBitstream1, MockBitstream2])); return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [MockBitstream1, MockBitstream2]));
@@ -119,6 +120,7 @@ describe('MetadataService', () => {
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])); return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), []));
} }
}, },
findAllByHref: jasmine.createSpy(),
}; };
const mockBitstreamFormatDataService = { const mockBitstreamFormatDataService = {
findByBitstream(bitstream: Bitstream): Observable<RemoteData<BitstreamFormat>> { findByBitstream(bitstream: Bitstream): Observable<RemoteData<BitstreamFormat>> {
@@ -129,11 +131,17 @@ describe('MetadataService', () => {
case MockBitstream2: case MockBitstream2:
return createSuccessfulRemoteDataObject$(MockBitstreamFormat2); return createSuccessfulRemoteDataObject$(MockBitstreamFormat2);
break; break;
case MockBitstream3:
return createSuccessfulRemoteDataObject$(MockBitstreamFormat3);
break;
default: default:
return createSuccessfulRemoteDataObject$(new BitstreamFormat()); return createSuccessfulRemoteDataObject$(new BitstreamFormat());
} }
} }
}; };
bundleDataService = jasmine.createSpyObj('bundleDataService', {
findByItemAndName: createSuccessfulRemoteDataObject$(MockOriginalBundle),
});
rootService = jasmine.createSpyObj('rootService', { rootService = jasmine.createSpyObj('rootService', {
findRoot: createSuccessfulRemoteDataObject$(Object.assign(new Root(), { findRoot: createSuccessfulRemoteDataObject$(Object.assign(new Root(), {
dspaceVersion: 'mock-dspace-version' dspaceVersion: 'mock-dspace-version'
@@ -176,7 +184,8 @@ describe('MetadataService', () => {
{ provide: CommunityDataService, useValue: {} }, { provide: CommunityDataService, useValue: {} },
{ provide: DefaultChangeAnalyzer, useValue: {} }, { provide: DefaultChangeAnalyzer, useValue: {} },
{ provide: BitstreamFormatDataService, useValue: mockBitstreamFormatDataService }, { provide: BitstreamFormatDataService, useValue: mockBitstreamFormatDataService },
{ provide: BitstreamDataService, useValue: mockBitstreamDataService }, { provide: BitstreamDataService, useValue: bitstreamDataService },
{ provide: BundleDataService, useValue: bundleDataService },
{ provide: RootDataService, useValue: rootService }, { provide: RootDataService, useValue: rootService },
Meta, Meta,
Title, Title,
@@ -264,8 +273,42 @@ describe('MetadataService', () => {
}); });
describe('citation_pdf_url', () => {
it('should link to primary Bitstream URL regardless of format', fakeAsync(() => {
spyOn(itemDataService, 'findById').and.returnValue(mockRemoteData(ItemMock));
bundleDataService.findByItemAndName.and.returnValue(mockBundleRD$([], MockBitstream3));
router.navigate(['/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357']);
tick();
expect(tagStore.get('citation_pdf_url')[0].content).toEqual('/bitstreams/4db100c1-e1f5-4055-9404-9bc3e2d15f29/download');
}));
describe('no primary Bitstream', () => {
it('should link to first and only Bitstream regardless of format', fakeAsync(() => {
spyOn(itemDataService, 'findById').and.returnValue(mockRemoteData(ItemMock));
bundleDataService.findByItemAndName.and.returnValue(mockBundleRD$([MockBitstream3]));
router.navigate(['/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357']);
tick();
expect(tagStore.get('citation_pdf_url')[0].content).toEqual('/bitstreams/4db100c1-e1f5-4055-9404-9bc3e2d15f29/download');
}));
it('should link to first Bitstream with allowed format', fakeAsync(() => {
spyOn(itemDataService, 'findById').and.returnValue(mockRemoteData(ItemMock));
const bitstreams = [MockBitstream3, MockBitstream3, MockBitstream1];
bundleDataService.findByItemAndName.and.returnValue(mockBundleRD$(bitstreams));
bitstreamDataService.findAllByHref.and.returnValues(
...mockBitstreamPages$(bitstreams).map(bp => createSuccessfulRemoteDataObject$(bp)),
);
router.navigate(['/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357']);
tick();
expect(tagStore.get('citation_pdf_url')[0].content).toEqual('/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/download');
}));
});
});
const mockRemoteData = (mockItem: Item): Observable<RemoteData<Item>> => { const mockRemoteData = (mockItem: Item): Observable<RemoteData<Item>> => {
return createSuccessfulRemoteDataObject$(ItemMock); return createSuccessfulRemoteDataObject$(mockItem);
}; };
const mockType = (mockItem: Item, type: string): Item => { const mockType = (mockItem: Item, type: string): Item => {
@@ -285,4 +328,24 @@ describe('MetadataService', () => {
return publishedMockItem; return publishedMockItem;
}; };
const mockBundleRD$ = (bitstreams: Bitstream[], primary?: Bitstream): Observable<RemoteData<Bundle>> => {
return createSuccessfulRemoteDataObject$(
Object.assign(new Bundle(), {
name: 'ORIGINAL',
bitstreams: createSuccessfulRemoteDataObject$(mockBitstreamPages$(bitstreams)[0]),
primaryBitstream: createSuccessfulRemoteDataObject$(primary),
})
);
};
const mockBitstreamPages$ = (bitstreams: Bitstream[]): PaginatedList<Bitstream>[] => {
return bitstreams.map((bitstream, index) => Object.assign(createPaginatedList([bitstream]), {
pageInfo: {
totalElements: bitstreams.length, // announce multiple elements/pages
},
_links: index < bitstreams.length - 1
? { next: { href: 'not empty' }} // fake link to the next bitstream page
: { next: { href: undefined }}, // last page has no link
}));
};
}); });

View File

@@ -5,6 +5,7 @@ import { Bitstream } from '../../core/shared/bitstream.model';
import { Item } from '../../core/shared/item.model'; import { Item } from '../../core/shared/item.model';
import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils';
import { createPaginatedList } from '../testing/utils.test'; import { createPaginatedList } from '../testing/utils.test';
import { Bundle } from '../../core/shared/bundle.model';
export const MockBitstreamFormat1: BitstreamFormat = Object.assign(new BitstreamFormat(), { export const MockBitstreamFormat1: BitstreamFormat = Object.assign(new BitstreamFormat(), {
shortDescription: 'Microsoft Word XML', shortDescription: 'Microsoft Word XML',
@@ -34,11 +35,25 @@ export const MockBitstreamFormat2: BitstreamFormat = Object.assign(new Bitstream
} }
}); });
export const MockBitstreamFormat3: BitstreamFormat = Object.assign(new BitstreamFormat(), {
shortDescription: 'Binary',
description: 'Some scary unknown binary file',
mimetype: 'application/octet-stream',
supportLevel: 0,
internal: false,
extensions: null,
_links:{
self: {
href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/17'
}
}
});
export const MockBitstream1: Bitstream = Object.assign(new Bitstream(), export const MockBitstream1: Bitstream = Object.assign(new Bitstream(),
{ {
sizeBytes: 10201, sizeBytes: 10201,
content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/content', content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/content',
format: observableOf(MockBitstreamFormat1), format: createSuccessfulRemoteDataObject$(MockBitstreamFormat1),
bundleName: 'ORIGINAL', bundleName: 'ORIGINAL',
_links:{ _links:{
self: { self: {
@@ -61,7 +76,7 @@ export const MockBitstream1: Bitstream = Object.assign(new Bitstream(),
export const MockBitstream2: Bitstream = Object.assign(new Bitstream(), { export const MockBitstream2: Bitstream = Object.assign(new Bitstream(), {
sizeBytes: 31302, sizeBytes: 31302,
content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/99b00f3c-1cc6-4689-8158-91965bee6b28/content', content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/99b00f3c-1cc6-4689-8158-91965bee6b28/content',
format: observableOf(MockBitstreamFormat2), format: createSuccessfulRemoteDataObject$(MockBitstreamFormat2),
bundleName: 'ORIGINAL', bundleName: 'ORIGINAL',
id: '99b00f3c-1cc6-4689-8158-91965bee6b28', id: '99b00f3c-1cc6-4689-8158-91965bee6b28',
uuid: '99b00f3c-1cc6-4689-8158-91965bee6b28', uuid: '99b00f3c-1cc6-4689-8158-91965bee6b28',
@@ -82,16 +97,33 @@ export const MockBitstream2: Bitstream = Object.assign(new Bitstream(), {
} }
}); });
/* tslint:disable:no-shadowed-variable */ export const MockBitstream3: Bitstream = Object.assign(new Bitstream(), {
export const ItemMock: Item = Object.assign(new Item(), { sizeBytes: 4975123,
handle: '10673/6', content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/4db100c1-e1f5-4055-9404-9bc3e2d15f29/content',
lastModified: '2017-04-24T19:44:08.178+0000', format: createSuccessfulRemoteDataObject$(MockBitstreamFormat3),
isArchived: true, bundleName: 'ORIGINAL',
isDiscoverable: true, id: '4db100c1-e1f5-4055-9404-9bc3e2d15f29',
isWithdrawn: false, uuid: '4db100c1-e1f5-4055-9404-9bc3e2d15f29',
bundles: createSuccessfulRemoteDataObject$(createPaginatedList([ type: 'bitstream',
_links: {
self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/4db100c1-e1f5-4055-9404-9bc3e2d15f29' },
content: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/4db100c1-e1f5-4055-9404-9bc3e2d15f29/content' },
format: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/17' },
bundle: { href: '' }
},
metadata: {
'dc.title': [
{ {
language: null,
value: 'scary'
}
]
}
});
export const MockOriginalBundle: Bundle = Object.assign(new Bundle(), {
name: 'ORIGINAL', name: 'ORIGINAL',
primaryBitstream: createSuccessfulRemoteDataObject$(MockBitstream2),
bitstreams: observableOf(Object.assign({ bitstreams: observableOf(Object.assign({
_links: { _links: {
self: { self: {
@@ -124,7 +156,18 @@ export const ItemMock: Item = Object.assign(new Item(), {
] ]
} }
})) }))
} });
/* tslint:disable:no-shadowed-variable */
export const ItemMock: Item = Object.assign(new Item(), {
handle: '10673/6',
lastModified: '2017-04-24T19:44:08.178+0000',
isArchived: true,
isDiscoverable: true,
isWithdrawn: false,
bundles: createSuccessfulRemoteDataObject$(createPaginatedList([
MockOriginalBundle,
])), ])),
_links:{ _links:{
self: { self: {