You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

engine_test.go 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. )
  14. func TestDumpDatabase(t *testing.T) {
  15. assert.NoError(t, unittest.PrepareTestDatabase())
  16. dir := t.TempDir()
  17. type Version struct {
  18. ID int64 `xorm:"pk autoincr"`
  19. Version int64
  20. }
  21. assert.NoError(t, db.GetEngine(db.DefaultContext).Sync(new(Version)))
  22. for _, dbType := range setting.SupportedDatabaseTypes {
  23. assert.NoError(t, db.DumpDatabase(filepath.Join(dir, dbType+".sql"), dbType))
  24. }
  25. }
  26. func TestDeleteOrphanedObjects(t *testing.T) {
  27. assert.NoError(t, unittest.PrepareTestDatabase())
  28. countBefore, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{})
  29. assert.NoError(t, err)
  30. _, err = db.GetEngine(db.DefaultContext).Insert(&issues_model.PullRequest{IssueID: 1000}, &issues_model.PullRequest{IssueID: 1001}, &issues_model.PullRequest{IssueID: 1003})
  31. assert.NoError(t, err)
  32. orphaned, err := db.CountOrphanedObjects(db.DefaultContext, "pull_request", "issue", "pull_request.issue_id=issue.id")
  33. assert.NoError(t, err)
  34. assert.EqualValues(t, 3, orphaned)
  35. err = db.DeleteOrphanedObjects(db.DefaultContext, "pull_request", "issue", "pull_request.issue_id=issue.id")
  36. assert.NoError(t, err)
  37. countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{})
  38. assert.NoError(t, err)
  39. assert.EqualValues(t, countBefore, countAfter)
  40. }
  41. func TestPrimaryKeys(t *testing.T) {
  42. // Some dbs require that all tables have primary keys, see
  43. // https://github.com/go-gitea/gitea/issues/21086
  44. // https://github.com/go-gitea/gitea/issues/16802
  45. // To avoid creating tables without primary key again, this test will check them.
  46. // Import "code.gitea.io/gitea/cmd" to make sure each db.RegisterModel in init functions has been called.
  47. beans, err := db.NamesToBean()
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. whitelist := map[string]string{
  52. "the_table_name_to_skip_checking": "Write a note here to explain why",
  53. }
  54. for _, bean := range beans {
  55. table, err := db.TableInfo(bean)
  56. if err != nil {
  57. t.Fatal(err)
  58. }
  59. if why, ok := whitelist[table.Name]; ok {
  60. t.Logf("ignore %q because %q", table.Name, why)
  61. continue
  62. }
  63. if len(table.PrimaryKeys) == 0 {
  64. t.Errorf("table %q has no primary key", table.Name)
  65. }
  66. }
  67. }