@@ -56,7 +56,7 @@ describe('process connection', () => {
56
56
57
57
it ( 'should return HAS_MANY for Post.comments field connection info' , ( ) => {
58
58
const commentsField = modelMap . Post . fields [ 0 ] ;
59
- const connectionInfo = ( processConnections ( commentsField , modelMap . Post , modelMap ) as any ) as CodeGenFieldConnectionHasMany ;
59
+ const connectionInfo = ( processConnections ( commentsField , modelMap . Post , modelMap , true ) as any ) as CodeGenFieldConnectionHasMany ;
60
60
expect ( connectionInfo ) . toBeDefined ( ) ;
61
61
62
62
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . HAS_MANY ) ;
@@ -66,7 +66,7 @@ describe('process connection', () => {
66
66
67
67
it ( 'should return BELONGS_TO for Comment.post field connection info' , ( ) => {
68
68
const postField = modelMap . Comment . fields [ 0 ] ;
69
- const connectionInfo = ( processConnections ( postField , modelMap . Comment , modelMap ) as any ) as CodeGenFieldConnectionBelongsTo ;
69
+ const connectionInfo = ( processConnections ( postField , modelMap . Comment , modelMap , true ) as any ) as CodeGenFieldConnectionBelongsTo ;
70
70
expect ( connectionInfo ) . toBeDefined ( ) ;
71
71
72
72
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . BELONGS_TO ) ;
@@ -120,7 +120,7 @@ describe('process connection', () => {
120
120
121
121
it ( 'should return HAS_ONE Person.license field' , ( ) => {
122
122
const licenseField = modelMap . Person . fields [ 0 ] ;
123
- const connectionInfo = ( processConnections ( licenseField , modelMap . Person , modelMap ) as any ) as CodeGenFieldConnectionHasOne ;
123
+ const connectionInfo = ( processConnections ( licenseField , modelMap . Person , modelMap , true ) as any ) as CodeGenFieldConnectionHasOne ;
124
124
expect ( connectionInfo ) . toBeDefined ( ) ;
125
125
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . HAS_ONE ) ;
126
126
expect ( connectionInfo . associatedWith ) . toEqual ( modelMap . License . fields [ 0 ] ) ;
@@ -130,7 +130,7 @@ describe('process connection', () => {
130
130
131
131
it ( 'should return BELONGS_TO License.person field' , ( ) => {
132
132
const personField = modelMap . License . fields [ 0 ] ;
133
- const connectionInfo = ( processConnections ( personField , modelMap . License , modelMap ) as any ) as CodeGenFieldConnectionBelongsTo ;
133
+ const connectionInfo = ( processConnections ( personField , modelMap . License , modelMap , true ) as any ) as CodeGenFieldConnectionBelongsTo ;
134
134
expect ( connectionInfo ) . toBeDefined ( ) ;
135
135
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . BELONGS_TO ) ;
136
136
expect ( connectionInfo . isConnectingFieldAutoCreated ) . toEqual ( true ) ;
@@ -141,9 +141,98 @@ describe('process connection', () => {
141
141
// Make person field optional
142
142
personField . isNullable = true ;
143
143
expect ( ( ) => {
144
- processConnections ( personField , modelMap . License , modelMap ) ;
144
+ processConnections ( personField , modelMap . License , modelMap , true ) ;
145
145
} ) . toThrowError ( 'DataStore does not support 1 to 1 connection with both sides of connection as optional field' ) ;
146
146
} ) ;
147
+
148
+ describe ( 'Uni-directional connection' , ( ) => {
149
+ const schema = /* GraphQL */ `
150
+ type User @model {
151
+ id: ID!
152
+ }
153
+ type Session @model {
154
+ id: ID!
155
+ sessionUserId: ID!
156
+ user: User! @connection(fields: ["sessionUserId"])
157
+ }
158
+ ` ;
159
+
160
+ const modelMap : CodeGenModelMap = {
161
+ User : {
162
+ name : 'User' ,
163
+ type : 'model' ,
164
+ directives : [ ] ,
165
+ fields : [
166
+ {
167
+ type : 'ID' ,
168
+ isNullable : false ,
169
+ isList : false ,
170
+ name : 'id' ,
171
+ directives : [ ] ,
172
+ } ,
173
+ ] ,
174
+ } ,
175
+ Session : {
176
+ name : 'Session' ,
177
+ type : 'model' ,
178
+ directives : [ ] ,
179
+ fields : [
180
+ {
181
+ type : 'ID' ,
182
+ isNullable : false ,
183
+ isList : false ,
184
+ name : 'id' ,
185
+ directives : [ ] ,
186
+ } ,
187
+ {
188
+ type : 'ID' ,
189
+ isNullable : false ,
190
+ isList : false ,
191
+ name : 'sessionUserId' ,
192
+ directives : [ ] ,
193
+ } ,
194
+ {
195
+ type : 'User' ,
196
+ isNullable : false ,
197
+ isList : false ,
198
+ name : 'user' ,
199
+ directives : [ { name : 'connection' , arguments : { fields : [ 'sessionUserId' ] } } ] ,
200
+ } ,
201
+ ] ,
202
+ } ,
203
+ } ;
204
+
205
+ it ( 'uni-directional One:One connection with required field and datastore is not enabled' , ( ) => {
206
+ const connectionInfo = ( processConnections ( modelMap . Session . fields [ 2 ] , modelMap . User , modelMap , false ) as any ) as CodeGenFieldConnectionBelongsTo ;
207
+ expect ( connectionInfo ) . toBeDefined ( ) ;
208
+ expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . HAS_ONE ) ;
209
+ expect ( connectionInfo . isConnectingFieldAutoCreated ) . toEqual ( false ) ;
210
+ } ) ;
211
+
212
+ it ( 'uni-directional One:One connection with optional field and datastore is not enabled' , ( ) => {
213
+ const field = { ...modelMap . Session . fields [ 2 ] } ;
214
+ field . isNullable = true ;
215
+ const connectionInfo = ( processConnections ( field , modelMap . User , modelMap , false ) as any ) as CodeGenFieldConnectionBelongsTo ;
216
+ expect ( connectionInfo ) . toBeDefined ( ) ;
217
+ expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . HAS_ONE ) ;
218
+ expect ( connectionInfo . isConnectingFieldAutoCreated ) . toEqual ( false ) ;
219
+ } ) ;
220
+
221
+ it ( 'uni-directional One:One connection with required field and datastore is enabled' , ( ) => {
222
+ expect ( ( ) => {
223
+ processConnections ( modelMap . Session . fields [ 2 ] , modelMap . User , modelMap , true ) ;
224
+ } ) . toThrowError ( 'DataStore does not support 1 to 1 connection with both sides of connection as optional field' ) ;
225
+ } ) ;
226
+
227
+ it ( 'uni-directional One:One connection with optional field and datastore is enabled' , ( ) => {
228
+ const field = { ...modelMap . Session . fields [ 2 ] } ;
229
+ field . isNullable = true ;
230
+ const connectionInfo = ( processConnections ( field , modelMap . User , modelMap , true ) as any ) as CodeGenFieldConnectionBelongsTo ;
231
+ expect ( connectionInfo ) . toBeDefined ( ) ;
232
+ expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . HAS_ONE ) ;
233
+ expect ( connectionInfo . isConnectingFieldAutoCreated ) . toEqual ( false ) ;
234
+ } ) ;
235
+ } ) ;
147
236
} ) ;
148
237
} ) ;
149
238
describe ( 'Uni-directional connection (unnamed connection)' , ( ) => {
@@ -192,7 +281,7 @@ describe('process connection', () => {
192
281
193
282
it ( 'should return HAS_MANY for Post.comments' , ( ) => {
194
283
const commentsField = modelMap . Post . fields [ 0 ] ;
195
- const connectionInfo = ( processConnections ( commentsField , modelMap . Post , modelMap ) as any ) as CodeGenFieldConnectionHasMany ;
284
+ const connectionInfo = ( processConnections ( commentsField , modelMap . Post , modelMap , true ) as any ) as CodeGenFieldConnectionHasMany ;
196
285
expect ( connectionInfo ) . toBeDefined ( ) ;
197
286
198
287
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . HAS_MANY ) ;
@@ -208,7 +297,7 @@ describe('process connection', () => {
208
297
209
298
it ( 'should return BELONGS_TO for Comment.post' , ( ) => {
210
299
const commentsField = modelMap . Comment . fields [ 0 ] ;
211
- const connectionInfo = ( processConnections ( commentsField , modelMap . Comment , modelMap ) as any ) as CodeGenFieldConnectionBelongsTo ;
300
+ const connectionInfo = ( processConnections ( commentsField , modelMap . Comment , modelMap , true ) as any ) as CodeGenFieldConnectionBelongsTo ;
212
301
expect ( connectionInfo ) . toBeDefined ( ) ;
213
302
214
303
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . BELONGS_TO ) ;
@@ -280,12 +369,12 @@ describe('process connection', () => {
280
369
281
370
it ( 'should not throw error if connection directive has keyName' , ( ) => {
282
371
const commentsField = modelMap . Post . fields [ 0 ] ;
283
- expect ( ( ) => processConnections ( commentsField , modelMap . Post , modelMap ) ) . not . toThrowError ( ) ;
372
+ expect ( ( ) => processConnections ( commentsField , modelMap . Post , modelMap , true ) ) . not . toThrowError ( ) ;
284
373
} ) ;
285
374
286
375
it ( 'should support connection with @key on BELONGS_TO side' , ( ) => {
287
376
const postField = modelMap . Comment . fields [ 2 ] ;
288
- const connectionInfo = ( processConnections ( postField , modelMap . Post , modelMap ) as any ) as CodeGenFieldConnectionBelongsTo ;
377
+ const connectionInfo = ( processConnections ( postField , modelMap . Post , modelMap , true ) as any ) as CodeGenFieldConnectionBelongsTo ;
289
378
expect ( connectionInfo ) . toBeDefined ( ) ;
290
379
expect ( connectionInfo . kind ) . toEqual ( CodeGenConnectionType . BELONGS_TO ) ;
291
380
expect ( connectionInfo . targetName ) . toEqual ( modelMap . Comment . fields [ 0 ] . name ) ;
@@ -462,4 +551,4 @@ describe('process connection', () => {
462
551
expect ( getConnectedField ( subordinateField , employeeModel , employeeModel ) ) . toEqual ( supervisorField ) ;
463
552
} ) ;
464
553
} ) ;
465
- } ) ;
554
+ } ) ;
0 commit comments