code.gitea.io/gitea@v1.22.3/models/db/context_test.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package db_test 5 6 import ( 7 "context" 8 "testing" 9 10 "code.gitea.io/gitea/models/db" 11 "code.gitea.io/gitea/models/unittest" 12 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestInTransaction(t *testing.T) { 17 assert.NoError(t, unittest.PrepareTestDatabase()) 18 assert.False(t, db.InTransaction(db.DefaultContext)) 19 assert.NoError(t, db.WithTx(db.DefaultContext, func(ctx context.Context) error { 20 assert.True(t, db.InTransaction(ctx)) 21 return nil 22 })) 23 24 ctx, committer, err := db.TxContext(db.DefaultContext) 25 assert.NoError(t, err) 26 defer committer.Close() 27 assert.True(t, db.InTransaction(ctx)) 28 assert.NoError(t, db.WithTx(ctx, func(ctx context.Context) error { 29 assert.True(t, db.InTransaction(ctx)) 30 return nil 31 })) 32 } 33 34 func TestTxContext(t *testing.T) { 35 assert.NoError(t, unittest.PrepareTestDatabase()) 36 37 { // create new transaction 38 ctx, committer, err := db.TxContext(db.DefaultContext) 39 assert.NoError(t, err) 40 assert.True(t, db.InTransaction(ctx)) 41 assert.NoError(t, committer.Commit()) 42 } 43 44 { // reuse the transaction created by TxContext and commit it 45 ctx, committer, err := db.TxContext(db.DefaultContext) 46 engine := db.GetEngine(ctx) 47 assert.NoError(t, err) 48 assert.True(t, db.InTransaction(ctx)) 49 { 50 ctx, committer, err := db.TxContext(ctx) 51 assert.NoError(t, err) 52 assert.True(t, db.InTransaction(ctx)) 53 assert.Equal(t, engine, db.GetEngine(ctx)) 54 assert.NoError(t, committer.Commit()) 55 } 56 assert.NoError(t, committer.Commit()) 57 } 58 59 { // reuse the transaction created by TxContext and close it 60 ctx, committer, err := db.TxContext(db.DefaultContext) 61 engine := db.GetEngine(ctx) 62 assert.NoError(t, err) 63 assert.True(t, db.InTransaction(ctx)) 64 { 65 ctx, committer, err := db.TxContext(ctx) 66 assert.NoError(t, err) 67 assert.True(t, db.InTransaction(ctx)) 68 assert.Equal(t, engine, db.GetEngine(ctx)) 69 assert.NoError(t, committer.Close()) 70 } 71 assert.NoError(t, committer.Close()) 72 } 73 74 { // reuse the transaction created by WithTx 75 assert.NoError(t, db.WithTx(db.DefaultContext, func(ctx context.Context) error { 76 assert.True(t, db.InTransaction(ctx)) 77 { 78 ctx, committer, err := db.TxContext(ctx) 79 assert.NoError(t, err) 80 assert.True(t, db.InTransaction(ctx)) 81 assert.NoError(t, committer.Commit()) 82 } 83 return nil 84 })) 85 } 86 }