gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package db_test
  4. import (
  5. "path/filepath"
  6. "testing"
  7. "code.gitea.io/gitea/models/db"
  8. issues_model "code.gitea.io/gitea/models/issues"
  9. "code.gitea.io/gitea/models/unittest"
  10. "code.gitea.io/gitea/modules/setting"
  11. _ "code.gitea.io/gitea/cmd" // for TestPrimaryKeys
  12. "github.com/stretchr/testify/assert"
  13. "github.com/stretchr/testify/require"
  14. )
  15. func TestDumpDatabase(t *testing.T) {
  16. assert.NoError(t, unittest.PrepareTestDatabase())
  17. dir := t.TempDir()
  18. type Version struct {
  19. ID int64 `xorm:"pk autoincr"`
  20. Version int64
  21. }
  22. assert.NoError(t, db.GetEngine(t.Context()).Sync(new(Version)))
  23. for _, dbType := range setting.SupportedDatabaseTypes {
  24. assert.NoError(t, db.DumpDatabase(filepath.Join(dir, dbType+".sql"), dbType))
  25. }
  26. }
  27. func TestDeleteOrphanedObjects(t *testing.T) {
  28. assert.NoError(t, unittest.PrepareTestDatabase())
  29. countBefore, err := db.GetEngine(t.Context()).Count(&issues_model.PullRequest{})
  30. assert.NoError(t, err)
  31. _, err = db.GetEngine(t.Context()).Insert(&issues_model.PullRequest{IssueID: 1000}, &issues_model.PullRequest{IssueID: 1001}, &issues_model.PullRequest{IssueID: 1003})
  32. assert.NoError(t, err)
  33. orphaned, err := db.CountOrphanedObjects(t.Context(), "pull_request", "issue", "pull_request.issue_id=issue.id")
  34. assert.NoError(t, err)
  35. assert.EqualValues(t, 3, orphaned)
  36. err = db.DeleteOrphanedObjects(t.Context(), "pull_request", "issue", "pull_request.issue_id=issue.id")
  37. assert.NoError(t, err)
  38. countAfter, err := db.GetEngine(t.Context()).Count(&issues_model.PullRequest{})
  39. assert.NoError(t, err)
  40. assert.Equal(t, countBefore, countAfter)
  41. }
  42. func TestPrimaryKeys(t *testing.T) {
  43. // Some dbs require that all tables have primary keys, see
  44. // https://github.com/go-gitea/gitea/issues/21086
  45. // https://github.com/go-gitea/gitea/issues/16802
  46. // To avoid creating tables without primary key again, this test will check them.
  47. // Import "code.gitea.io/gitea/cmd" to make sure each db.RegisterModel in init functions has been called.
  48. beans, err := db.NamesToBean()
  49. require.NoError(t, err)
  50. whitelist := map[string]string{
  51. "the_table_name_to_skip_checking": "Write a note here to explain why",
  52. }
  53. for _, bean := range beans {
  54. table, err := db.GetXORMEngineForTesting().TableInfo(bean)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. if why, ok := whitelist[table.Name]; ok {
  59. t.Logf("ignore %q because %q", table.Name, why)
  60. continue
  61. }
  62. assert.NotEmpty(t, table.PrimaryKeys, "table %q has no primary key", table.Name)
  63. }
  64. }