gitea源码

index_test.go 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package db_test
  4. import (
  5. "context"
  6. "errors"
  7. "fmt"
  8. "testing"
  9. "code.gitea.io/gitea/models/db"
  10. "code.gitea.io/gitea/models/unittest"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. type TestIndex db.ResourceIndex
  14. func getCurrentResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
  15. e := db.GetEngine(ctx)
  16. var idx int64
  17. has, err := e.SQL(fmt.Sprintf("SELECT max_index FROM %s WHERE group_id=?", tableName), groupID).Get(&idx)
  18. if err != nil {
  19. return 0, err
  20. }
  21. if !has {
  22. return 0, errors.New("no record")
  23. }
  24. return idx, nil
  25. }
  26. func TestSyncMaxResourceIndex(t *testing.T) {
  27. assert.NoError(t, unittest.PrepareTestDatabase())
  28. xe := unittest.GetXORMEngine()
  29. assert.NoError(t, xe.Sync(&TestIndex{}))
  30. err := db.SyncMaxResourceIndex(t.Context(), "test_index", 10, 51)
  31. assert.NoError(t, err)
  32. // sync new max index
  33. maxIndex, err := getCurrentResourceIndex(t.Context(), "test_index", 10)
  34. assert.NoError(t, err)
  35. assert.EqualValues(t, 51, maxIndex)
  36. // smaller index doesn't change
  37. err = db.SyncMaxResourceIndex(t.Context(), "test_index", 10, 30)
  38. assert.NoError(t, err)
  39. maxIndex, err = getCurrentResourceIndex(t.Context(), "test_index", 10)
  40. assert.NoError(t, err)
  41. assert.EqualValues(t, 51, maxIndex)
  42. // larger index changes
  43. err = db.SyncMaxResourceIndex(t.Context(), "test_index", 10, 62)
  44. assert.NoError(t, err)
  45. maxIndex, err = getCurrentResourceIndex(t.Context(), "test_index", 10)
  46. assert.NoError(t, err)
  47. assert.EqualValues(t, 62, maxIndex)
  48. // commit transaction
  49. err = db.WithTx(t.Context(), func(ctx context.Context) error {
  50. err = db.SyncMaxResourceIndex(ctx, "test_index", 10, 73)
  51. assert.NoError(t, err)
  52. maxIndex, err = getCurrentResourceIndex(ctx, "test_index", 10)
  53. assert.NoError(t, err)
  54. assert.EqualValues(t, 73, maxIndex)
  55. return nil
  56. })
  57. assert.NoError(t, err)
  58. maxIndex, err = getCurrentResourceIndex(t.Context(), "test_index", 10)
  59. assert.NoError(t, err)
  60. assert.EqualValues(t, 73, maxIndex)
  61. // rollback transaction
  62. err = db.WithTx(t.Context(), func(ctx context.Context) error {
  63. err = db.SyncMaxResourceIndex(ctx, "test_index", 10, 84)
  64. maxIndex, err = getCurrentResourceIndex(ctx, "test_index", 10)
  65. assert.NoError(t, err)
  66. assert.EqualValues(t, 84, maxIndex)
  67. return errors.New("test rollback")
  68. })
  69. assert.Error(t, err)
  70. maxIndex, err = getCurrentResourceIndex(t.Context(), "test_index", 10)
  71. assert.NoError(t, err)
  72. assert.EqualValues(t, 73, maxIndex) // the max index doesn't change because the transaction was rolled back
  73. }
  74. func TestGetNextResourceIndex(t *testing.T) {
  75. assert.NoError(t, unittest.PrepareTestDatabase())
  76. xe := unittest.GetXORMEngine()
  77. assert.NoError(t, xe.Sync(&TestIndex{}))
  78. // create a new record
  79. maxIndex, err := db.GetNextResourceIndex(t.Context(), "test_index", 20)
  80. assert.NoError(t, err)
  81. assert.EqualValues(t, 1, maxIndex)
  82. // increase the existing record
  83. maxIndex, err = db.GetNextResourceIndex(t.Context(), "test_index", 20)
  84. assert.NoError(t, err)
  85. assert.EqualValues(t, 2, maxIndex)
  86. // commit transaction
  87. err = db.WithTx(t.Context(), func(ctx context.Context) error {
  88. maxIndex, err = db.GetNextResourceIndex(ctx, "test_index", 20)
  89. assert.NoError(t, err)
  90. assert.EqualValues(t, 3, maxIndex)
  91. return nil
  92. })
  93. assert.NoError(t, err)
  94. maxIndex, err = getCurrentResourceIndex(t.Context(), "test_index", 20)
  95. assert.NoError(t, err)
  96. assert.EqualValues(t, 3, maxIndex)
  97. // rollback transaction
  98. err = db.WithTx(t.Context(), func(ctx context.Context) error {
  99. maxIndex, err = db.GetNextResourceIndex(ctx, "test_index", 20)
  100. assert.NoError(t, err)
  101. assert.EqualValues(t, 4, maxIndex)
  102. return errors.New("test rollback")
  103. })
  104. assert.Error(t, err)
  105. maxIndex, err = getCurrentResourceIndex(t.Context(), "test_index", 20)
  106. assert.NoError(t, err)
  107. assert.EqualValues(t, 3, maxIndex) // the max index doesn't change because the transaction was rolled back
  108. }