Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ const getNamedType = (opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>):
}),
)
.filter((value) => value !== null)
.map((v) => `(${v})`)
.join(' || ') || null
);
default:
Expand Down
14 changes: 7 additions & 7 deletions tests/useImplementingTypes/__snapshots__/spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ export const mockA = (overrides?: Partial<A>): A => {
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : 'de4b005e-2b2d-4843-94d1-d356d75d933b',
str: overrides && overrides.hasOwnProperty('str') ? overrides.str! : 'cuius',
obj: overrides && overrides.hasOwnProperty('obj') ? overrides.obj! : mockB(),
config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : mockTestAConfig() || mockTestTwoAConfig(),
configArray: overrides && overrides.hasOwnProperty('configArray') ? overrides.configArray! : [mockTestAConfig() || mockTestTwoAConfig()],
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : mockTestTwoAConfig(),
action: overrides && overrides.hasOwnProperty('action') ? overrides.action! : mockTestAction(),
config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : (mockTestAConfig()) || (mockTestTwoAConfig()),
configArray: overrides && overrides.hasOwnProperty('configArray') ? overrides.configArray! : [(mockTestAConfig()) || (mockTestTwoAConfig())],
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : (mockTestTwoAConfig()),
action: overrides && overrides.hasOwnProperty('action') ? overrides.action! : (mockTestAction()),
};
};

Expand Down Expand Up @@ -152,9 +152,9 @@ export const mockA = (overrides?: Partial<A>): A => {
str: overrides && overrides.hasOwnProperty('str') ? overrides.str! : 'cuius',
obj: overrides && overrides.hasOwnProperty('obj') ? overrides.obj! : mockB(),
config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : 'Karen.Prosacco@gmail.com',
configArray: overrides && overrides.hasOwnProperty('configArray') ? overrides.configArray! : [mockTestAConfig() || mockTestTwoAConfig()],
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : mockTestTwoAConfig(),
action: overrides && overrides.hasOwnProperty('action') ? overrides.action! : mockTestAction(),
configArray: overrides && overrides.hasOwnProperty('configArray') ? overrides.configArray! : [(mockTestAConfig()) || (mockTestTwoAConfig())],
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : (mockTestTwoAConfig()),
action: overrides && overrides.hasOwnProperty('action') ? overrides.action! : (mockTestAction()),
};
};

