@@ -9,6 +9,7 @@ const LineStatGetter = require('../src/services/line-stat-getter');
9
9
const ResourcesGetter = require ( '../src/services/resources-getter' ) ;
10
10
const ResourceGetter = require ( '../src/services/resource-getter' ) ;
11
11
const ResourceCreator = require ( '../src/services/resource-creator' ) ;
12
+ const BelongsToUpdater = require ( '../src/services/belongs-to-updater' ) ;
12
13
const ResourceRemover = require ( '../src/services/resource-remover' ) ;
13
14
const HasManyGetter = require ( '../src/services/has-many-getter' ) ;
14
15
const HasManyDissociator = require ( '../src/services/has-many-dissociator' ) ;
@@ -45,6 +46,20 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
45
46
age : { type : Sequelize . INTEGER } ,
46
47
} ) ;
47
48
49
+ models . member = sequelize . define ( 'member' , {
50
+ name : { type : Sequelize . STRING } ,
51
+ } ) ;
52
+
53
+ models . membership = sequelize . define ( 'membership' , {
54
+ type : { type : Sequelize . STRING } ,
55
+ memberId : { type : Sequelize . INTEGER } ,
56
+ } ) ;
57
+
58
+ models . friend = sequelize . define ( 'friend' , {
59
+ name : { type : Sequelize . STRING } ,
60
+ memberId : { type : Sequelize . INTEGER } ,
61
+ } ) ;
62
+
48
63
models . bike = sequelize . define ( 'bike' , {
49
64
id : {
50
65
type : Sequelize . UUID ,
@@ -104,6 +119,10 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
104
119
models . user . hasMany ( models . address ) ;
105
120
models . team . belongsToMany ( models . user , { through : 'userTeam' } ) ;
106
121
models . user . belongsToMany ( models . team , { through : 'userTeam' } ) ;
122
+ models . membership . belongsTo ( models . member ) ;
123
+ models . member . hasOne ( models . membership ) ;
124
+ models . member . hasMany ( models . friend ) ;
125
+ models . friend . belongsTo ( models . member ) ;
107
126
108
127
Interface . Schemas = {
109
128
schemas : {
@@ -219,6 +238,38 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
219
238
{ field : 'team' , type : 'Number' , reference : 'team.id' } ,
220
239
] ,
221
240
} ,
241
+ member : {
242
+ name : 'member' ,
243
+ idField : 'id' ,
244
+ primaryKeys : [ 'id' ] ,
245
+ isCompositePrimary : false ,
246
+ fields : [
247
+ { field : 'id' , type : 'Number' } ,
248
+ { field : 'name' , type : 'String' } ,
249
+ ] ,
250
+ } ,
251
+ membership : {
252
+ name : 'membership' ,
253
+ idField : 'id' ,
254
+ primaryKeys : [ 'id' ] ,
255
+ isCompositePrimary : false ,
256
+ fields : [
257
+ { field : 'id' , type : 'Number' } ,
258
+ { field : 'type' , type : 'String' } ,
259
+ { field : 'member' , type : 'Number' , reference : 'member.id' } ,
260
+ ] ,
261
+ } ,
262
+ friend : {
263
+ name : 'friend' ,
264
+ idField : 'id' ,
265
+ primaryKeys : [ 'id' ] ,
266
+ isCompositePrimary : false ,
267
+ fields : [
268
+ { field : 'id' , type : 'Number' } ,
269
+ { field : 'name' , type : 'String' } ,
270
+ { field : 'member' , type : 'Number' , reference : 'member.id' } ,
271
+ ] ,
272
+ } ,
222
273
} ,
223
274
} ;
224
275
@@ -504,6 +555,111 @@ const HasManyDissociator = require('../src/services/has-many-dissociator');
504
555
} ) ;
505
556
} ) ;
506
557
558
+ describe ( 'resources > resources updater' , ( ) => {
559
+ describe ( 'update a record on a collection' , ( ) => {
560
+ it ( 'should update a record' , async ( ) => {
561
+ expect . assertions ( 2 ) ;
562
+ const { models } = initializeSequelize ( ) ;
563
+ try {
564
+ await new ResourceCreator ( models . member , {
565
+ id : 1 ,
566
+ name : 'foo' ,
567
+ } ) . perform ( ) ;
568
+ await new ResourceCreator ( models . member , {
569
+ id : 2 ,
570
+ name : 'bar' ,
571
+ } ) . perform ( ) ;
572
+ await new ResourceCreator ( models . friend , {
573
+ id : 1 ,
574
+ name : 'foo' ,
575
+ memberId : 1 ,
576
+ } ) . perform ( ) ;
577
+ const result = await new BelongsToUpdater ( models . friend , null , null , {
578
+ recordId : '1' ,
579
+ associationName : 'member' ,
580
+ } , {
581
+ data : {
582
+ id : '2' ,
583
+ type : 'member' ,
584
+ } ,
585
+ } ) . perform ( ) ;
586
+
587
+ expect ( result . id ) . toStrictEqual ( 1 ) ;
588
+ expect ( result . memberId ) . toStrictEqual ( '2' ) ;
589
+ } finally {
590
+ connectionManager . closeConnection ( ) ;
591
+ }
592
+ } ) ;
593
+
594
+ it ( 'should update a record with hasOne association' , async ( ) => {
595
+ expect . assertions ( 2 ) ;
596
+ const { models } = initializeSequelize ( ) ;
597
+ try {
598
+ await new ResourceCreator ( models . membership , {
599
+ id : 1 ,
600
+ type : 'basic' ,
601
+ memberId : 1 ,
602
+ } ) . perform ( ) ;
603
+ await new ResourceCreator ( models . membership , {
604
+ id : 2 ,
605
+ type : 'premium' ,
606
+ memberId : 2 ,
607
+ } ) . perform ( ) ;
608
+ await new BelongsToUpdater ( models . member , null , null , {
609
+ recordId : '1' ,
610
+ associationName : 'membership' ,
611
+ } , {
612
+ data : {
613
+ id : '2' ,
614
+ type : 'membership' ,
615
+ } ,
616
+ } ) . perform ( ) ;
617
+
618
+ const member = await models . member . findOne ( {
619
+ where : { id : 1 } ,
620
+ include : { model : models . membership } ,
621
+ } ) ;
622
+ expect ( member ) . not . toBeNull ( ) ;
623
+ expect ( member . membership . id ) . toStrictEqual ( 2 ) ;
624
+ } finally {
625
+ connectionManager . closeConnection ( ) ;
626
+ }
627
+ } ) ;
628
+
629
+ it ( 'should not update a record' , async ( ) => {
630
+ expect . assertions ( 1 ) ;
631
+ const { models } = initializeSequelize ( ) ;
632
+ try {
633
+ await expect ( new BelongsToUpdater ( models . member , null , null , {
634
+ recordId : '1' ,
635
+ associationName : 'membership' ,
636
+ } , {
637
+ data : {
638
+ id : '999' ,
639
+ type : 'membership' ,
640
+ } ,
641
+ } ) . perform ( ) ) . rejects . toThrow ( Error ( 'related membership with pk 999 does not exist.' ) ) ;
642
+ } finally {
643
+ connectionManager . closeConnection ( ) ;
644
+ }
645
+ } ) ;
646
+
647
+ it ( 'should not update a record if no data' , async ( ) => {
648
+ expect . assertions ( 1 ) ;
649
+ const { models } = initializeSequelize ( ) ;
650
+ try {
651
+ const result = await new BelongsToUpdater ( models . member , null , null , {
652
+ recordId : '1' ,
653
+ associationName : 'membership' ,
654
+ } , { } ) . perform ( ) ;
655
+ expect ( result ) . toBeNull ( ) ;
656
+ } finally {
657
+ connectionManager . closeConnection ( ) ;
658
+ }
659
+ } ) ;
660
+ } ) ;
661
+ } ) ;
662
+
507
663
describe ( 'resources > resources getter' , ( ) => {
508
664
describe ( 'request on the resources getter without page size' , ( ) => {
509
665
it ( 'should generate a valid SQL query' , async ( ) => {
0 commit comments