Newer
Older
import { AggregationMappingResource } from '@admin-client/reporting-shared';
import { ROUTES } from '@admin-client/shared';
import { NavigationService, RouteData } from '@alfa-client/navigation-shared';
import {
createEmptyStateResource,
createStateResource,
decodeUrlFromEmbedding,
ResourceRepository,
ResourceServiceConfig,
StateResource,
} from '@alfa-client/tech-shared';
import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
import { UrlSegment } from '@angular/router';
import { faker } from '@faker-js/faker';
import { afterAll, expect } from '@jest/globals';
import { ResourceUri } from '@ngxp/rest';
import { Observable, of } from 'rxjs';
import { createRouteData, createUrlSegment } from '../../../../navigation-shared/test/navigation-test-factory';
import { singleColdCompleted } from '../../../../tech-shared/test/marbles';
import { createAggregationMappingResource } from '../../test/aggregation-mapping';
import * as self from './aggregation-mapping-resource.service';
jest.mock('@alfa-client/tech-shared', () => ({
...jest.requireActual('@alfa-client/tech-shared'),
decodeUrlFromEmbedding: jest.fn(),
}));
const decodeUrlFromEmbeddingMock: jest.Mock = decodeUrlFromEmbedding as jest.Mock;
describe('AggregationMappingResourceService', () => {
let repository: Mock<ResourceRepository>;
let navigationService: Mock<NavigationService>;
beforeEach(() => {
repository = mock(ResourceRepository);
navigationService = mock(NavigationService);
});
describe('build config', () => {
const getResourceByNavigationRouteSpy: jest.SpyInstance = jest
.spyOn(self, '_getResourceByNavigationRoute')
.mockImplementation();
getResourceByNavigationRouteSpy.mockRestore();
});
it('should get resource by navigation route', () => {
self._buildResourceServiceConfig(useFromMock(repository), useFromMock(navigationService));
expect(getResourceByNavigationRouteSpy).toHaveBeenCalled();
});
it('should have aggregation mapping static resource', () => {
const staticResource: StateResource<AggregationMappingResource> = createStateResource(createAggregationMappingResource());
getResourceByNavigationRouteSpy.mockReturnValue(of(staticResource));
const config: ResourceServiceConfig<AggregationMappingResource> = self._buildResourceServiceConfig(
useFromMock(repository),
useFromMock(navigationService),
);
expect(config.resource).toBeObservable(singleColdCompleted(staticResource));
});
});
describe('get resource by navigation route', () => {
const routeData: RouteData = createRouteData();
const _isAggregationMappingEditUrl: jest.SpyInstance = jest.spyOn(self, '_isAggregationMappingEditUrl').mockImplementation();
const _getAggregationMappingResourceByRoute: jest.SpyInstance = jest
.spyOn(self, '_getAggregationMappingResourceByRoute')
.mockImplementation();
beforeEach(() => {
navigationService.getCurrentRouteData.mockReturnValue(of(routeData));
});
afterAll(() => {
_isAggregationMappingEditUrl.mockRestore();
_getAggregationMappingResourceByRoute.mockRestore();
});
it('should get current route data', () => {
self._getResourceByNavigationRoute(useFromMock(repository), useFromMock(navigationService)).subscribe();
expect(navigationService.getCurrentRouteData).toHaveBeenCalled();
});
it('should check if url contains resource uri', () => {
self._getResourceByNavigationRoute(useFromMock(repository), useFromMock(navigationService)).subscribe();
expect(_isAggregationMappingEditUrl).toHaveBeenCalled();
});
it('should get aggregation mapping resource by route', () => {
self._getResourceByNavigationRoute(useFromMock(repository), useFromMock(navigationService)).subscribe();
expect(_getAggregationMappingResourceByRoute).toHaveBeenCalled();
});
it('should return aggregation mapping by route', () => {
const stateResource: StateResource<AggregationMappingResource> = createStateResource(createAggregationMappingResource());
_getAggregationMappingResourceByRoute.mockReturnValue(of(stateResource));
_isAggregationMappingEditUrl.mockReturnValue(true);
const resourceByRoute$: Observable<StateResource<AggregationMappingResource>> = self._getResourceByNavigationRoute(
useFromMock(repository),
useFromMock(navigationService),
);
expect(resourceByRoute$).toBeObservable(singleColdCompleted(stateResource));
});
it('should return empty state resource', () => {
const stateResource: StateResource<AggregationMappingResource> = createEmptyStateResource();
_isAggregationMappingEditUrl.mockReturnValue(false);
const resourceByRoute$: Observable<StateResource<AggregationMappingResource>> = self._getResourceByNavigationRoute(
useFromMock(repository),
useFromMock(navigationService),
);
expect(resourceByRoute$).toBeObservable(singleColdCompleted(stateResource));
});
});
describe('is aggregation mapping edit url', () => {
it.each([0, 1, 3])('should return false of wrong number of segments = %d', (numberOfSegments: number) => {
const routeData: RouteData = {
...createRouteData(),
urlSegments: Array(numberOfSegments).fill(createUrlSegment()),
};
expect(self._isAggregationMappingEditUrl(routeData)).toBe(false);
});
it('should return false if first path is wrong', () => {
const routeData: RouteData = {
...createRouteData(),
urlSegments: Array(2).fill(createUrlSegment()),
};
expect(self._isAggregationMappingEditUrl(routeData)).toBe(false);
});
it('should return false if second path is wrong', () => {
const firstUrlSegment: UrlSegment = createUrlSegment();
firstUrlSegment.path = ROUTES.AGGREGATION_MAPPING;
const secondUrlSegment: UrlSegment = createUrlSegment();
secondUrlSegment.path = 'neu';
const routeData: RouteData = {
...createRouteData(),
urlSegments: [firstUrlSegment, secondUrlSegment],
};
expect(self._isAggregationMappingEditUrl(routeData)).toBe(false);
});
it('should return true', () => {
const firstUrlSegment: UrlSegment = createUrlSegment();
firstUrlSegment.path = ROUTES.AGGREGATION_MAPPING;
const secondUrlSegment: UrlSegment = createUrlSegment();
secondUrlSegment.path = faker.internet.url();
const routeData: RouteData = {
...createRouteData(),
urlSegments: [firstUrlSegment, secondUrlSegment],
};
expect(self._isAggregationMappingEditUrl(routeData)).toBe(true);
});
});
describe('get aggregation mapping resource by route', () => {
const firstUrlSegment: UrlSegment = createUrlSegment();
firstUrlSegment.path = ROUTES.AGGREGATION_MAPPING;
const secondUrlSegment: UrlSegment = createUrlSegment();
secondUrlSegment.path = faker.internet.url();
const routeData: RouteData = {
...createRouteData(),
urlSegments: [firstUrlSegment, secondUrlSegment],
};
const uri: ResourceUri = faker.internet.url();
const resource: AggregationMappingResource = createAggregationMappingResource();
beforeEach(() => {
decodeUrlFromEmbeddingMock.mockReturnValue(uri);
repository.getResource.mockReturnValue(of(resource));
});
it('should decode url', () => {
self._getAggregationMappingResourceByRoute(useFromMock(repository), routeData);
expect(decodeUrlFromEmbeddingMock).toHaveBeenCalledWith(secondUrlSegment.path);
});
it('should get resource', () => {
self._getAggregationMappingResourceByRoute(useFromMock(repository), routeData);
expect(repository.getResource).toHaveBeenCalledWith(uri);
});
it('should return state resource', () => {
const stateResource$: Observable<StateResource<AggregationMappingResource>> = self._getAggregationMappingResourceByRoute(
useFromMock(repository),
routeData,
);
expect(stateResource$).toBeObservable(singleColdCompleted(createStateResource(resource)));
});
});
});