Skip to content

Commit

Permalink
fix: checking mutations args when defined (#7200)
Browse files Browse the repository at this point in the history
  • Loading branch information
akshbhu committed Apr 29, 2021
1 parent 034ad67 commit 2b59309
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 5 deletions.
12 changes: 8 additions & 4 deletions packages/graphql-key-transformer/src/KeyTransformer.ts
Expand Up @@ -66,6 +66,7 @@ import {
} from 'graphql';
import { AppSync, Fn, Refs } from 'cloudform-types';
import { Projection, GlobalSecondaryIndex, LocalSecondaryIndex } from 'cloudform-types/types/dynamoDb/table';
import _ from 'lodash';

interface KeyArguments {
name?: string;
Expand Down Expand Up @@ -463,10 +464,13 @@ export class KeyTransformer extends Transformer {
if (ctx.featureFlags.getBoolean('skipOverrideMutationInputTypes', false)) {
const modelDirective = definition.directives.find(dir => dir.name.value === 'model');
const modelDirectiveArgs = getDirectiveArguments(modelDirective);
// Figure out which mutations to make and if they have name overrides
shouldMakeCreate = !!modelDirectiveArgs?.mutations?.create;
shouldMakeUpdate = !!modelDirectiveArgs?.mutations?.update;
shouldMakeDelete = !!modelDirectiveArgs?.mutations?.delete;

if (!_.isEmpty(modelDirectiveArgs) && Object.keys(modelDirectiveArgs).includes('mutations')) {
// Figure out which mutations to make and if they have name overrides
shouldMakeCreate = !!modelDirectiveArgs?.mutations?.create;
shouldMakeUpdate = !!modelDirectiveArgs?.mutations?.update;
shouldMakeDelete = !!modelDirectiveArgs?.mutations?.delete;
}
}
const hasIdField = definition.fields.find(f => f.name.value === 'id');
if (!hasIdField) {
Expand Down
Expand Up @@ -394,6 +394,99 @@ describe('check schema input', () => {
expect(senderIdField.type.kind).toBe('NonNullType');
});

it('@model mutation with default', () => {
const validSchema = /* GraphQL */ `
type Call @model @key(fields: ["receiverId", "senderId"]) @key(name: "bySender", fields: ["senderId", "receiverId"]) {
senderId: ID!
receiverId: ID!
}
input CreateCallInput {
receiverId: ID!
}
input DeleteCallInput {
receiverId: ID!
}
`;
const transformer = new GraphQLTransform({
transformers: [new DynamoDBModelTransformer(), new KeyTransformer()],
featureFlags: ff,
});
const out = transformer.transform(validSchema);
expect(out).toBeDefined();
const schema = parse(out.schema);

// checlk for delete input
const DeleteCallInput: InputObjectTypeDefinitionNode = schema.definitions.find(
d => d.kind === 'InputObjectTypeDefinition' && d.name.value === 'DeleteCallInput',
) as InputObjectTypeDefinitionNode | undefined;
expect(DeleteCallInput).toBeDefined();
const receiverIdField = DeleteCallInput.fields.find(f => f.name.value === 'receiverId');
expect(receiverIdField).toBeDefined();
expect(receiverIdField.type.kind).toBe('NonNullType');
const senderIdField = DeleteCallInput.fields.find(f => f.name.value === 'senderId');
expect(senderIdField).toBeDefined();
expect(senderIdField.type.kind).toBe('NonNullType');

// check for create input
const CreateCallInput: InputObjectTypeDefinitionNode = schema.definitions.find(
d => d.kind === 'InputObjectTypeDefinition' && d.name.value === 'CreateCallInput',
) as InputObjectTypeDefinitionNode | undefined;
expect(CreateCallInput).toBeDefined();
const receiverIdFieldCreate = CreateCallInput.fields.find(f => f.name.value === 'receiverId');
expect(receiverIdFieldCreate).toBeDefined();
expect(receiverIdFieldCreate.type.kind).toBe('NonNullType');
const senderIdFieldCreate = CreateCallInput.fields.find(f => f.name.value === 'senderId');
expect(senderIdFieldCreate).toBeUndefined();
});

it('@model mutation with queries', () => {
const validSchema = /* GraphQL */ `
type Call @model(queries: null) @key(fields: ["receiverId", "senderId"]) @key(name: "bySender", fields: ["senderId", "receiverId"]) {
senderId: ID!
receiverId: ID!
}
input CreateCallInput {
receiverId: ID!
}
input DeleteCallInput {
receiverId: ID!
}
`;
const transformer = new GraphQLTransform({
transformers: [new DynamoDBModelTransformer(), new KeyTransformer()],
featureFlags: ff,
});
const out = transformer.transform(validSchema);
expect(out).toBeDefined();
const schema = parse(out.schema);

// checlk for delete input
const DeleteCallInput: InputObjectTypeDefinitionNode = schema.definitions.find(
d => d.kind === 'InputObjectTypeDefinition' && d.name.value === 'DeleteCallInput',
) as InputObjectTypeDefinitionNode | undefined;
expect(DeleteCallInput).toBeDefined();
const receiverIdField = DeleteCallInput.fields.find(f => f.name.value === 'receiverId');
expect(receiverIdField).toBeDefined();
expect(receiverIdField.type.kind).toBe('NonNullType');
const senderIdField = DeleteCallInput.fields.find(f => f.name.value === 'senderId');
expect(senderIdField).toBeDefined();
expect(senderIdField.type.kind).toBe('NonNullType');

// check for create input
const CreateCallInput: InputObjectTypeDefinitionNode = schema.definitions.find(
d => d.kind === 'InputObjectTypeDefinition' && d.name.value === 'CreateCallInput',
) as InputObjectTypeDefinitionNode | undefined;
expect(CreateCallInput).toBeDefined();
const receiverIdFieldCreate = CreateCallInput.fields.find(f => f.name.value === 'receiverId');
expect(receiverIdFieldCreate).toBeDefined();
expect(receiverIdFieldCreate.type.kind).toBe('NonNullType');
const senderIdFieldCreate = CreateCallInput.fields.find(f => f.name.value === 'senderId');
expect(senderIdFieldCreate).toBeUndefined();
});

it('id field should be optional in updateInputObjects when it is not a primary key', () => {
const validSchema = /* GraphQL */ `
type Review
Expand Down Expand Up @@ -425,6 +518,6 @@ describe('check schema input', () => {
expect(UpdateReviewInput).toBeDefined();
const idField = UpdateReviewInput.fields.find(f => f.name.value === 'id');
expect(idField).toBeDefined();
expect(idField.type.kind).toBe('NonNullType');
expect(idField.type.kind).toBe('NamedType');
});
});

0 comments on commit 2b59309

Please sign in to comment.