@@ -114,6 +114,16 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
114
114
fieldBad : { type : Sequelize . REAL } , // NOTICE: not supported yet.
115
115
} ) ;
116
116
117
+ models . owner = sequelize . define ( 'owner' , {
118
+ name : { type : Sequelize . STRING } ,
119
+ ownerId : { type : Sequelize . INTEGER , allowNull : false , unique : true } ,
120
+ } ) ;
121
+
122
+ models . project = sequelize . define ( 'project' , {
123
+ name : { type : Sequelize . STRING } ,
124
+ ownerId : { type : Sequelize . INTEGER } ,
125
+ } ) ;
126
+
117
127
models . address . belongsTo ( models . user ) ;
118
128
models . addressWithUserAlias . belongsTo ( models . user , { as : 'userAlias' } ) ;
119
129
models . user . hasMany ( models . address ) ;
@@ -123,6 +133,20 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
123
133
models . member . hasOne ( models . membership ) ;
124
134
models . member . hasMany ( models . friend ) ;
125
135
models . friend . belongsTo ( models . member ) ;
136
+ models . project . belongsTo ( models . owner , {
137
+ foreignKey : {
138
+ name : 'ownerIdKey' ,
139
+ field : 'owner_id' ,
140
+ } ,
141
+ targetKey : 'ownerId' ,
142
+ } ) ;
143
+ models . owner . hasMany ( models . project , {
144
+ foreignKey : {
145
+ name : 'ownerIdKey' ,
146
+ field : 'owner_id' ,
147
+ } ,
148
+ sourceKey : 'ownerId' ,
149
+ } ) ;
126
150
127
151
Interface . Schemas = {
128
152
schemas : {
@@ -270,6 +294,28 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
270
294
{ field : 'member' , type : 'Number' , reference : 'member.id' } ,
271
295
] ,
272
296
} ,
297
+ owner : {
298
+ name : 'owner' ,
299
+ idField : 'id' ,
300
+ primaryKeys : [ 'id' ] ,
301
+ isCompositePrimary : false ,
302
+ fields : [
303
+ { field : 'id' , type : 'Number' } ,
304
+ { field : 'name' , type : 'STRING' } ,
305
+ { field : 'ownerId' , type : 'Number' } ,
306
+ ] ,
307
+ } ,
308
+ project : {
309
+ name : 'project' ,
310
+ idField : 'id' ,
311
+ primaryKeys : [ 'id' ] ,
312
+ isCompositePrimary : false ,
313
+ fields : [
314
+ { field : 'id' , type : 'Number' } ,
315
+ { field : 'name' , type : 'STRING' } ,
316
+ { field : 'ownerId' , type : 'Number' , reference : 'owner.ownerId' } ,
317
+ ] ,
318
+ } ,
273
319
} ,
274
320
} ;
275
321
@@ -533,6 +579,55 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
533
579
} ) ;
534
580
} ) ;
535
581
582
+ describe ( 'create a record on a collection with a foreign key non pointing to a primary key' , ( ) => {
583
+ it ( 'should create a record' , async ( ) => {
584
+ expect . assertions ( 6 ) ;
585
+ const { models } = initializeSequelize ( ) ;
586
+ try {
587
+ await new ResourceCreator ( models . owner , {
588
+ id : 1 ,
589
+ name : 'foo' ,
590
+ ownerId : 3 ,
591
+ } ) . perform ( ) ;
592
+ const result = await new ResourceCreator ( models . project , {
593
+ id : 1 ,
594
+ name : 'bar' ,
595
+ owner : 1 ,
596
+ } ) . perform ( ) ;
597
+
598
+ expect ( result . id ) . toStrictEqual ( 1 ) ;
599
+ expect ( result . name ) . toStrictEqual ( 'bar' ) ;
600
+ expect ( result . ownerIdKey ) . toStrictEqual ( 3 ) ;
601
+
602
+ const project = await models . project . findOne ( { where : { name : 'bar' } , include : { model : models . owner , as : 'owner' } } ) ;
603
+ expect ( project ) . not . toBeNull ( ) ;
604
+ expect ( project . owner . id ) . toStrictEqual ( 1 ) ;
605
+ expect ( project . owner . ownerId ) . toStrictEqual ( 3 ) ;
606
+ } finally {
607
+ connectionManager . closeConnection ( ) ;
608
+ }
609
+ } ) ;
610
+
611
+ it ( 'should not create a record' , async ( ) => {
612
+ expect . assertions ( 1 ) ;
613
+ const { models } = initializeSequelize ( ) ;
614
+ try {
615
+ await new ResourceCreator ( models . owner , {
616
+ id : 2 ,
617
+ name : 'foo' ,
618
+ ownerId : 4 ,
619
+ } ) . perform ( ) ;
620
+ await expect ( new ResourceCreator ( models . project , {
621
+ id : 1 ,
622
+ name : 'bar' ,
623
+ owner : 4 ,
624
+ } ) . perform ( ) ) . rejects . toThrow ( Error ( 'related owner with pk 4 does not exist.' ) ) ;
625
+ } finally {
626
+ connectionManager . closeConnection ( ) ;
627
+ }
628
+ } ) ;
629
+ } ) ;
630
+
536
631
describe ( 'create a record on a collection with a composite primary key' , ( ) => {
537
632
it ( 'should create a record' , async ( ) => {
538
633
expect . assertions ( 3 ) ;
@@ -658,6 +753,56 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
658
753
}
659
754
} ) ;
660
755
} ) ;
756
+ describe ( 'update a record on a collection with a foreign key non pointing to a primary key' , ( ) => {
757
+ it ( 'should update a record' , async ( ) => {
758
+ expect . assertions ( 2 ) ;
759
+ const { models } = initializeSequelize ( ) ;
760
+ try {
761
+ await new ResourceCreator ( models . owner , {
762
+ id : 3 ,
763
+ name : 'foo3' ,
764
+ ownerId : 5 ,
765
+ } ) . perform ( ) ;
766
+ const result = await new BelongsToUpdater ( models . project , null , null , {
767
+ recordId : '1' ,
768
+ associationName : 'owner' ,
769
+ } , {
770
+ data : {
771
+ id : '3' ,
772
+ type : 'owner' ,
773
+ } ,
774
+ } ) . perform ( ) ;
775
+
776
+ expect ( result . id ) . toStrictEqual ( 1 ) ;
777
+ expect ( result . ownerIdKey ) . toStrictEqual ( 5 ) ;
778
+ } finally {
779
+ connectionManager . closeConnection ( ) ;
780
+ }
781
+ } ) ;
782
+
783
+ it ( 'should not update a record' , async ( ) => {
784
+ expect . assertions ( 1 ) ;
785
+ const { models } = initializeSequelize ( ) ;
786
+ try {
787
+ await new ResourceCreator ( models . owner , {
788
+ id : 4 ,
789
+ name : 'foo4' ,
790
+ ownerId : 6 ,
791
+ } ) . perform ( ) ;
792
+ await expect ( new BelongsToUpdater ( models . project , null , null , {
793
+ recordId : '1' ,
794
+ associationName : 'owner' ,
795
+ } , {
796
+ data : {
797
+ id : '6' ,
798
+ type : 'owner' ,
799
+ } ,
800
+ } ) . perform ( ) ) . rejects . toThrow ( Error ( 'related owner with pk 6 does not exist.' ) ) ;
801
+ } finally {
802
+ connectionManager . closeConnection ( ) ;
803
+ }
804
+ } ) ;
805
+ } ) ;
661
806
} ) ;
662
807
663
808
describe ( 'resources > resources getter' , ( ) => {
0 commit comments