@@ -5,88 +5,29 @@ package unittest
5
5
6
6
import (
7
7
"fmt"
8
- "time"
9
8
10
9
"code.gitea.io/gitea/models/db"
11
10
"code.gitea.io/gitea/modules/auth/password/hash"
12
11
"code.gitea.io/gitea/modules/setting"
12
+ "code.gitea.io/gitea/modules/util"
13
13
14
- "github.com/go-testfixtures/testfixtures/v3"
15
14
"xorm.io/xorm"
16
15
"xorm.io/xorm/schemas"
17
16
)
18
17
19
- var fixturesLoader * testfixtures.Loader
20
-
21
- // GetXORMEngine gets the XORM engine
22
- func GetXORMEngine (engine ... * xorm.Engine ) (x * xorm.Engine ) {
23
- if len (engine ) == 1 {
24
- return engine [0 ]
25
- }
26
- return db .GetEngine (db .DefaultContext ).(* xorm.Engine )
18
+ type FixturesLoader interface {
19
+ Load () error
27
20
}
28
21
29
- // InitFixtures initialize test fixtures for a test database
30
- func InitFixtures (opts FixturesOptions , engine ... * xorm.Engine ) (err error ) {
31
- e := GetXORMEngine (engine ... )
32
- var fixtureOptionFiles func (* testfixtures.Loader ) error
33
- if opts .Dir != "" {
34
- fixtureOptionFiles = testfixtures .Directory (opts .Dir )
35
- } else {
36
- fixtureOptionFiles = testfixtures .Files (opts .Files ... )
37
- }
38
- var dialect string
39
- switch e .Dialect ().URI ().DBType {
40
- case schemas .POSTGRES :
41
- dialect = "postgres"
42
- case schemas .MYSQL :
43
- dialect = "mysql"
44
- case schemas .MSSQL :
45
- dialect = "mssql"
46
- case schemas .SQLITE :
47
- dialect = "sqlite3"
48
- default :
49
- return fmt .Errorf ("unsupported RDBMS for integration tests: %q" , e .Dialect ().URI ().DBType )
50
- }
51
- loaderOptions := []func (loader * testfixtures.Loader ) error {
52
- testfixtures .Database (e .DB ().DB ),
53
- testfixtures .Dialect (dialect ),
54
- testfixtures .DangerousSkipTestDatabaseCheck (),
55
- fixtureOptionFiles ,
56
- }
57
-
58
- if e .Dialect ().URI ().DBType == schemas .POSTGRES {
59
- loaderOptions = append (loaderOptions , testfixtures .SkipResetSequences ())
60
- }
22
+ var fixturesLoader FixturesLoader
61
23
62
- fixturesLoader , err = testfixtures .New (loaderOptions ... )
63
- if err != nil {
64
- return err
65
- }
66
-
67
- // register the dummy hash algorithm function used in the test fixtures
68
- _ = hash .Register ("dummy" , hash .NewDummyHasher )
69
- setting .PasswordHashAlgo , _ = hash .SetDefaultPasswordHashAlgorithm ("dummy" )
70
- return err
24
+ // GetXORMEngine gets the XORM engine
25
+ func GetXORMEngine () (x * xorm.Engine ) {
26
+ return db .GetEngine (db .DefaultContext ).(* xorm.Engine )
71
27
}
72
28
73
- // LoadFixtures load fixtures for a test database
74
- func LoadFixtures (engine ... * xorm.Engine ) error {
75
- e := GetXORMEngine (engine ... )
76
- var err error
77
- // (doubt) database transaction conflicts could occur and result in ROLLBACK? just try for a few times.
78
- for i := 0 ; i < 5 ; i ++ {
79
- if err = fixturesLoader .Load (); err == nil {
80
- break
81
- }
82
- time .Sleep (200 * time .Millisecond )
83
- }
84
- if err != nil {
85
- return fmt .Errorf ("LoadFixtures failed after retries: %w" , err )
86
- }
87
- // Now if we're running postgres we need to tell it to update the sequences
88
- if e .Dialect ().URI ().DBType == schemas .POSTGRES {
89
- results , err := e .QueryString (`SELECT 'SELECT SETVAL(' ||
29
+ func loadFixtureResetSeqPgsql (e * xorm.Engine ) error {
30
+ results , err := e .QueryString (`SELECT 'SELECT SETVAL(' ||
90
31
quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
91
32
', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
92
33
quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
@@ -102,19 +43,42 @@ func LoadFixtures(engine ...*xorm.Engine) error {
102
43
AND D.refobjsubid = C.attnum
103
44
AND T.relname = PGT.tablename
104
45
ORDER BY S.relname;` )
105
- if err != nil {
106
- return fmt .Errorf ("failed to generate sequence update: %w" , err )
107
- }
108
- for _ , r := range results {
109
- for _ , value := range r {
110
- _ , err = e .Exec (value )
111
- if err != nil {
112
- return fmt .Errorf ("failed to update sequence: %s, error: %w" , value , err )
113
- }
46
+ if err != nil {
47
+ return fmt .Errorf ("failed to generate sequence update: %w" , err )
48
+ }
49
+ for _ , r := range results {
50
+ for _ , value := range r {
51
+ _ , err = e .Exec (value )
52
+ if err != nil {
53
+ return fmt .Errorf ("failed to update sequence: %s, error: %w" , value , err )
114
54
}
115
55
}
116
56
}
57
+ return nil
58
+ }
59
+
60
+ // InitFixtures initialize test fixtures for a test database
61
+ func InitFixtures (opts FixturesOptions , engine ... * xorm.Engine ) (err error ) {
62
+ xormEngine := util .IfZero (util .OptionalArg (engine ), GetXORMEngine ())
63
+ fixturesLoader , err = NewFixturesLoader (xormEngine , opts )
64
+ // fixturesLoader = NewFixturesLoaderVendor(xormEngine, opts)
65
+
66
+ // register the dummy hash algorithm function used in the test fixtures
117
67
_ = hash .Register ("dummy" , hash .NewDummyHasher )
118
68
setting .PasswordHashAlgo , _ = hash .SetDefaultPasswordHashAlgorithm ("dummy" )
69
+ return err
70
+ }
71
+
72
+ // LoadFixtures load fixtures for a test database
73
+ func LoadFixtures () error {
74
+ if err := fixturesLoader .Load (); err != nil {
75
+ return err
76
+ }
77
+ // Now if we're running postgres we need to tell it to update the sequences
78
+ if GetXORMEngine ().Dialect ().URI ().DBType == schemas .POSTGRES {
79
+ if err := loadFixtureResetSeqPgsql (GetXORMEngine ()); err != nil {
80
+ return err
81
+ }
82
+ }
119
83
return nil
120
84
}
0 commit comments