Skip to content

Commit 5ffef9e

Browse files
committed
fix
1 parent a92f505 commit 5ffef9e

File tree

8 files changed

+126
-155
lines changed

8 files changed

+126
-155
lines changed

go.mod

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ require (
6161
github.com/go-redsync/redsync/v4 v4.13.0
6262
github.com/go-sql-driver/mysql v1.8.1
6363
github.com/go-swagger/go-swagger v0.31.0
64-
github.com/go-testfixtures/testfixtures/v3 v3.11.0
6564
github.com/go-webauthn/webauthn v0.11.2
6665
github.com/gobwas/glob v0.2.3
6766
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
@@ -145,8 +144,6 @@ require (
145144
filippo.io/edwards25519 v1.1.0 // indirect
146145
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
147146
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
148-
github.com/ClickHouse/ch-go v0.63.1 // indirect
149-
github.com/ClickHouse/clickhouse-go/v2 v2.24.0 // indirect
150147
github.com/DataDog/zstd v1.5.6 // indirect
151148
github.com/Masterminds/goutils v1.1.1 // indirect
152149
github.com/Masterminds/semver/v3 v3.3.0 // indirect
@@ -204,8 +201,6 @@ require (
204201
github.com/go-ap/errors v0.0.0-20240910140019-1e9d33cc1568 // indirect
205202
github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect
206203
github.com/go-enry/go-oniguruma v1.2.1 // indirect
207-
github.com/go-faster/city v1.0.1 // indirect
208-
github.com/go-faster/errors v0.7.1 // indirect
209204
github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e // indirect
210205
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
211206
github.com/go-ini/ini v1.67.0 // indirect
@@ -270,7 +265,6 @@ require (
270265
github.com/oklog/ulid v1.3.1 // indirect
271266
github.com/olekukonko/tablewriter v0.0.5 // indirect
272267
github.com/onsi/ginkgo v1.16.5 // indirect
273-
github.com/paulmach/orb v0.11.1 // indirect
274268
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
275269
github.com/pierrec/lz4/v4 v4.1.21 // indirect
276270
github.com/pjbgf/sha1cd v0.3.0 // indirect
@@ -285,7 +279,6 @@ require (
285279
github.com/russross/blackfriday/v2 v2.1.0 // indirect
286280
github.com/sagikazarmark/locafero v0.6.0 // indirect
287281
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
288-
github.com/segmentio/asm v1.2.0 // indirect
289282
github.com/shopspring/decimal v1.4.0 // indirect
290283
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
291284
github.com/sirupsen/logrus v1.9.3 // indirect
@@ -310,8 +303,6 @@ require (
310303
github.com/zeebo/blake3 v0.2.4 // indirect
311304
go.etcd.io/bbolt v1.3.11 // indirect
312305
go.mongodb.org/mongo-driver v1.17.1 // indirect
313-
go.opentelemetry.io/otel v1.31.0 // indirect
314-
go.opentelemetry.io/otel/trace v1.31.0 // indirect
315306
go.uber.org/atomic v1.11.0 // indirect
316307
go.uber.org/multierr v1.11.0 // indirect
317308
go.uber.org/zap v1.27.0 // indirect

go.sum

Lines changed: 0 additions & 58 deletions
Large diffs are not rendered by default.

models/fixtures/action_run_job.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
name: job2
6565
attempt: 1
6666
job_id: job2
67-
needs: [job1]
67+
needs: "[job1]"
6868
task_id: 51
6969
status: 5
7070
started: 1683636528

models/fixtures/protected_tag.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22
id: 1
33
repo_id: 4
44
name_pattern: /v.+/
5-
allowlist_user_i_ds: []
6-
allowlist_team_i_ds: []
5+
allowlist_user_i_ds: "[]"
6+
allowlist_team_i_ds: "[]"
77
created_unix: 1715596037
88
updated_unix: 1715596037
99
-
1010
id: 2
1111
repo_id: 1
1212
name_pattern: v-*
13-
allowlist_user_i_ds: []
14-
allowlist_team_i_ds: []
13+
allowlist_user_i_ds: "[]"
14+
allowlist_team_i_ds: "[]"
1515
created_unix: 1715596037
1616
updated_unix: 1715596037
1717
-
1818
id: 3
1919
repo_id: 1
2020
name_pattern: v-1.1
21-
allowlist_user_i_ds: [2]
22-
allowlist_team_i_ds: []
21+
allowlist_user_i_ds: "[2]"
22+
allowlist_team_i_ds: "[]"
2323
created_unix: 1715596037
2424
updated_unix: 1715596037

models/main_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import (
1515
_ "code.gitea.io/gitea/models/actions"
1616
_ "code.gitea.io/gitea/models/system"
1717

18-
"github.com/stretchr/testify/assert"
18+
"github.com/stretchr/testify/require"
1919
)
2020

2121
// TestFixturesAreConsistent assert that test fixtures are consistent
2222
func TestFixturesAreConsistent(t *testing.T) {
23-
assert.NoError(t, unittest.PrepareTestDatabase())
23+
require.NoError(t, unittest.PrepareTestDatabase())
2424
unittest.CheckConsistencyFor(t,
2525
&user_model.User{},
2626
&repo_model.Repository{},

models/migrations/base/tests.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func PrepareTestEnv(t *testing.T, skip int, syncModels ...any) (*xorm.Engine, fu
7676
t.Errorf("error whilst initializing fixtures from %s: %v", fixturesDir, err)
7777
return x, deferFn
7878
}
79-
if err := unittest.LoadFixtures(x); err != nil {
79+
if err := unittest.LoadFixtures(); err != nil {
8080
t.Errorf("error whilst loading fixtures from %s: %v", fixturesDir, err)
8181
return x, deferFn
8282
}

models/unittest/fixtures.go

Lines changed: 28 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,39 @@
11
// Copyright 2021 The Gitea Authors. All rights reserved.
22
// SPDX-License-Identifier: MIT
33

4-
//nolint:forbidigo
54
package unittest
65

76
import (
87
"fmt"
9-
"os"
10-
"time"
118

129
"code.gitea.io/gitea/models/db"
1310
"code.gitea.io/gitea/modules/auth/password/hash"
1411
"code.gitea.io/gitea/modules/setting"
12+
"code.gitea.io/gitea/modules/util"
1513

16-
"github.com/go-testfixtures/testfixtures/v3"
1714
"xorm.io/xorm"
1815
"xorm.io/xorm/schemas"
1916
)
2017

21-
var fixturesLoader *testfixtures.Loader
18+
var defaultFixturesLoader *fixturesLoader
2219

2320
// GetXORMEngine gets the XORM engine
24-
func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) {
25-
if len(engine) == 1 {
26-
return engine[0]
27-
}
21+
func GetXORMEngine() (x *xorm.Engine) {
2822
return db.GetEngine(db.DefaultContext).(*xorm.Engine)
2923
}
3024

3125
// InitFixtures initialize test fixtures for a test database
3226
func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) {
33-
e := GetXORMEngine(engine...)
34-
var fixtureOptionFiles func(*testfixtures.Loader) error
35-
if opts.Dir != "" {
36-
fixtureOptionFiles = testfixtures.Directory(opts.Dir)
37-
} else {
38-
fixtureOptionFiles = testfixtures.Files(opts.Files...)
39-
}
40-
dialect := "unknown"
41-
switch e.Dialect().URI().DBType {
42-
case schemas.POSTGRES:
43-
dialect = "postgres"
44-
case schemas.MYSQL:
45-
dialect = "mysql"
46-
case schemas.MSSQL:
47-
dialect = "mssql"
48-
case schemas.SQLITE:
49-
dialect = "sqlite3"
50-
default:
51-
fmt.Println("Unsupported RDBMS for integration tests")
52-
os.Exit(1)
53-
}
54-
loaderOptions := []func(loader *testfixtures.Loader) error{
55-
testfixtures.Database(e.DB().DB),
56-
testfixtures.Dialect(dialect),
57-
testfixtures.DangerousSkipTestDatabaseCheck(),
58-
fixtureOptionFiles,
59-
}
60-
61-
if e.Dialect().URI().DBType == schemas.POSTGRES {
62-
loaderOptions = append(loaderOptions, testfixtures.SkipResetSequences())
63-
}
64-
65-
fixturesLoader, err = testfixtures.New(loaderOptions...)
66-
if err != nil {
67-
return err
68-
}
27+
defaultFixturesLoader = &fixturesLoader{engine: util.IfZero(util.OptionalArg(engine), GetXORMEngine()), opts: opts}
6928

7029
// register the dummy hash algorithm function used in the test fixtures
7130
_ = hash.Register("dummy", hash.NewDummyHasher)
72-
7331
setting.PasswordHashAlgo, _ = hash.SetDefaultPasswordHashAlgorithm("dummy")
74-
7532
return err
7633
}
7734

78-
// LoadFixtures load fixtures for a test database
79-
func LoadFixtures(engine ...*xorm.Engine) error {
80-
e := GetXORMEngine(engine...)
81-
var err error
82-
// (doubt) database transaction conflicts could occur and result in ROLLBACK? just try for a few times.
83-
for i := 0; i < 5; i++ {
84-
if err = fixturesLoader.Load(); err == nil {
85-
break
86-
}
87-
time.Sleep(200 * time.Millisecond)
88-
}
89-
if err != nil {
90-
fmt.Printf("LoadFixtures failed after retries: %v\n", err)
91-
}
92-
// Now if we're running postgres we need to tell it to update the sequences
93-
if e.Dialect().URI().DBType == schemas.POSTGRES {
94-
results, err := e.QueryString(`SELECT 'SELECT SETVAL(' ||
35+
func loadFixtureResetSeqPgsql(e *xorm.Engine) error {
36+
results, err := e.QueryString(`SELECT 'SELECT SETVAL(' ||
9537
quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
9638
', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
9739
quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
@@ -107,22 +49,30 @@ func LoadFixtures(engine ...*xorm.Engine) error {
10749
AND D.refobjsubid = C.attnum
10850
AND T.relname = PGT.tablename
10951
ORDER BY S.relname;`)
110-
if err != nil {
111-
fmt.Printf("Failed to generate sequence update: %v\n", err)
112-
return err
113-
}
114-
for _, r := range results {
115-
for _, value := range r {
116-
_, err = e.Exec(value)
117-
if err != nil {
118-
fmt.Printf("Failed to update sequence: %s Error: %v\n", value, err)
119-
return err
120-
}
52+
if err != nil {
53+
return fmt.Errorf("failed to generate sequence update: %w", err)
54+
}
55+
for _, r := range results {
56+
for _, value := range r {
57+
_, err = e.Exec(value)
58+
if err != nil {
59+
return fmt.Errorf("failed to update sequence: %s, error: %w", value, err)
12160
}
12261
}
12362
}
124-
_ = hash.Register("dummy", hash.NewDummyHasher)
125-
setting.PasswordHashAlgo, _ = hash.SetDefaultPasswordHashAlgorithm("dummy")
63+
return nil
64+
}
12665

127-
return err
66+
// LoadFixtures load fixtures for a test database
67+
func LoadFixtures() error {
68+
if err := defaultFixturesLoader.Load(); err != nil {
69+
return err
70+
}
71+
// Now if we're running postgres we need to tell it to update the sequences
72+
if defaultFixturesLoader.engine.Dialect().URI().DBType == schemas.POSTGRES {
73+
if err := loadFixtureResetSeqPgsql(defaultFixturesLoader.engine); err != nil {
74+
return err
75+
}
76+
}
77+
return nil
12878
}

models/unittest/fixtures_loader.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package unittest
5+
6+
import (
7+
"fmt"
8+
"os"
9+
"path/filepath"
10+
"strings"
11+
12+
"github.com/yuin/goldmark/util"
13+
"gopkg.in/yaml.v3"
14+
"xorm.io/xorm"
15+
)
16+
17+
type fixturesLoader struct {
18+
engine *xorm.Engine
19+
opts FixturesOptions
20+
quoteObject func(string) string
21+
}
22+
23+
func (f *fixturesLoader) loadFixtures(file string) error {
24+
data, err := os.ReadFile(file)
25+
if err != nil {
26+
return fmt.Errorf("failed to read file %q: %w", file, err)
27+
}
28+
29+
var fixtureItems []map[string]any
30+
if err := yaml.Unmarshal(data, &fixtureItems); err != nil {
31+
return fmt.Errorf("failed to unmarshal yaml data from %q: %w", file, err)
32+
}
33+
34+
tableName, _, _ := strings.Cut(filepath.Base(file), ".")
35+
tableNameQuoted := f.quoteObject(tableName)
36+
_, err = f.engine.Table(tableName).Where("1=1").Delete() // sqlite3 doesn't support truncate
37+
if err != nil {
38+
return err
39+
}
40+
41+
var sqlBuf []byte
42+
var sqlArguments []any
43+
for _, item := range fixtureItems {
44+
sqlBuf = append(sqlBuf, fmt.Sprintf("INSERT INTO %s (", tableNameQuoted)...)
45+
for k, v := range item {
46+
sqlBuf = append(sqlBuf, f.quoteObject(k)...)
47+
sqlBuf = append(sqlBuf, ","...)
48+
sqlArguments = append(sqlArguments, v)
49+
}
50+
sqlBuf = sqlBuf[:len(sqlBuf)-1]
51+
sqlBuf = append(sqlBuf, ") VALUES ("...)
52+
for range item {
53+
sqlBuf = append(sqlBuf, "?,"...)
54+
}
55+
sqlBuf[len(sqlBuf)-1] = ')'
56+
_, err = f.engine.Exec(append([]any{util.BytesToReadOnlyString(sqlBuf)}, sqlArguments...)...)
57+
if err != nil {
58+
return err
59+
}
60+
sqlBuf = sqlBuf[:0]
61+
sqlArguments = sqlArguments[:0]
62+
}
63+
return nil
64+
}
65+
66+
func (f *fixturesLoader) Load() error {
67+
f.quoteObject = func(s string) string {
68+
return fmt.Sprintf("`%s`", s)
69+
}
70+
if len(f.opts.Files) == 0 {
71+
entries, err := os.ReadDir(f.opts.Dir)
72+
if err != nil {
73+
return err
74+
}
75+
for _, e := range entries {
76+
f.opts.Files = append(f.opts.Files, e.Name())
77+
}
78+
}
79+
for _, file := range f.opts.Files {
80+
if !filepath.IsAbs(file) {
81+
file = filepath.Join(f.opts.Dir, file)
82+
}
83+
if err := f.loadFixtures(file); err != nil {
84+
return fmt.Errorf("failed to load fixtures from %s: %w", file, err)
85+
}
86+
}
87+
return nil
88+
}

0 commit comments

Comments
 (0)