github.com/Accefy/pop@v0.0.0-20230428174248-e9f677eab5b9/connection_test.go (about) 1 //go:build sqlite 2 // +build sqlite 3 4 package pop 5 6 import ( 7 "context" 8 "fmt" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 ) 13 14 func Test_Connection_SimpleFlow(t *testing.T) { 15 r := require.New(t) 16 17 cd := &ConnectionDetails{ 18 URL: "sqlite:///foo.db", 19 } 20 c, err := NewConnection(cd) 21 r.NoError(err) 22 23 err = c.Open() 24 r.NoError(err) 25 err = c.Open() // open again 26 r.NoError(err) 27 err = c.Close() 28 r.NoError(err) 29 } 30 31 func Test_Connection_Open_Close_Reopen(t *testing.T) { 32 r := require.New(t) 33 34 c, err := NewConnection(&ConnectionDetails{ 35 URL: "sqlite://file::memory:?_fk=true", 36 }) 37 r.NoError(err) 38 39 for i := 0; i < 2; i++ { 40 r.NoError(c.Open()) 41 r.NoError(c.Transaction(func(c *Connection) error { return nil })) 42 r.NoError(c.Close()) 43 } 44 } 45 46 func Test_Connection_Open_NoDialect(t *testing.T) { 47 r := require.New(t) 48 49 cd := &ConnectionDetails{ 50 URL: "sqlite:///foo.db", 51 } 52 c, err := NewConnection(cd) 53 r.NoError(err) 54 55 c.Dialect = nil 56 err = c.Open() 57 r.Error(err) 58 } 59 60 func Test_Connection_Open_BadDriver(t *testing.T) { 61 r := require.New(t) 62 63 cd := &ConnectionDetails{ 64 URL: "sqlite:///foo.db", 65 } 66 c, err := NewConnection(cd) 67 r.NoError(err) 68 69 cd.Driver = "unknown" 70 err = c.Open() 71 r.Error(err) 72 } 73 74 func Test_Connection_NewTransaction(t *testing.T) { 75 r := require.New(t) 76 ctx := context.WithValue(context.Background(), "test", "test") 77 78 c, err := NewConnection(&ConnectionDetails{ 79 URL: "sqlite://file::memory:?_fk=true", 80 }) 81 r.NoError(err) 82 r.NoError(c.Open()) 83 c = c.WithContext(ctx) 84 85 t.Run("func=NewTransaction", func(t *testing.T) { 86 r := require.New(t) 87 tx, err := c.NewTransaction() 88 r.NoError(err) 89 90 // has transaction and context 91 r.NotNil(tx.TX) 92 r.Nil(c.TX) 93 r.Equal(ctx, tx.Context()) 94 95 // does not start a new transaction 96 ntx, err := tx.NewTransaction() 97 r.Equal(tx, ntx) 98 99 r.NoError(tx.TX.Rollback()) 100 }) 101 102 t.Run("func=NewTransactionContext", func(t *testing.T) { 103 r := require.New(t) 104 nctx := context.WithValue(ctx, "nested", "test") 105 tx, err := c.NewTransactionContext(nctx) 106 r.NoError(err) 107 108 // has transaction and context 109 r.NotNil(tx.TX) 110 r.Nil(c.TX) 111 r.Equal(nctx, tx.Context()) 112 113 r.NoError(tx.TX.Rollback()) 114 }) 115 } 116 117 func Test_Connection_Transaction(t *testing.T) { 118 r := require.New(t) 119 120 c, err := NewConnection(&ConnectionDetails{ 121 URL: "sqlite://file::memory:?_fk=true", 122 }) 123 r.NoError(err) 124 r.NoError(c.Open()) 125 126 t.Run("Success", func(t *testing.T) { 127 err = c.Transaction(func(c *Connection) error { 128 return nil 129 }) 130 r.NoError(err) 131 }) 132 133 t.Run("Failed", func(t *testing.T) { 134 err = c.Transaction(func(c *Connection) error { 135 return fmt.Errorf("failed") 136 }) 137 r.ErrorContains(err, "failed") 138 }) 139 140 t.Run("Panic", func(t *testing.T) { 141 r.PanicsWithValue("inner function panic", func() { 142 c.Transaction(func(c *Connection) error { 143 panic("inner function panic") 144 }) 145 }) 146 }) 147 }