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  }