1
1
// Copyright 2021 The Gitea Authors. All rights reserved.
2
2
// SPDX-License-Identifier: MIT
3
3
4
- //nolint:forbidigo
5
4
package unittest
6
5
7
6
import (
8
7
"fmt"
9
- "os"
10
- "time"
11
8
12
9
"code.gitea.io/gitea/models/db"
13
10
"code.gitea.io/gitea/modules/auth/password/hash"
14
11
"code.gitea.io/gitea/modules/setting"
12
+ "code.gitea.io/gitea/modules/util"
15
13
16
- "github.com/go-testfixtures/testfixtures/v3"
17
14
"xorm.io/xorm"
18
15
"xorm.io/xorm/schemas"
19
16
)
20
17
21
- var fixturesLoader * testfixtures. Loader
18
+ var defaultFixturesLoader * fixturesLoader
22
19
23
20
// 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 ) {
28
22
return db .GetEngine (db .DefaultContext ).(* xorm.Engine )
29
23
}
30
24
31
25
// InitFixtures initialize test fixtures for a test database
32
26
func 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 }
69
28
70
29
// register the dummy hash algorithm function used in the test fixtures
71
30
_ = hash .Register ("dummy" , hash .NewDummyHasher )
72
-
73
31
setting .PasswordHashAlgo , _ = hash .SetDefaultPasswordHashAlgorithm ("dummy" )
74
-
75
32
return err
76
33
}
77
34
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(' ||
95
37
quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
96
38
', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
97
39
quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
@@ -107,22 +49,30 @@ func LoadFixtures(engine ...*xorm.Engine) error {
107
49
AND D.refobjsubid = C.attnum
108
50
AND T.relname = PGT.tablename
109
51
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 )
121
60
}
122
61
}
123
62
}
124
- _ = hash . Register ( "dummy" , hash . NewDummyHasher )
125
- setting . PasswordHashAlgo , _ = hash . SetDefaultPasswordHashAlgorithm ( "dummy" )
63
+ return nil
64
+ }
126
65
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
128
78
}
0 commit comments