add test cases for the new transformer

Signed-off-by: Aramis <sennyeyaramis@gmail.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
This commit is contained in:
Aramis
2024-02-02 15:29:27 -05:00
committed by aramissennyeydd
parent 31392e59b8
commit 0aba8f018e
2 changed files with 131 additions and 0 deletions
@@ -0,0 +1,90 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Entity, EntityPolicy } from '@backstage/catalog-model';
import { policyToProcessorTransformer } from './policyToProcessorTransformer';
import { clone } from 'lodash';
describe('policyToProcessorTransformer', () => {
const entityToProcess: Entity = {
apiVersion: 'backstage.io/v1alpha',
kind: 'Component',
metadata: {
name: 'test',
},
};
it('modifies the entity if the policy modifies the entity', async () => {
const policy: EntityPolicy = {
async enforce(entity) {
entity.kind = 'Group';
return entity;
},
};
const processor = policyToProcessorTransformer(policy);
const clonedEntity = clone(entityToProcess);
const entity = await processor.preProcessEntity?.(
clonedEntity,
{} as any,
jest.fn(),
{} as any,
{} as any,
);
expect(entity).toBeTruthy();
expect(entity?.kind).toBe('Group');
expect(entity?.apiVersion).toBe('backstage.io/v1alpha');
expect(entity?.metadata.name).toBe('test');
});
it('does not modify the entity if the policy returns undefined', async () => {
const policy: EntityPolicy = {
async enforce() {
return undefined;
},
};
const processor = policyToProcessorTransformer(policy);
const clonedEntity = clone(entityToProcess);
const entity = await processor.preProcessEntity?.(
clonedEntity,
{} as any,
jest.fn(),
{} as any,
{} as any,
);
expect(entity).toBeTruthy();
expect(entity?.kind).toBe('Component');
expect(entity?.apiVersion).toBe('backstage.io/v1alpha');
expect(entity?.metadata.name).toBe('test');
});
it('bubbles up processor error', async () => {
const policy: EntityPolicy = {
async enforce() {
throw new TypeError('Invalid value for metadata.name');
},
};
const processor = policyToProcessorTransformer(policy);
const clonedEntity = clone(entityToProcess);
await expect(
processor.preProcessEntity?.(
clonedEntity,
{} as any,
jest.fn(),
{} as any,
{} as any,
),
).rejects.toThrow(/Invalid value for metadata.name/);
});
});
@@ -0,0 +1,41 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { EntityPolicy } from '@backstage/catalog-model';
import { CatalogProcessor } from '@backstage/plugin-catalog-node';
/**
* Transform a given entity policy to an entity processor.
* @param policy The policy to transform
* @returns A new entity processor that uses the entity policy.
*/
export function policyToProcessorTransformer(
policy: EntityPolicy,
): CatalogProcessor {
return {
getProcessorName() {
return policy.constructor.name;
},
async preProcessEntity(entity) {
// If enforcing the policy fails, throw the policy error.
const result = await policy.enforce(entity);
if (!result) {
return entity;
}
return result;
},
};
}