mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.4 KiB
84 lines
2.4 KiB
// Copyright 2021 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package unittest |
|
|
|
import ( |
|
"fmt" |
|
|
|
"code.gitea.io/gitea/models/db" |
|
"code.gitea.io/gitea/modules/auth/password/hash" |
|
"code.gitea.io/gitea/modules/setting" |
|
"code.gitea.io/gitea/modules/util" |
|
|
|
"xorm.io/xorm" |
|
"xorm.io/xorm/schemas" |
|
) |
|
|
|
type FixturesLoader interface { |
|
Load() error |
|
} |
|
|
|
var fixturesLoader FixturesLoader |
|
|
|
// GetXORMEngine gets the XORM engine |
|
func GetXORMEngine() (x *xorm.Engine) { |
|
return db.GetXORMEngineForTesting() |
|
} |
|
|
|
func loadFixtureResetSeqPgsql(e *xorm.Engine) error { |
|
results, err := e.QueryString(`SELECT 'SELECT SETVAL(' || |
|
quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) || |
|
', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' || |
|
quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';' |
|
FROM pg_class AS S, |
|
pg_depend AS D, |
|
pg_class AS T, |
|
pg_attribute AS C, |
|
pg_tables AS PGT |
|
WHERE S.relkind = 'S' |
|
AND S.oid = D.objid |
|
AND D.refobjid = T.oid |
|
AND D.refobjid = C.attrelid |
|
AND D.refobjsubid = C.attnum |
|
AND T.relname = PGT.tablename |
|
ORDER BY S.relname;`) |
|
if err != nil { |
|
return fmt.Errorf("failed to generate sequence update: %w", err) |
|
} |
|
for _, r := range results { |
|
for _, value := range r { |
|
_, err = e.Exec(value) |
|
if err != nil { |
|
return fmt.Errorf("failed to update sequence: %s, error: %w", value, err) |
|
} |
|
} |
|
} |
|
return nil |
|
} |
|
|
|
// InitFixtures initialize test fixtures for a test database |
|
func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) { |
|
xormEngine := util.IfZero(util.OptionalArg(engine), GetXORMEngine()) |
|
fixturesLoader, err = NewFixturesLoader(xormEngine, opts) |
|
// fixturesLoader = NewFixturesLoaderVendor(xormEngine, opts) |
|
|
|
// register the dummy hash algorithm function used in the test fixtures |
|
_ = hash.Register("dummy", hash.NewDummyHasher) |
|
setting.PasswordHashAlgo, _ = hash.SetDefaultPasswordHashAlgorithm("dummy") |
|
return err |
|
} |
|
|
|
// LoadFixtures load fixtures for a test database |
|
func LoadFixtures() error { |
|
if err := fixturesLoader.Load(); err != nil { |
|
return err |
|
} |
|
// Now if we're running postgres we need to tell it to update the sequences |
|
if GetXORMEngine().Dialect().URI().DBType == schemas.POSTGRES { |
|
if err := loadFixtureResetSeqPgsql(GetXORMEngine()); err != nil { |
|
return err |
|
} |
|
} |
|
return nil |
|
}
|
|
|