From 059720015cf0a0371c070a9714ba2401ddb0777e Mon Sep 17 00:00:00 2001 From: Andrew Thauer <6507159+andrewthauer@users.noreply.github.com> Date: Thu, 28 Jan 2021 11:28:07 -0500 Subject: [PATCH] replace link validators with common functions --- .../policies/FieldFormatEntityPolicy.test.ts | 33 ++++++++++++------- .../policies/FieldFormatEntityPolicy.ts | 15 +++++++-- .../src/validation/makeValidator.ts | 3 -- .../catalog-model/src/validation/types.ts | 3 -- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.test.ts b/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.test.ts index e5a56764e3..33ee045c1e 100644 --- a/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.test.ts +++ b/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.test.ts @@ -132,22 +132,26 @@ describe('FieldFormatEntityPolicy', () => { it('rejects missing link url value', async () => { data.metadata.links = [{}]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow(/links.0.url/i); }); - it('rejects a single bad missing url value', async () => { + it('rejects a single bad missing link url value', async () => { data.metadata.links = [{ url: 'http://good' }, { url: '' }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.1/); + await expect(policy.enforce(data)).rejects.toThrow( + /links.1.url.*valid url/i, + ); }); it('rejects empty link url value', async () => { data.metadata.links = [{ url: '' }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow(/links.0.url.*/i); }); it('rejects bad link url value', async () => { data.metadata.links = [{ url: 'invalid' }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow( + /links.0.url.*"invalid"/i, + ); }); it('accepts missing link title', async () => { @@ -157,14 +161,19 @@ describe('FieldFormatEntityPolicy', () => { it('rejects empty link title', async () => { data.metadata.links = [{ url: 'http://foo', title: '' }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow(/links.0.title.*""/i); + }); + + it('rejects bad link title', async () => { + data.metadata.links = [{ url: 'http://foo', title: 123 }]; + await expect(policy.enforce(data)).rejects.toThrow(/links.0.title.*"123"/i); }); it.each([[123], [{}], [[]]])( 'rejects bad link title %s', async (title: unknown) => { data.metadata.links = [{ url: 'http://foo', title }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow(/links.0.title.*/i); }, ); @@ -173,7 +182,7 @@ describe('FieldFormatEntityPolicy', () => { { url: 'http://foo', title: 'good' }, { url: 'http://foo', title: '' }, ]; - await expect(policy.enforce(data)).rejects.toThrow(/links.1/); + await expect(policy.enforce(data)).rejects.toThrow(/links.1.title.*""/i); }); it('accepts missing link icon', async () => { @@ -183,7 +192,7 @@ describe('FieldFormatEntityPolicy', () => { it('rejects empty link icon', async () => { data.metadata.links = [{ url: 'http://foo', icon: '' }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow(/links.0.icon.*""/i); }); it.each([['dashboard'], ['admin-dashboard'], ['foo_dashboard']])( @@ -198,7 +207,7 @@ describe('FieldFormatEntityPolicy', () => { 'rejects bad link icon value %s', async (icon: unknown) => { data.metadata.links = [{ url: 'http://foo', icon }]; - await expect(policy.enforce(data)).rejects.toThrow(/links.0/); + await expect(policy.enforce(data)).rejects.toThrow(/links.0.icon.*/i); }, ); @@ -207,6 +216,8 @@ describe('FieldFormatEntityPolicy', () => { { url: 'http://foo', icon: 'good' }, { url: 'http://foo', icon: 'not good' }, ]; - await expect(policy.enforce(data)).rejects.toThrow(/links.1/); + await expect(policy.enforce(data)).rejects.toThrow( + /links.1.icon.*"not good"/i, + ); }); }); diff --git a/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.ts b/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.ts index d854a3d514..00add2f63c 100644 --- a/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.ts +++ b/packages/catalog-model/src/entity/policies/FieldFormatEntityPolicy.ts @@ -143,9 +143,18 @@ export class FieldFormatEntityPolicy implements EntityPolicy { const links = entity.metadata.links ?? []; for (let i = 0; i < links.length; ++i) { - require(`links.${i}`, links[i]?.url, this.validators.isValidLinkUrl); - optional(`links.${i}`, links[i]?.title, this.validators.isValidLinkTitle); - optional(`links.${i}`, links[i]?.icon, this.validators.isValidLinkIcon); + require(`links.${i}.url`, links[i] + ?.url, CommonValidatorFunctions.isValidUrl); + optional( + `links.${i}.title`, + links[i]?.title, + CommonValidatorFunctions.isValidString, + ); + optional( + `links.${i}.icon`, + links[i]?.icon, + KubernetesValidatorFunctions.isValidObjectName, + ); } return entity; diff --git a/packages/catalog-model/src/validation/makeValidator.ts b/packages/catalog-model/src/validation/makeValidator.ts index e910b25f2a..63341f5c33 100644 --- a/packages/catalog-model/src/validation/makeValidator.ts +++ b/packages/catalog-model/src/validation/makeValidator.ts @@ -28,9 +28,6 @@ const defaultValidators: Validators = { isValidAnnotationKey: KubernetesValidatorFunctions.isValidAnnotationKey, isValidAnnotationValue: KubernetesValidatorFunctions.isValidAnnotationValue, isValidTag: CommonValidatorFunctions.isValidDnsLabel, - isValidLinkUrl: CommonValidatorFunctions.isValidUrl, - isValidLinkTitle: CommonValidatorFunctions.isValidString, - isValidLinkIcon: KubernetesValidatorFunctions.isValidObjectName, }; export function makeValidator(overrides: Partial = {}): Validators { diff --git a/packages/catalog-model/src/validation/types.ts b/packages/catalog-model/src/validation/types.ts index 9c7c173ea3..a4475c4809 100644 --- a/packages/catalog-model/src/validation/types.ts +++ b/packages/catalog-model/src/validation/types.ts @@ -24,7 +24,4 @@ export type Validators = { isValidAnnotationKey(value: unknown): boolean; isValidAnnotationValue(value: unknown): boolean; isValidTag(value: unknown): boolean; - isValidLinkUrl(value: unknown): boolean; - isValidLinkTitle(value: unknown): boolean; - isValidLinkIcon(value: unknown): boolean; };