add tests for build decorators

This commit is contained in:
Art Lowel
2020-02-19 19:16:42 +01:00
parent df9e6b67f5
commit 2c12446128
3 changed files with 84 additions and 23 deletions

View File

@@ -0,0 +1,83 @@
import { HALLink } from '../../shared/hal-link.model';
import { HALResource } from '../../shared/hal-resource.model';
import { ResourceType } from '../../shared/resource-type';
import {
dataService,
getDataServiceFor,
getLinkDefinition,
link,
} from './build-decorators';
/* tslint:disable:max-classes-per-file */
class TestService {}
class AnotherTestService {}
class TestHALResource implements HALResource {
_links: {
self: HALLink;
foo: HALLink;
};
bar?: any
}
let testType;
describe('build decorators', () => {
beforeEach(() => {
testType = new ResourceType('testType-' + new Date().getTime());
});
describe('@dataService/getDataServiceFor', () => {
it('should register a resourcetype for a dataservice', () => {
dataService(testType)(TestService);
expect(getDataServiceFor(testType)).toBe(TestService);
});
describe(`when the resource type isn't specified`, () => {
it(`should throw an error`, () => {
expect(() => {
dataService(undefined)(TestService);
}).toThrow();
});
});
describe(`when there already is a registered dataservice for a resourcetype`, () => {
it(`should throw an error`, () => {
dataService(testType)(TestService);
expect(() => {
dataService(testType)(AnotherTestService);
}).toThrow();
});
});
});
describe(`@link/getLinkDefinitions`, () => {
it(`should register a link`, () => {
const target = new TestHALResource();
link(testType, true, 'foo')(target, 'bar');
const result = getLinkDefinition(TestHALResource, 'foo');
expect(result.resourceType).toBe(testType);
expect(result.isList).toBe(true);
expect(result.linkName).toBe('foo');
expect(result.propertyName).toBe('bar');
});
describe(`when the linkname isn't specified`, () => {
it(`should use the propertyname`, () => {
const target = new TestHALResource();
link(testType)(target, 'foo');
const result = getLinkDefinition(TestHALResource, 'foo');
expect(result.linkName).toBe('foo');
expect(result.propertyName).toBe('foo');
});
});
describe(`when there's no @link`, () => {
it(`should return undefined`, () => {
const result = getLinkDefinition(TestHALResource, 'self');
expect(result).toBeUndefined();
});
});
});
});
/* tslint:enable:max-classes-per-file */

View File

@@ -66,25 +66,6 @@ export function getDataServiceFor<T extends CacheableObject>(resourceType: Resou
return dataServiceMap.get(resourceType.value);
}
export function resolvedLink<T extends DataService<any>, K extends keyof T>(provider: GenericConstructor<T>, methodName?: K, ...params: any[]): any {
return function r(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
if (!target || !propertyKey) {
return;
}
const metaDataList: string[] = resolvedLinkMap.get(target.constructor) || [];
if (metaDataList.indexOf(propertyKey) === -1) {
metaDataList.push(propertyKey);
}
resolvedLinkMap.set(target.constructor, metaDataList);
return Reflect.metadata(resolvedLinkKey, {
provider,
methodName,
params
}).apply(this, arguments);
};
}
/**
* A class to represent the data that can be set by the @link decorator
*/
@@ -124,7 +105,7 @@ export const link = <T extends HALResource>(
linkName = propertyName as any;
}
targetMap.set(propertyName, {
targetMap.set(linkName, {
resourceType,
isList,
linkName,

View File

@@ -58,7 +58,4 @@ describe('ThumbnailComponent', () => {
})
});
});
;
});