Skip to content

Commit

Permalink
Tests: add tests for directive config merge
Browse files Browse the repository at this point in the history
  • Loading branch information
marcvberg authored and phani-srikar committed Aug 16, 2022
1 parent eba6acd commit 8b83c8c
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,29 @@ describe('ModelTransformer: ', () => {
expect(verifyInputCount(parsed, 'ModelPostFilterInput', 1)).toBeTruthy();
});

it('Should support public level subscriptions without defining custom names', () => {
const validSchema = `
type Post @model(subscriptions: { level: public }) {
id: ID!
title: String!
}
`;
const transformer = new GraphQLTransform({
transformers: [new ModelTransformer()],
featureFlags,
});
const out = transformer.transform(validSchema);
expect(out).toBeDefined();
const definition = out.schema;
expect(definition).toBeDefined();
const parsed = parse(definition);
validateModelSchema(parsed);

const subscriptionType = getObjectType(parsed, 'Subscription');
expect(subscriptionType).toBeDefined();
expectFields(subscriptionType!, ['onUpdatePost', 'onCreatePost', 'onDeletePost']);
});

it('should support advanced subscriptions', () => {
const validSchema = `type Post @model(subscriptions: {
onCreate: ["onFeedUpdated", "onCreatePost"],
Expand Down Expand Up @@ -1283,7 +1306,7 @@ describe('ModelTransformer: ', () => {
expect(Object.keys(result.stacks.Blog.Resources!).includes('CreateBlogResolver')).toBe(false);
expect(Object.keys(result.stacks.Blog.Resources!).includes('UpdateBlogResolver')).toBe(false);
});

it('allow aws_lambda to pass through', () => {
const validSchema = `
type Todo @aws_lambda {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,9 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
level: SubscriptionLevel.on,
...publicSubscriptionDefaults,
},
}, ctx.featureFlags);
},
ctx.featureFlags,
);
if (baseArgs?.subscriptions?.level === SubscriptionLevel.public
&& !(baseArgs?.subscriptions?.onCreate || baseArgs?.subscriptions?.onDelete || baseArgs?.subscriptions?.onUpdate)) {
options.subscriptions = { level: SubscriptionLevel.public, ...publicSubscriptionDefaults };
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import {
DirectiveNode,
ObjectTypeDefinitionNode,
parse,
} from 'graphql';
import { FeatureFlagProvider } from '@aws-amplify/graphql-transformer-interfaces';
import { getFieldNameFor } from '../../utils/operation-names';
import { DirectiveWrapper } from '../../utils';

const generateFeatureFlagWithBooleanOverrides = (overrides: Record<string, boolean>): FeatureFlagProvider => ({
getBoolean: (name: string, defaultValue?: boolean): boolean => {
const overrideValue = Object.entries(overrides).find(([overrideName]) => overrideName === name)?.[1];
return overrideValue ?? defaultValue ?? false;
},
getNumber: jest.fn(),
getObject: jest.fn(),
getString: jest.fn(),
});

describe('Transformer Core Util Tests', () => {
describe(': Directive Wrapper tests', () => {
const schema = `
type Todo @model(subscriptions: {level: public}) {
id: ID!
name: String!
}
`;
const typeName = 'Todo';
const defaultArgs = {
queries: {
get: getFieldNameFor('get', typeName),
list: getFieldNameFor('list', typeName),
},
mutations: {
create: getFieldNameFor('create', typeName),
update: getFieldNameFor('update', typeName),
delete: getFieldNameFor('delete', typeName),
},
subscriptions: {
level: 'on',
onCreate: [getFieldNameFor('onCreate', typeName)],
onDelete: [getFieldNameFor('onDelete', typeName)],
onUpdate: [getFieldNameFor('onUpdate', typeName)],
},
timestamps: {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
},
};
it(': Should shallow merge with deep merge flag disabled', () => {
const parsedDoc = parse(schema);
const objNode = parsedDoc?.definitions?.[0] as ObjectTypeDefinitionNode;
const modelDir = objNode?.directives?.[0] as DirectiveNode;
const wrappedDir = new DirectiveWrapper(modelDir);

const newArgs = wrappedDir.getArguments(defaultArgs, generateFeatureFlagWithBooleanOverrides({}));
expect(newArgs.subscriptions).toEqual({ level: 'public' });
expect(newArgs.timestamps).toEqual(defaultArgs.timestamps);
expect(newArgs.queries).toEqual(defaultArgs.queries);
expect(newArgs.mutations).toEqual(defaultArgs.mutations);
});

it(': Should deep merge with deep merge flag enabled', () => {
const parsedDoc = parse(schema);
const objNode = parsedDoc?.definitions?.[0] as ObjectTypeDefinitionNode;
const modelDir = objNode?.directives?.[0] as DirectiveNode;
const wrappedDir = new DirectiveWrapper(modelDir);

const newArgs = wrappedDir.getArguments(
defaultArgs,
generateFeatureFlagWithBooleanOverrides({ 'graphQLTransformer.shouldDeepMergeDirectiveConfigDefaults': true }),
);
expect(newArgs.subscriptions).toEqual({
level: 'public',
onCreate: [getFieldNameFor('onCreate', typeName)],
onDelete: [getFieldNameFor('onDelete', typeName)],
onUpdate: [getFieldNameFor('onUpdate', typeName)],
});
expect(newArgs.timestamps).toEqual(defaultArgs.timestamps);
expect(newArgs.queries).toEqual(defaultArgs.queries);
expect(newArgs.mutations).toEqual(defaultArgs.mutations);
});
});
});

0 comments on commit 8b83c8c

Please sign in to comment.