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