File size: 1,254 Bytes
fea99b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
}