您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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