diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts index dedada5f5f..334d69f19a 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts @@ -18,6 +18,8 @@ import { ItemAdminSearchResultGridElementComponent } from './item-admin-search-r import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils'; import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { AccessStatusDataService } from 'src/app/core/data/access-status-data.service'; +import { AccessStatusObject } from 'src/app/shared/object-list/access-status-badge/access-status.model'; describe('ItemAdminSearchResultGridElementComponent', () => { let component: ItemAdminSearchResultGridElementComponent; @@ -31,6 +33,12 @@ describe('ItemAdminSearchResultGridElementComponent', () => { } }; + const mockAccessStatusDataService = { + findAccessStatusFor(item: Item): Observable> { + return createSuccessfulRemoteDataObject$(new AccessStatusObject()); + } + }; + const mockThemeService = getMockThemeService(); function init() { @@ -55,6 +63,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { { provide: TruncatableService, useValue: mockTruncatableService }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, { provide: ThemeService, useValue: mockThemeService }, + { provide: AccessStatusDataService, useValue: mockAccessStatusDataService }, ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/core/data/access-status-data.service.spec.ts b/src/app/core/data/access-status-data.service.spec.ts new file mode 100644 index 0000000000..d81b9384f3 --- /dev/null +++ b/src/app/core/data/access-status-data.service.spec.ts @@ -0,0 +1,81 @@ +import { RequestService } from './request.service'; +import { getMockRequestService } from '../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { fakeAsync, tick } from '@angular/core/testing'; +import { GetRequest } from './request.models'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { Observable } from 'rxjs'; +import { RemoteData } from './remote-data'; +import { hasNoValue } from '../../shared/empty.util'; +import { AccessStatusDataService } from './access-status-data.service'; +import { Item } from '../shared/item.model'; + +const url = 'fake-url'; + +describe('AccessStatusDataService', () => { + let service: AccessStatusDataService; + let requestService: RequestService; + let notificationsService: any; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: any; + + const itemId = '8b3c613a-5a4b-438b-9686-be1d5b4a1c5a'; + const mockItem: Item = Object.assign(new Item(), { + id: itemId, + name: 'test-item', + _links: { + accessStatus: { + href: `https://rest.api/items/${itemId}/accessStatus` + }, + self: { + href: `https://rest.api/items/${itemId}` + } + } + }); + + describe('when the requests are successful', () => { + beforeEach(() => { + createService(); + }); + + describe('when calling findAccessStatusFor', () => { + let contentSource$; + + beforeEach(() => { + contentSource$ = service.findAccessStatusFor(mockItem); + }); + + it('should send a new GetRequest', fakeAsync(() => { + contentSource$.subscribe(); + tick(); + expect(requestService.send).toHaveBeenCalledWith(jasmine.any(GetRequest), true); + })); + }); + }); + + /** + * Create an AccessStatusDataService used for testing + * @param reponse$ Supply a RemoteData to be returned by the REST API (optional) + */ + function createService(reponse$?: Observable>) { + requestService = getMockRequestService(); + let buildResponse$ = reponse$; + if (hasNoValue(reponse$)) { + buildResponse$ = createSuccessfulRemoteDataObject$({}); + } + rdbService = jasmine.createSpyObj('rdbService', { + buildFromRequestUUID: buildResponse$, + buildSingle: buildResponse$ + }); + objectCache = jasmine.createSpyObj('objectCache', { + remove: jasmine.createSpy('remove') + }); + halService = new HALEndpointServiceStub(url); + notificationsService = new NotificationsServiceStub(); + service = new AccessStatusDataService(null, halService, null, notificationsService, objectCache, rdbService, requestService, null); + } +}); diff --git a/src/app/core/data/item-data.service.spec.ts b/src/app/core/data/item-data.service.spec.ts index e85ddb2f38..a4ed9f882f 100644 --- a/src/app/core/data/item-data.service.spec.ts +++ b/src/app/core/data/item-data.service.spec.ts @@ -184,33 +184,6 @@ describe('ItemDataService', () => { }); }); - describe('getAccessStatusEndpoint', () => { - beforeEach(() => { - service = initTestService(); - }); - it('should retrieve the access status endpoint', () => { - const itemId = '3de6ea60-ec39-419b-ae6f-065930ac1429'; - const result = service.getAccessStatusEndpoint(itemId); - result.subscribe(((value) => { - expect(value).toEqual(`${itemEndpoint}/items/${itemId}/accessStatus`); - })); - }); - }); - - describe('getAccessStatus', () => { - beforeEach(() => { - service = initTestService(); - }); - it('should send a GET request', (done) => { - const itemId = '3de6ea60-ec39-419b-ae6f-065930ac1429'; - const result = service.getAccessStatus(itemId); - result.subscribe(() => { - expect(requestService.send).toHaveBeenCalledWith(jasmine.any(GetRequest)); - done(); - }); - }); - }); - describe('when cache is invalidated', () => { beforeEach(() => { service = initTestService(); diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts b/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts index da0677a5de..9101df2f4c 100644 --- a/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts @@ -6,8 +6,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { AccessStatusBadgeComponent } from './access-status-badge.component'; import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; import { By } from '@angular/platform-browser'; -import { ItemDataService } from 'src/app/core/data/item-data.service'; import { AccessStatusObject } from './access-status.model'; +import { AccessStatusDataService } from 'src/app/core/data/access-status-data.service'; +import { environment } from 'src/environments/environment'; describe('ItemAccessStatusBadgeComponent', () => { let component: AccessStatusBadgeComponent; @@ -19,7 +20,7 @@ describe('ItemAccessStatusBadgeComponent', () => { let embargoStatus: AccessStatusObject; let restrictedStatus: AccessStatusObject; - let itemDataService: ItemDataService; + let accessStatusDataService: AccessStatusDataService; let item: Item; @@ -44,8 +45,8 @@ describe('ItemAccessStatusBadgeComponent', () => { status: 'restricted' }); - itemDataService = jasmine.createSpyObj('itemDataService', { - getAccessStatus: createSuccessfulRemoteDataObject$(unknownStatus) + accessStatusDataService = jasmine.createSpyObj('accessStatusDataService', { + findAccessStatusFor: createSuccessfulRemoteDataObject$(unknownStatus) }); item = Object.assign(new Item(), { @@ -59,16 +60,18 @@ describe('ItemAccessStatusBadgeComponent', () => { declarations: [AccessStatusBadgeComponent, TruncatePipe], schemas: [NO_ERRORS_SCHEMA], providers: [ - {provide: ItemDataService, useValue: itemDataService} + {provide: AccessStatusDataService, useValue: accessStatusDataService} ] }).compileComponents(); } function initFixtureAndComponent() { + environment.item.showAccessStatuses = true; fixture = TestBed.createComponent(AccessStatusBadgeComponent); component = fixture.componentInstance; - component.uuid = item.uuid; + component.item = item; fixture.detectChanges(); + environment.item.showAccessStatuses = false; } function lookForAccessStatusBadge(status: string) { @@ -89,7 +92,7 @@ describe('ItemAccessStatusBadgeComponent', () => { }); }); - describe('When the getAccessStatus method returns unknown', () => { + describe('When the findAccessStatusFor method returns unknown', () => { beforeEach(waitForAsync(() => { init(); initTestBed(); @@ -102,10 +105,10 @@ describe('ItemAccessStatusBadgeComponent', () => { }); }); - describe('When the getAccessStatus method returns metadata.only', () => { + describe('When the findAccessStatusFor method returns metadata.only', () => { beforeEach(waitForAsync(() => { init(); - (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(metadataOnlyStatus)); + (accessStatusDataService.findAccessStatusFor as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(metadataOnlyStatus)); initTestBed(); })); beforeEach(() => { @@ -116,10 +119,10 @@ describe('ItemAccessStatusBadgeComponent', () => { }); }); - describe('When the getAccessStatus method returns open.access', () => { + describe('When the findAccessStatusFor method returns open.access', () => { beforeEach(waitForAsync(() => { init(); - (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(openAccessStatus)); + (accessStatusDataService.findAccessStatusFor as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(openAccessStatus)); initTestBed(); })); beforeEach(() => { @@ -130,10 +133,10 @@ describe('ItemAccessStatusBadgeComponent', () => { }); }); - describe('When the getAccessStatus method returns embargo', () => { + describe('When the findAccessStatusFor method returns embargo', () => { beforeEach(waitForAsync(() => { init(); - (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(embargoStatus)); + (accessStatusDataService.findAccessStatusFor as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(embargoStatus)); initTestBed(); })); beforeEach(() => { @@ -144,10 +147,10 @@ describe('ItemAccessStatusBadgeComponent', () => { }); }); - describe('When the getAccessStatus method returns restricted', () => { + describe('When the findAccessStatusFor method returns restricted', () => { beforeEach(waitForAsync(() => { init(); - (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(restrictedStatus)); + (accessStatusDataService.findAccessStatusFor as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(restrictedStatus)); initTestBed(); })); beforeEach(() => { diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts b/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts index 59ac30f393..fbca3cb971 100644 --- a/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts @@ -40,7 +40,7 @@ export class AccessStatusBadgeComponent { if (this.item.accessStatus == null) { // In case the access status has not been loaded, do it individually. this.item.accessStatus = this.accessStatusDataService.findAccessStatusFor(this.item); - } + } this.accessStatus$ = this.item.accessStatus.pipe( map((accessStatusRD) => { if (accessStatusRD.statusCode !== 401 && hasValue(accessStatusRD.payload)) {