diff --git a/goofy-client/libs/api-root-shared/src/lib/api-root.service.spec.ts b/goofy-client/libs/api-root-shared/src/lib/api-root.service.spec.ts index 2e225596b95a5cf23fef80fe167d6a8f55d58292..27356c6eb6fb99a2e7b17d87f6176699d3c0b05f 100644 --- a/goofy-client/libs/api-root-shared/src/lib/api-root.service.spec.ts +++ b/goofy-client/libs/api-root-shared/src/lib/api-root.service.spec.ts @@ -1,10 +1,13 @@ -import { createEmptyStateResource } from '@goofy-client/tech-shared'; +import { BinaryFileResource } from '@goofy-client/binary-file-shared'; +import { createEmptyStateResource, createStateResource, StateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { Resource } from '@ngxp/rest'; -import { createDummyResource } from 'libs/tech-shared/test/resource'; +import { getUrl } from '@ngxp/rest'; +import { hot } from 'jest-marbles'; import { of } from 'rxjs'; -import { createApiRoot } from '../../test/api-root'; -import { ApiRoot } from './api-root.model'; +import { createBinaryFileResource } from '../../../binary-file-shared/test/binary-file'; +import { createApiRoot, createApiRootResource } from '../../test/api-root'; +import { ApiRootFacade } from './+state/api-root.facade'; +import { ApiRoot, ApiRootResource } from './api-root.model'; import { ApiRootRepository } from './api-root.repository'; import { ApiRootService } from './api-root.service'; @@ -12,10 +15,15 @@ describe('ApiRootService', () => { var repository; var service; + var facade; + + const apiRoot: ApiRootResource = createApiRootResource(); + const apiRootStateResource: StateResource<ApiRootResource> = createStateResource(apiRoot); beforeEach(() => { repository = mock(ApiRootRepository); - service = new ApiRootService(repository); + facade = mock(ApiRootFacade); + service = new ApiRootService(repository, facade); }) describe('calling getApiRoot', () => { @@ -73,12 +81,32 @@ describe('ApiRootService', () => { describe('getDownloadToken', () => { + const binaryFile: BinaryFileResource = createBinaryFileResource(); + + beforeEach(() => { + facade.getApiRoot.mockReturnValue(hot('-a', { a: apiRootStateResource })); + }) + + it('should call getApiRoot', () => { + service.getDownloadToken(binaryFile); + + expect(facade.getApiRoot).toHaveBeenCalled(); + }) + + it('should NOT call repository on null apiRoot', () => { + service.getApiRoot = jest.fn().mockReturnValue(of(createEmptyStateResource())); + + service.getDownloadToken(binaryFile).subscribe(); + + expect(repository.downloadToken).not.toHaveBeenCalled(); + }) + it('should call repository', () => { - const resource: Resource = createDummyResource(); + facade.getApiRoot.mockReturnValue(of(apiRootStateResource)); - service.getDownloadToken(resource); + service.getDownloadToken(binaryFile).subscribe(); - expect(repository.downloadToken).toHaveBeenCalled(); - }); - }); + expect(repository.downloadToken).toHaveBeenCalledWith(apiRoot, getUrl(binaryFile)); + }) + }) }) \ No newline at end of file diff --git a/goofy-client/libs/api-root-shared/src/lib/api-root.service.ts b/goofy-client/libs/api-root-shared/src/lib/api-root.service.ts index de772e66192387d61bb4b8c5e62f3bf5baa33175..b65803b430521a39c45894cd27e5a717bd1099a2 100644 --- a/goofy-client/libs/api-root-shared/src/lib/api-root.service.ts +++ b/goofy-client/libs/api-root-shared/src/lib/api-root.service.ts @@ -1,8 +1,10 @@ import { Injectable } from '@angular/core'; -import { ApiDownloadToken, ApiRootResource } from '@goofy-client/api-root-shared'; -import { createEmptyStateResource, createStateResource, doIfLoadingRequired, StateResource } from '@goofy-client/tech-shared'; +import { createEmptyStateResource, createStateResource, doIfLoadingRequired, isNotNull, StateResource } from '@goofy-client/tech-shared'; import { getUrl, Resource } from '@ngxp/rest'; import { BehaviorSubject, Observable } from 'rxjs'; +import { filter, switchMap } from 'rxjs/operators'; +import { ApiRootFacade } from './+state/api-root.facade'; +import { ApiDownloadToken, ApiRootResource } from './api-root.model'; import { ApiRootRepository } from './api-root.repository'; @Injectable() @@ -10,7 +12,7 @@ export class ApiRootService { private readonly apiRoot$: BehaviorSubject<StateResource<ApiRootResource>> = new BehaviorSubject<StateResource<ApiRootResource>>(createEmptyStateResource<ApiRootResource>()); - constructor(private repository: ApiRootRepository) { } + constructor(private repository: ApiRootRepository, private apiRootFacade: ApiRootFacade) { } public getApiRoot(): Observable<StateResource<ApiRootResource>> { doIfLoadingRequired(this.apiRoot$.value, () => this.loadApiRoot()) @@ -29,6 +31,9 @@ export class ApiRootService { //TOOD: In der Facade zur Verfuegung stellen, aufrufende Stelle anpassen und den service lib protected machen public getDownloadToken(resource: Resource): Observable<ApiDownloadToken> { - return this.repository.downloadToken(this.apiRoot$.value.resource, getUrl(resource)); + return this.apiRootFacade.getApiRoot().pipe( + filter(apiRoot => isNotNull(apiRoot.resource)), + switchMap(apiRoot => this.repository.downloadToken(apiRoot.resource, getUrl(resource))) + ); } } \ No newline at end of file