replace link validators with common functions

This commit is contained in:
Andrew Thauer
2021-01-28 11:28:07 -05:00
parent 13c59b82b3
commit 059720015c
4 changed files with 34 additions and 20 deletions
@@ -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,
);
});
});
@@ -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;
@@ -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> = {}): Validators {
@@ -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;
};