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  }