@@ -5,88 +5,29 @@ package unittest
55
66import (
77 "fmt"
8- "time"
98
109 "code.gitea.io/gitea/models/db"
1110 "code.gitea.io/gitea/modules/auth/password/hash"
1211 "code.gitea.io/gitea/modules/setting"
12+ "code.gitea.io/gitea/modules/util"
1313
14- "github.com/go-testfixtures/testfixtures/v3"
1514 "xorm.io/xorm"
1615 "xorm.io/xorm/schemas"
1716)
1817
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
2720}
2821
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
6123
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 )
7127}
7228
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(' ||
9031 quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
9132 ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
9233 quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
@@ -102,19 +43,42 @@ func LoadFixtures(engine ...*xorm.Engine) error {
10243 AND D.refobjsubid = C.attnum
10344 AND T.relname = PGT.tablename
10445 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 )
11454 }
11555 }
11656 }
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
11767 _ = hash .Register ("dummy" , hash .NewDummyHasher )
11868 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+ }
11983 return nil
12084}
0 commit comments