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  }