package transaction import ( "context" "testing" "github.com/stretchr/testify/require" ) type testContextKey struct{} func TestRunInNewTransactionShadowsParentTransaction(t *testing.T) { parent := context.WithValue(t.Context(), testContextKey{}, "kept") parent, err := SetDriverOnContext(parent, noopDriver{}) require.NoError(t, err) createdDriver := &noopDriver{} creator := &noopCreator{driver: createdDriver} _, err = RunInNewTransaction(parent, creator, func(ctx context.Context) (interface{}, error) { require.Equal(t, "kept", ctx.Value(testContextKey{})) driver, err := GetDriverFromContext(ctx) require.NoError(t, err) require.Same(t, createdDriver, driver) return nil, nil }) require.NoError(t, err) require.True(t, creator.called) driver, err := GetDriverFromContext(parent) require.NoError(t, err) require.NotEqual(t, createdDriver, driver) } type noopDriver struct{} func (noopDriver) Commit() error { return nil } func (noopDriver) Rollback() error { return nil } func (noopDriver) SavePoint() error { return nil } type noopCreator struct { called bool driver Driver } func (n *noopCreator) Tx(ctx context.Context) (context.Context, Driver, error) { n.called = true return ctx, n.driver, nil }