Expand Down
10 changes: 5 additions & 5 deletions tests/useImplementingTypes/spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ it('should support useImplementingTypes', async () => {
expect(result).toBeDefined();

expect(result).toContain(
"config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : mockTestAConfig() || mockTestTwoAConfig(),",
"config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : (mockTestAConfig()) || (mockTestTwoAConfig()),",
);

expect(result).toContain(
"configArray: overrides && overrides.hasOwnProperty('configArray') ? overrides.configArray! : [mockTestAConfig() || mockTestTwoAConfig()],",
"configArray: overrides && overrides.hasOwnProperty('configArray') ? overrides.configArray! : [(mockTestAConfig()) || (mockTestTwoAConfig())],",
);

expect(result).toContain(
"field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : mockTestTwoAConfig(),",
"field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : (mockTestTwoAConfig()),",
);

expect(result).toContain(
"action: overrides && overrides.hasOwnProperty('action') ? overrides.action! : mockTestAction(),",
"action: overrides && overrides.hasOwnProperty('action') ? overrides.action! : (mockTestAction()),",
);
expect(result).toMatchSnapshot();
});
Expand Down Expand Up @@ -51,7 +51,7 @@ it(`support useImplementingTypes with fieldGeneration prop`, async () => {
);

expect(result).toContain(
"config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : mockTestAConfig() || mockTestTwoAConfig(),",
"config: overrides && overrides.hasOwnProperty('config') ? overrides.config! : (mockTestAConfig()) || (mockTestTwoAConfig()),",
);

result = await plugin(testSchema, [], {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const mockD = (overrides?: Partial<D>): D => {

export const mockTest = (overrides?: Partial<Test>): Test => {
return {
field1: overrides && overrides.hasOwnProperty('field1') ? overrides.field1! : mockA() || mockB() || mockC() || mockD(),
field1: overrides && overrides.hasOwnProperty('field1') ? overrides.field1! : (mockA()) || (mockB()) || (mockC()) || (mockD()),
field2: overrides && overrides.hasOwnProperty('field2') ? overrides.field2! : null,
};
};
Expand Down
2 changes: 1 addition & 1 deletion tests/useImplementingTypesAndDefaultNullableToNull/spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ it('should support useImplementingTypes', async () => {
expect(result).toBeDefined();

expect(result).toContain(
"field1: overrides && overrides.hasOwnProperty('field1') ? overrides.field1! : mockA() || mockB() || mockC() || mockD(),",
"field1: overrides && overrides.hasOwnProperty('field1') ? overrides.field1! : (mockA()) || (mockB()) || (mockC()) || (mockD()),",
);

expect(result).toContain("field2: overrides && overrides.hasOwnProperty('field2') ? overrides.field2! : null,");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,61 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should parenthesize implementing types with 3+ implementations 1`] = `
"
export const mockQuery = (overrides?: Partial<Query>, _relationshipsToOmit: Set<string> = new Set()): Query => {
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
relationshipsToOmit.add('Query');
return {
getData: overrides && overrides.hasOwnProperty('getData') ? overrides.getData! : relationshipsToOmit.has('Container') ? {} as Container : mockContainer({}, relationshipsToOmit),
};
};

export const mockContainer = (overrides?: Partial<Container>, _relationshipsToOmit: Set<string> = new Set()): Container => {
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
relationshipsToOmit.add('Container');
return {
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : 'vindico',
dataItem: overrides && overrides.hasOwnProperty('dataItem') ? overrides.dataItem! : (relationshipsToOmit.has('TypeA') ? {} as TypeA : mockTypeA({}, relationshipsToOmit)) || (relationshipsToOmit.has('TypeB') ? {} as TypeB : mockTypeB({}, relationshipsToOmit)) || (relationshipsToOmit.has('TypeC') ? {} as TypeC : mockTypeC({}, relationshipsToOmit)),
};
};

export const mockDataItem = (overrides?: Partial<DataItem>, _relationshipsToOmit: Set<string> = new Set()): DataItem => {
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
relationshipsToOmit.add('DataItem');
return {
name: overrides && overrides.hasOwnProperty('name') ? overrides.name! : 'vitiosus',
};
};

export const mockTypeA = (overrides?: Partial<TypeA>, _relationshipsToOmit: Set<string> = new Set()): TypeA => {
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
relationshipsToOmit.add('TypeA');
return {
name: overrides && overrides.hasOwnProperty('name') ? overrides.name! : 'demens',
fieldA: overrides && overrides.hasOwnProperty('fieldA') ? overrides.fieldA! : 'occaecati',
};
};

export const mockTypeB = (overrides?: Partial<TypeB>, _relationshipsToOmit: Set<string> = new Set()): TypeB => {
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
relationshipsToOmit.add('TypeB');
return {
name: overrides && overrides.hasOwnProperty('name') ? overrides.name! : 'vitiosus',
fieldB: overrides && overrides.hasOwnProperty('fieldB') ? overrides.fieldB! : 'deputo',
};
};

export const mockTypeC = (overrides?: Partial<TypeC>, _relationshipsToOmit: Set<string> = new Set()): TypeC => {
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
relationshipsToOmit.add('TypeC');
return {
name: overrides && overrides.hasOwnProperty('name') ? overrides.name! : 'colo',
fieldC: overrides && overrides.hasOwnProperty('fieldC') ? overrides.fieldC! : 'claustrum',
};
};
"
`;

exports[`should support useImplementingTypes and terminateCircularRelationships at the same time 1`] = `
"
export const mockQuery = (overrides?: Partial<Query>, _relationshipsToOmit: Set<string> = new Set()): Query => {
Expand All @@ -15,7 +71,7 @@ export const mockUser = (overrides?: Partial<User>, _relationshipsToOmit: Set<st
relationshipsToOmit.add('User');
return {
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : 'suscipio',
events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)],
events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [(relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit)) || (relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit))],
};
};

Expand All @@ -36,7 +92,7 @@ export const mockMeetingEvent = (overrides?: Partial<MeetingEvent>, _relationshi
endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'adicio',
startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'altus',
timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'deprimo',
event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit),
event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : (relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit)) || (relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)),
};
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { plugin } from '../../src';
import testSchema from './schema';
import threeImplSchema from './threeImplSchema';

it('should support useImplementingTypes and terminateCircularRelationships at the same time', async () => {
const result = await plugin(testSchema, [], {
Expand All @@ -11,11 +12,28 @@ it('should support useImplementingTypes and terminateCircularRelationships at th
expect(result).toBeDefined();

expect(result).toContain(
"events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)]",
"events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [(relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit)) || (relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit))]",
);

expect(result).toContain(
"event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)",
"event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : (relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit)) || (relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit))",
);

expect(result).toMatchSnapshot();
});

it('should parenthesize implementing types with 3+ implementations', async () => {
const result = await plugin(threeImplSchema, [], {
prefix: 'mock',
useImplementingTypes: true,
terminateCircularRelationships: true,
});

expect(result).toBeDefined();

// Each ternary in the || chain must be wrapped in parentheses
expect(result).toContain(
"dataItem: overrides && overrides.hasOwnProperty('dataItem') ? overrides.dataItem! : (relationshipsToOmit.has('TypeA') ? {} as TypeA : mockTypeA({}, relationshipsToOmit)) || (relationshipsToOmit.has('TypeB') ? {} as TypeB : mockTypeB({}, relationshipsToOmit)) || (relationshipsToOmit.has('TypeC') ? {} as TypeC : mockTypeC({}, relationshipsToOmit))",
);

expect(result).toMatchSnapshot();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { buildSchema } from 'graphql';

export default buildSchema(/* GraphQL */ `
type Query {
getData(id: String!): Container
}

type Container {
id: String!
dataItem: DataItem!
}

interface DataItem {
name: String
}

type TypeA implements DataItem {
name: String
fieldA: String
}

type TypeB implements DataItem {
name: String
fieldB: String
}

type TypeC implements DataItem {
name: String
fieldC: String
}
`);
Loading