main_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright 2020 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package db
  5. import (
  6. "flag"
  7. "fmt"
  8. "io/ioutil"
  9. stdlog "log"
  10. "os"
  11. "path/filepath"
  12. "testing"
  13. "time"
  14. "gorm.io/gorm"
  15. "gorm.io/gorm/logger"
  16. "gorm.io/gorm/schema"
  17. log "unknwon.dev/clog/v2"
  18. "gogs.io/gogs/internal/conf"
  19. "gogs.io/gogs/internal/dbutil"
  20. "gogs.io/gogs/internal/testutil"
  21. )
  22. func TestMain(m *testing.M) {
  23. flag.Parse()
  24. var w logger.Writer
  25. level := logger.Silent
  26. if !testing.Verbose() {
  27. // Remove the primary logger and register a noop logger.
  28. log.Remove(log.DefaultConsoleName)
  29. err := log.New("noop", testutil.InitNoopLogger)
  30. if err != nil {
  31. fmt.Println(err)
  32. os.Exit(1)
  33. }
  34. w = &dbutil.Logger{Writer: ioutil.Discard}
  35. } else {
  36. w = stdlog.New(os.Stdout, "\r\n", stdlog.LstdFlags)
  37. level = logger.Info
  38. }
  39. // NOTE: AutoMigrate does not respect logger passed in gorm.Config.
  40. logger.Default = logger.New(w, logger.Config{
  41. SlowThreshold: 100 * time.Millisecond,
  42. LogLevel: level,
  43. })
  44. os.Exit(m.Run())
  45. }
  46. // clearTables removes all rows from given tables.
  47. func clearTables(t *testing.T, db *gorm.DB, tables ...interface{}) error {
  48. if t.Failed() {
  49. return nil
  50. }
  51. for _, t := range tables {
  52. err := db.Where("TRUE").Delete(t).Error
  53. if err != nil {
  54. return err
  55. }
  56. }
  57. return nil
  58. }
  59. func initTestDB(t *testing.T, suite string, tables ...interface{}) *gorm.DB {
  60. t.Helper()
  61. dbpath := filepath.Join(os.TempDir(), fmt.Sprintf("gogs-%s-%d.db", suite, time.Now().Unix()))
  62. now := time.Now().UTC().Truncate(time.Second)
  63. db, err := openDB(
  64. conf.DatabaseOpts{
  65. Type: "sqlite3",
  66. Path: dbpath,
  67. },
  68. &gorm.Config{
  69. NamingStrategy: schema.NamingStrategy{
  70. SingularTable: true,
  71. },
  72. NowFunc: func() time.Time {
  73. return now
  74. },
  75. },
  76. )
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. t.Cleanup(func() {
  81. sqlDB, err := db.DB()
  82. if err == nil {
  83. _ = sqlDB.Close()
  84. }
  85. if t.Failed() {
  86. t.Logf("Database %q left intact for inspection", dbpath)
  87. return
  88. }
  89. _ = os.Remove(dbpath)
  90. })
  91. err = db.Migrator().AutoMigrate(tables...)
  92. if err != nil {
  93. t.Fatal(err)
  94. }
  95. return db
  96. }