@@ -21,6 +21,19 @@ func TestNewMigration(t *testing.T) {
2121 require .Equal (t , migration .Lock , new )
2222}
2323
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+
2437var table1 = mkTable (
2538 "table" ,
2639 mkCol ("id" , SerialColumn , true , true , nil ),
@@ -29,7 +42,7 @@ var table1 = mkTable(
2942
3043var table2 = mkTable (
3144 "table2" ,
32- mkCol ("table_id" , SerialColumn , false , true , mkRef ("table" , "id" )),
45+ mkCol ("table_id" , SerialColumn , false , true , mkRef ("table" , "id" , false )),
3346 mkCol ("num" , NumericColumn (20 ), false , false , nil ),
3447)
3548
@@ -198,31 +211,31 @@ func TestColumnSchemaDiff(t *testing.T) {
198211 {
199212 "ref added" ,
200213 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 )),
202215 true ,
203216 },
204217 {
205218 "ref removed" ,
206- mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" )),
219+ mkCol ("foo" , TextColumn , false , false , mkRef ("foo" , "bar" , false )),
207220 mkCol ("foo" , TextColumn , false , false , nil ),
208221 true ,
209222 },
210223 {
211224 "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 )),
214227 true ,
215228 },
216229 {
217230 "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 )),
220233 true ,
221234 },
222235 {
223236 "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 )),
226239 false ,
227240 },
228241 {
@@ -368,25 +381,25 @@ func TestColumnSchemaEquals(t *testing.T) {
368381 {
369382 "one of the references is nil" ,
370383 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 )),
372385 false ,
373386 },
374387 {
375388 "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 )),
378391 false ,
379392 },
380393 {
381394 "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 )),
384397 false ,
385398 },
386399 {
387400 "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 )),
390403 true ,
391404 },
392405 {
@@ -407,7 +420,7 @@ func TestChangeSetSorted(t *testing.T) {
407420 mkTable ("table2" ),
408421 mkTable (
409422 "table1" ,
410- mkCol ("foo" , SerialColumn , false , false , mkRef ("table2" , "bar" )),
423+ mkCol ("foo" , SerialColumn , false , false , mkRef ("table2" , "bar" , false )),
411424 ),
412425 mkTable ("table3" ),
413426 )
@@ -416,7 +429,7 @@ func TestChangeSetSorted(t *testing.T) {
416429 mkTable ("table4" ),
417430 mkTable (
418431 "table5" ,
419- mkCol ("foo" , SerialColumn , false , false , mkRef ("table4" , "bar" )),
432+ mkCol ("foo" , SerialColumn , false , false , mkRef ("table4" , "bar" , false )),
420433 ),
421434 )
422435 cs := SchemaDiff (old , new )
@@ -486,6 +499,16 @@ func (s *PackageTransformerSuite) SetupTest() {
486499 s .Require ().NoError (err )
487500}
488501
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+
489512func (s * PackageTransformerSuite ) TestTransform () {
490513 require := s .Require ()
491514 schema , err := s .t .transform (s .pkg )
@@ -498,14 +521,14 @@ func (s *PackageTransformerSuite) TestTransform() {
498521 mkCol ("id" , SerialColumn , true , false , nil ),
499522 mkCol ("color" , ColumnType ("char(6)" ), false , false , nil ),
500523 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 )),
502525 mkCol ("spouse" , UUIDColumn , false , false , nil ),
503526 ),
504527 mkTable (
505528 "metadata" ,
506529 mkCol ("id" , SerialColumn , true , false , nil ),
507530 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 )),
509532 ),
510533 mkTable (
511534 "users" ,
@@ -589,6 +612,6 @@ func mkCol(name string, typ ColumnType, pk, notNull bool, ref *Reference) *Colum
589612 return & ColumnSchema {name , typ , pk , ref , notNull }
590613}
591614
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 }
594617}
0 commit comments