11// Copyright 2021 The Gitea Authors. All rights reserved.
22// SPDX-License-Identifier: MIT
33
4- //nolint:forbidigo
54package unittest
65
76import (
87 "fmt"
9- "os"
10- "time"
118
129 "code.gitea.io/gitea/models/db"
1310 "code.gitea.io/gitea/modules/auth/password/hash"
1411 "code.gitea.io/gitea/modules/setting"
12+ "code.gitea.io/gitea/modules/util"
1513
16- "github.com/go-testfixtures/testfixtures/v3"
1714 "xorm.io/xorm"
1815 "xorm.io/xorm/schemas"
1916)
2017
21- var fixturesLoader * testfixtures. Loader
18+ var defaultFixturesLoader * fixturesLoader
2219
2320// GetXORMEngine gets the XORM engine
24- func GetXORMEngine (engine ... * xorm.Engine ) (x * xorm.Engine ) {
25- if len (engine ) == 1 {
26- return engine [0 ]
27- }
21+ func GetXORMEngine () (x * xorm.Engine ) {
2822 return db .GetEngine (db .DefaultContext ).(* xorm.Engine )
2923}
3024
3125// InitFixtures initialize test fixtures for a test database
3226func InitFixtures (opts FixturesOptions , engine ... * xorm.Engine ) (err error ) {
33- e := GetXORMEngine (engine ... )
34- var fixtureOptionFiles func (* testfixtures.Loader ) error
35- if opts .Dir != "" {
36- fixtureOptionFiles = testfixtures .Directory (opts .Dir )
37- } else {
38- fixtureOptionFiles = testfixtures .Files (opts .Files ... )
39- }
40- dialect := "unknown"
41- switch e .Dialect ().URI ().DBType {
42- case schemas .POSTGRES :
43- dialect = "postgres"
44- case schemas .MYSQL :
45- dialect = "mysql"
46- case schemas .MSSQL :
47- dialect = "mssql"
48- case schemas .SQLITE :
49- dialect = "sqlite3"
50- default :
51- fmt .Println ("Unsupported RDBMS for integration tests" )
52- os .Exit (1 )
53- }
54- loaderOptions := []func (loader * testfixtures.Loader ) error {
55- testfixtures .Database (e .DB ().DB ),
56- testfixtures .Dialect (dialect ),
57- testfixtures .DangerousSkipTestDatabaseCheck (),
58- fixtureOptionFiles ,
59- }
60-
61- if e .Dialect ().URI ().DBType == schemas .POSTGRES {
62- loaderOptions = append (loaderOptions , testfixtures .SkipResetSequences ())
63- }
64-
65- fixturesLoader , err = testfixtures .New (loaderOptions ... )
66- if err != nil {
67- return err
68- }
27+ defaultFixturesLoader = & fixturesLoader {engine : util .IfZero (util .OptionalArg (engine ), GetXORMEngine ()), opts : opts }
6928
7029 // register the dummy hash algorithm function used in the test fixtures
7130 _ = hash .Register ("dummy" , hash .NewDummyHasher )
72-
7331 setting .PasswordHashAlgo , _ = hash .SetDefaultPasswordHashAlgorithm ("dummy" )
74-
7532 return err
7633}
7734
78- // LoadFixtures load fixtures for a test database
79- func LoadFixtures (engine ... * xorm.Engine ) error {
80- e := GetXORMEngine (engine ... )
81- var err error
82- // (doubt) database transaction conflicts could occur and result in ROLLBACK? just try for a few times.
83- for i := 0 ; i < 5 ; i ++ {
84- if err = fixturesLoader .Load (); err == nil {
85- break
86- }
87- time .Sleep (200 * time .Millisecond )
88- }
89- if err != nil {
90- fmt .Printf ("LoadFixtures failed after retries: %v\n " , err )
91- }
92- // Now if we're running postgres we need to tell it to update the sequences
93- if e .Dialect ().URI ().DBType == schemas .POSTGRES {
94- results , err := e .QueryString (`SELECT 'SELECT SETVAL(' ||
35+ func loadFixtureResetSeqPgsql (e * xorm.Engine ) error {
36+ results , err := e .QueryString (`SELECT 'SELECT SETVAL(' ||
9537 quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
9638 ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
9739 quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
@@ -107,22 +49,30 @@ func LoadFixtures(engine ...*xorm.Engine) error {
10749 AND D.refobjsubid = C.attnum
10850 AND T.relname = PGT.tablename
10951 ORDER BY S.relname;` )
110- if err != nil {
111- fmt .Printf ("Failed to generate sequence update: %v\n " , err )
112- return err
113- }
114- for _ , r := range results {
115- for _ , value := range r {
116- _ , err = e .Exec (value )
117- if err != nil {
118- fmt .Printf ("Failed to update sequence: %s Error: %v\n " , value , err )
119- return err
120- }
52+ if err != nil {
53+ return fmt .Errorf ("failed to generate sequence update: %w" , err )
54+ }
55+ for _ , r := range results {
56+ for _ , value := range r {
57+ _ , err = e .Exec (value )
58+ if err != nil {
59+ return fmt .Errorf ("failed to update sequence: %s, error: %w" , value , err )
12160 }
12261 }
12362 }
124- _ = hash . Register ( "dummy" , hash . NewDummyHasher )
125- setting . PasswordHashAlgo , _ = hash . SetDefaultPasswordHashAlgorithm ( "dummy" )
63+ return nil
64+ }
12665
127- return err
66+ // LoadFixtures load fixtures for a test database
67+ func LoadFixtures () error {
68+ if err := defaultFixturesLoader .Load (); err != nil {
69+ return err
70+ }
71+ // Now if we're running postgres we need to tell it to update the sequences
72+ if defaultFixturesLoader .engine .Dialect ().URI ().DBType == schemas .POSTGRES {
73+ if err := loadFixtureResetSeqPgsql (defaultFixturesLoader .engine ); err != nil {
74+ return err
75+ }
76+ }
77+ return nil
12878}
0 commit comments