go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/db/dbgen/foreign_key_test.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package dbgen 9 10 import ( 11 "context" 12 "testing" 13 "time" 14 15 "go.charczuk.com/sdk/assert" 16 "go.charczuk.com/sdk/db" 17 "go.charczuk.com/sdk/db/migration" 18 "go.charczuk.com/sdk/testutil" 19 ) 20 21 func Test_ForeignKey(t *testing.T) { 22 fk := ForeignKey(childModelTest{}, "parent_id", modelTest{}, "id") 23 assert.ItsEqual(t, "ALTER TABLE child_model_test ADD CONSTRAINT fk_child_model_test_parent_id FOREIGN KEY (parent_id) REFERENCES model_test(id)", fk) 24 } 25 26 func Test_ForeignKey_badColumns_object(t *testing.T) { 27 var p any 28 func() { 29 defer func() { 30 p = recover() 31 }() 32 _ = ForeignKey(childModelTest{}, "random_column", modelTest{}, "id") 33 }() 34 assert.ItsNotEmpty(t, p.(string)) 35 } 36 37 func Test_ForeignKey_badColumns_reference(t *testing.T) { 38 var p any 39 func() { 40 defer func() { 41 p = recover() 42 }() 43 _ = ForeignKey(childModelTest{}, "parent_id", modelTest{}, "NOPE") 44 }() 45 assert.ItsNotEmpty(t, p.(string)) 46 } 47 48 func Test_ForeignKey_integration(t *testing.T) { 49 tx, err := testutil.DefaultDB().BeginTx(context.Background()) 50 assert.ItsNil(t, err) 51 defer tx.Rollback() 52 53 suite := migration.NewWithActions( 54 TableFrom(modelTest{}), 55 TableFrom(childModelTest{}, 56 ForeignKey(childModelTest{}, "parent_id", modelTest{}, "id"), 57 ), 58 ) 59 60 err = suite.ApplyTx(context.Background(), testutil.DefaultDB(), tx) 61 assert.ItsNil(t, err) 62 63 obj := modelTest{ 64 Elapsed: 500 * time.Millisecond, 65 Int64: 1, 66 Int: 2, 67 Int32: 2, 68 Name: "test_object", 69 } 70 err = testutil.DefaultDB().Invoke(db.OptTx(tx)).Create(&obj) 71 assert.ItsNil(t, err) 72 73 childObj := childModelTest{ 74 ParentID: obj.ID, 75 Name: "test_object", 76 } 77 err = testutil.DefaultDB().Invoke(db.OptTx(tx)).Create(&childObj) 78 assert.ItsNil(t, err) 79 }