Skip to content

Commit 02e6351

Browse files
authored
Merge pull request #286 from edwardfoyle/index-fix
2 parents 9557e05 + dd7f4d3 commit 02e6351

File tree

11 files changed

+524
-100
lines changed

11 files changed

+524
-100
lines changed
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
import { processIndex } from '../../utils/process-index';
2+
import { CodeGenModel } from '../../visitors/appsync-visitor';
3+
4+
describe('processIndex', () => {
5+
it('adds multiple compound @index directives as model key attributes', () => {
6+
const model: CodeGenModel = {
7+
directives: [
8+
{
9+
name: 'model',
10+
arguments: {},
11+
},
12+
],
13+
name: 'testModel',
14+
type: 'model',
15+
fields: [
16+
{
17+
type: 'field',
18+
isList: false,
19+
isNullable: true,
20+
name: 'connectionField',
21+
directives: [
22+
{
23+
name: 'index',
24+
arguments: {
25+
name: 'byItem',
26+
sortKeyFields: ['sortField'],
27+
},
28+
},
29+
],
30+
},
31+
{
32+
type: 'field',
33+
isList: false,
34+
isNullable: true,
35+
name: 'anotherConnection',
36+
directives: [
37+
{
38+
name: 'index',
39+
arguments: {
40+
name: 'byAnother',
41+
sortKeyFields: ['anotherSortField'],
42+
},
43+
},
44+
],
45+
},
46+
],
47+
};
48+
processIndex(model);
49+
expect(model.directives).toEqual([
50+
{
51+
name: 'model',
52+
arguments: {},
53+
},
54+
{
55+
name: 'key',
56+
arguments: {
57+
name: 'byItem',
58+
fields: ['connectionField', 'sortField'],
59+
},
60+
},
61+
{
62+
name: 'key',
63+
arguments: {
64+
name: 'byAnother',
65+
fields: ['anotherConnection', 'anotherSortField'],
66+
},
67+
},
68+
]);
69+
});
70+
71+
it('adds simple @index directives as model key attributes', () => {
72+
const model: CodeGenModel = {
73+
directives: [
74+
{
75+
name: 'model',
76+
arguments: {},
77+
},
78+
],
79+
name: 'testModel',
80+
type: 'model',
81+
fields: [
82+
{
83+
type: 'field',
84+
isList: false,
85+
isNullable: true,
86+
name: 'connectionField',
87+
directives: [
88+
{
89+
name: 'index',
90+
arguments: {
91+
name: 'byItem',
92+
},
93+
},
94+
],
95+
},
96+
{
97+
type: 'field',
98+
isList: false,
99+
isNullable: true,
100+
name: 'anotherConnection',
101+
directives: [
102+
{
103+
name: 'index',
104+
arguments: {
105+
name: 'byAnother',
106+
},
107+
},
108+
],
109+
},
110+
],
111+
};
112+
processIndex(model);
113+
expect(model.directives).toEqual([
114+
{
115+
name: 'model',
116+
arguments: {},
117+
},
118+
{
119+
name: 'key',
120+
arguments: {
121+
name: 'byItem',
122+
fields: ['connectionField'],
123+
},
124+
},
125+
{
126+
name: 'key',
127+
arguments: {
128+
name: 'byAnother',
129+
fields: ['anotherConnection'],
130+
},
131+
},
132+
]);
133+
});
134+
135+
it('does nothing if no @index directives in model', () => {
136+
const model: CodeGenModel = {
137+
directives: [
138+
{
139+
name: 'model',
140+
arguments: {},
141+
},
142+
],
143+
name: 'testModel',
144+
type: 'model',
145+
fields: [
146+
{
147+
type: 'field',
148+
isList: false,
149+
isNullable: true,
150+
name: 'aNormalField',
151+
directives: [],
152+
},
153+
{
154+
type: 'field',
155+
isList: false,
156+
isNullable: true,
157+
name: 'anotherNormalField',
158+
directives: [],
159+
},
160+
],
161+
};
162+
processIndex(model);
163+
expect(model.directives).toEqual([
164+
{
165+
name: 'model',
166+
arguments: {},
167+
},
168+
]);
169+
});
170+
171+
it('does not add duplicate indexes', () => {
172+
const model: CodeGenModel = {
173+
directives: [
174+
{
175+
name: 'model',
176+
arguments: {},
177+
},
178+
{
179+
name: 'key',
180+
arguments: {
181+
name: 'byItem',
182+
fields: ['connectionField'],
183+
},
184+
},
185+
],
186+
name: 'testModel',
187+
type: 'model',
188+
fields: [
189+
{
190+
type: 'field',
191+
isList: false,
192+
isNullable: true,
193+
name: 'connectionField',
194+
directives: [
195+
{
196+
name: 'index',
197+
arguments: {
198+
name: 'byItem',
199+
},
200+
},
201+
],
202+
},
203+
{
204+
type: 'field',
205+
isList: false,
206+
isNullable: true,
207+
name: 'anotherConnection',
208+
directives: [
209+
{
210+
name: 'index',
211+
arguments: {
212+
name: 'byAnother',
213+
},
214+
},
215+
],
216+
},
217+
],
218+
};
219+
processIndex(model);
220+
expect(model.directives.length).toBe(3);
221+
});
222+
});
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import { processPrimaryKey } from '../../utils/process-primary-key';
2+
import { CodeGenModel } from '../../visitors/appsync-visitor';
3+
4+
describe('processPrimaryKey', () => {
5+
it('adds compound @primaryKey directive as model key attributes', () => {
6+
const model: CodeGenModel = {
7+
directives: [
8+
{
9+
name: 'model',
10+
arguments: {},
11+
},
12+
],
13+
name: 'testModel',
14+
type: 'model',
15+
fields: [
16+
{
17+
type: 'field',
18+
isList: false,
19+
isNullable: true,
20+
name: 'primaryField',
21+
directives: [
22+
{
23+
name: 'primaryKey',
24+
arguments: {
25+
sortKeyFields: ['sortField'],
26+
},
27+
},
28+
],
29+
},
30+
],
31+
};
32+
processPrimaryKey(model);
33+
expect(model.directives).toEqual([
34+
{
35+
name: 'model',
36+
arguments: {},
37+
},
38+
{
39+
name: 'key',
40+
arguments: {
41+
fields: ['primaryField', 'sortField'],
42+
},
43+
},
44+
]);
45+
});
46+
47+
it('adds simple @primaryKey directive as model key attributes', () => {
48+
const model: CodeGenModel = {
49+
directives: [
50+
{
51+
name: 'model',
52+
arguments: {},
53+
},
54+
],
55+
name: 'testModel',
56+
type: 'model',
57+
fields: [
58+
{
59+
type: 'field',
60+
isList: false,
61+
isNullable: true,
62+
name: 'primaryField',
63+
directives: [
64+
{
65+
name: 'primaryKey',
66+
arguments: {},
67+
},
68+
],
69+
},
70+
],
71+
};
72+
processPrimaryKey(model);
73+
expect(model.directives).toEqual([
74+
{
75+
name: 'model',
76+
arguments: {},
77+
},
78+
{
79+
name: 'key',
80+
arguments: {
81+
fields: ['primaryField'],
82+
},
83+
},
84+
]);
85+
});
86+
87+
it('does nothing if no @primaryKey directive in model', () => {
88+
const model: CodeGenModel = {
89+
directives: [
90+
{
91+
name: 'model',
92+
arguments: {},
93+
},
94+
],
95+
name: 'testModel',
96+
type: 'model',
97+
fields: [
98+
{
99+
type: 'field',
100+
isList: false,
101+
isNullable: true,
102+
name: 'normalField',
103+
directives: [],
104+
},
105+
],
106+
};
107+
processPrimaryKey(model);
108+
expect(model.directives).toEqual([
109+
{
110+
name: 'model',
111+
arguments: {},
112+
},
113+
]);
114+
});
115+
116+
it('does not add duplicate primaryKey', () => {
117+
const model: CodeGenModel = {
118+
directives: [
119+
{
120+
name: 'model',
121+
arguments: {},
122+
},
123+
{
124+
name: 'key',
125+
arguments: {
126+
fields: ['primaryField'],
127+
},
128+
},
129+
],
130+
name: 'testModel',
131+
type: 'model',
132+
fields: [
133+
{
134+
type: 'field',
135+
isList: false,
136+
isNullable: true,
137+
name: 'primaryField',
138+
directives: [
139+
{
140+
name: 'primaryKey',
141+
arguments: {},
142+
},
143+
],
144+
},
145+
],
146+
};
147+
processPrimaryKey(model);
148+
expect(model.directives.length).toBe(2);
149+
});
150+
});

0 commit comments

Comments
 (0)