gitea源码

fixtures.go 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package unittest
  4. import (
  5. "fmt"
  6. "code.gitea.io/gitea/models/db"
  7. "code.gitea.io/gitea/modules/auth/password/hash"
  8. "code.gitea.io/gitea/modules/setting"
  9. "code.gitea.io/gitea/modules/util"
  10. "xorm.io/xorm"
  11. "xorm.io/xorm/schemas"
  12. )
  13. type FixturesLoader interface {
  14. Load() error
  15. }
  16. var fixturesLoader FixturesLoader
  17. // GetXORMEngine gets the XORM engine
  18. func GetXORMEngine() (x *xorm.Engine) {
  19. return db.GetXORMEngineForTesting()
  20. }
  21. func loadFixtureResetSeqPgsql(e *xorm.Engine) error {
  22. results, err := e.QueryString(`SELECT 'SELECT SETVAL(' ||
  23. quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
  24. ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
  25. quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
  26. FROM pg_class AS S,
  27. pg_depend AS D,
  28. pg_class AS T,
  29. pg_attribute AS C,
  30. pg_tables AS PGT
  31. WHERE S.relkind = 'S'
  32. AND S.oid = D.objid
  33. AND D.refobjid = T.oid
  34. AND D.refobjid = C.attrelid
  35. AND D.refobjsubid = C.attnum
  36. AND T.relname = PGT.tablename
  37. ORDER BY S.relname;`)
  38. if err != nil {
  39. return fmt.Errorf("failed to generate sequence update: %w", err)
  40. }
  41. for _, r := range results {
  42. for _, value := range r {
  43. _, err = e.Exec(value)
  44. if err != nil {
  45. return fmt.Errorf("failed to update sequence: %s, error: %w", value, err)
  46. }
  47. }
  48. }
  49. return nil
  50. }
  51. // InitFixtures initialize test fixtures for a test database
  52. func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) {
  53. xormEngine := util.IfZero(util.OptionalArg(engine), GetXORMEngine())
  54. fixturesLoader, err = NewFixturesLoader(xormEngine, opts)
  55. // fixturesLoader = NewFixturesLoaderVendor(xormEngine, opts)
  56. // register the dummy hash algorithm function used in the test fixtures
  57. _ = hash.Register("dummy", hash.NewDummyHasher)
  58. setting.PasswordHashAlgo, _ = hash.SetDefaultPasswordHashAlgorithm("dummy")
  59. return err
  60. }
  61. // LoadFixtures load fixtures for a test database
  62. func LoadFixtures() error {
  63. if err := fixturesLoader.Load(); err != nil {
  64. return err
  65. }
  66. // Now if we're running postgres we need to tell it to update the sequences
  67. if GetXORMEngine().Dialect().URI().DBType == schemas.POSTGRES {
  68. if err := loadFixtureResetSeqPgsql(GetXORMEngine()); err != nil {
  69. return err
  70. }
  71. }
  72. return nil
  73. }