@@ -21,6 +21,19 @@ func TestNewMigration(t *testing.T) {
21
21
require .Equal (t , migration .Lock , new )
22
22
}
23
23
24
+ func TestNewMigration_SelfRef (t * testing.T ) {
25
+ old := mkSchema ()
26
+ new := mkSchema (mkTable (
27
+ "selfref" ,
28
+ mkCol ("id" , SerialColumn , true , false , nil ),
29
+ mkCol ("parent_id" , BigIntColumn , false , false , mkRef ("selfref" , "id" , true )),
30
+ mkCol ("child_id" , BigIntColumn , false , false , mkRef ("selfref" , "id" , false )),
31
+ ))
32
+
33
+ _ , err := NewMigration (old , new )
34
+ require .NoError (t , err )
35
+ }
36
+
24
37
var table1 = mkTable (
25
38
"table" ,
26
39
mkCol ("id" , SerialColumn , true , true , nil ),
@@ -29,7 +42,7 @@ var table1 = mkTable(
29
42
30
43
var table2 = mkTable (
31
44
"table2" ,
32
- mkCol ("table_id" , SerialColumn , false , true , mkRef ("table" , "id" )),
45
+ mkCol ("table_id" , SerialColumn , false , true , mkRef ("table" , "id" , false )),
33
46
mkCol ("num" , NumericColumn (20 ), false , false , nil ),
34
47
)
35
48
@@ -198,31 +211,31 @@ func TestColumnSchemaDiff(t *testing.T) {
198
211
{
199
212
"ref added" ,
200
213
mkCol ("foo" , TextColumn , false , false , nil ),
201
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
214
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
202
215
true ,
203
216
},
204
217
{
205
218
"ref removed" ,
206
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
219
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
207
220
mkCol ("foo" , TextColumn , false , false , nil ),
208
221
true ,
209
222
},
210
223
{
211
224
"ref table changed" ,
212
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
213
- mkCol ("foo" , TextColumn , false , false , mkRef ("bar" , "bar" )),
225
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
226
+ mkCol ("foo" , TextColumn , false , false , mkRef ("bar" , "bar" , false )),
214
227
true ,
215
228
},
216
229
{
217
230
"ref col changed" ,
218
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
219
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "foo" )),
231
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
232
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "foo" , false )),
220
233
true ,
221
234
},
222
235
{
223
236
"ref col unchanged" ,
224
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
225
- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
237
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
238
+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
226
239
false ,
227
240
},
228
241
{
@@ -368,25 +381,25 @@ func TestColumnSchemaEquals(t *testing.T) {
368
381
{
369
382
"one of the references is nil" ,
370
383
mkCol ("foo" , TextColumn , false , false , nil ),
371
- mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" )),
384
+ mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" , false )),
372
385
false ,
373
386
},
374
387
{
375
388
"reference table does not match" ,
376
- mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" )),
377
- mkCol ("foo" , TextColumn , false , false , mkRef ("b" , "b" )),
389
+ mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" , false )),
390
+ mkCol ("foo" , TextColumn , false , false , mkRef ("b" , "b" , false )),
378
391
false ,
379
392
},
380
393
{
381
394
"reference column does not match" ,
382
- mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" )),
383
- mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "a" )),
395
+ mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" , false )),
396
+ mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "a" , false )),
384
397
false ,
385
398
},
386
399
{
387
400
"equal with reference" ,
388
- mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" )),
389
- mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" )),
401
+ mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" , false )),
402
+ mkCol ("foo" , TextColumn , false , false , mkRef ("a" , "b" , false )),
390
403
true ,
391
404
},
392
405
{
@@ -407,7 +420,7 @@ func TestChangeSetSorted(t *testing.T) {
407
420
mkTable ("table2" ),
408
421
mkTable (
409
422
"table1" ,
410
- mkCol ("foo" , SerialColumn , false , false , mkRef ("table2" , "bar" )),
423
+ mkCol ("foo" , SerialColumn , false , false , mkRef ("table2" , "bar" , false )),
411
424
),
412
425
mkTable ("table3" ),
413
426
)
@@ -416,7 +429,7 @@ func TestChangeSetSorted(t *testing.T) {
416
429
mkTable ("table4" ),
417
430
mkTable (
418
431
"table5" ,
419
- mkCol ("foo" , SerialColumn , false , false , mkRef ("table4" , "bar" )),
432
+ mkCol ("foo" , SerialColumn , false , false , mkRef ("table4" , "bar" , false )),
420
433
),
421
434
)
422
435
cs := SchemaDiff (old , new )
@@ -486,6 +499,16 @@ func (s *PackageTransformerSuite) SetupTest() {
486
499
s .Require ().NoError (err )
487
500
}
488
501
502
+ func (s * PackageTransformerSuite ) TestMigrationCircularDep () {
503
+ require := s .Require ()
504
+ schema , err := s .t .transform (s .pkg )
505
+ require .NoError (err )
506
+ require .NotNil (schema )
507
+
508
+ _ , err = NewMigration (mkSchema (), schema )
509
+ require .NoError (err )
510
+ }
511
+
489
512
func (s * PackageTransformerSuite ) TestTransform () {
490
513
require := s .Require ()
491
514
schema , err := s .t .transform (s .pkg )
@@ -498,14 +521,14 @@ func (s *PackageTransformerSuite) TestTransform() {
498
521
mkCol ("id" , SerialColumn , true , false , nil ),
499
522
mkCol ("color" , ColumnType ("char(6)" ), false , false , nil ),
500
523
mkCol ("background" , TextColumn , false , false , nil ),
501
- mkCol ("user_id" , UUIDColumn , false , false , mkRef ("users" , "id" )),
524
+ mkCol ("user_id" , UUIDColumn , false , false , mkRef ("users" , "id" , true )),
502
525
mkCol ("spouse" , UUIDColumn , false , false , nil ),
503
526
),
504
527
mkTable (
505
528
"metadata" ,
506
529
mkCol ("id" , SerialColumn , true , false , nil ),
507
530
mkCol ("metadata" , JSONBColumn , false , false , nil ),
508
- mkCol ("profile_id" , BigIntColumn , false , false , mkRef ("profiles" , "id" )),
531
+ mkCol ("profile_id" , BigIntColumn , false , false , mkRef ("profiles" , "id" , false )),
509
532
),
510
533
mkTable (
511
534
"users" ,
@@ -589,6 +612,6 @@ func mkCol(name string, typ ColumnType, pk, notNull bool, ref *Reference) *Colum
589
612
return & ColumnSchema {name , typ , pk , ref , notNull }
590
613
}
591
614
592
- func mkRef (table , col string ) * Reference {
593
- return & Reference {table , col }
615
+ func mkRef (table , col string , inverse bool ) * Reference {
616
+ return & Reference {table , col , inverse }
594
617
}
0 commit comments