Skip to content

Commit 2064d07

Browse files
committed
fix
1 parent c102e34 commit 2064d07

File tree

8 files changed

+215
-164
lines changed

8 files changed

+215
-164
lines changed

assets/go-licenses.json

Lines changed: 0 additions & 50 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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/unittest/fixtures.go

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ package unittest
66

77
import (
88
"fmt"
9-
"os"
109
"time"
1110

1211
"code.gitea.io/gitea/models/db"
1312
"code.gitea.io/gitea/modules/auth/password/hash"
1413
"code.gitea.io/gitea/modules/setting"
1514

16-
"github.com/go-testfixtures/testfixtures/v3"
1715
"xorm.io/xorm"
1816
"xorm.io/xorm/schemas"
1917
)
2018

21-
var fixturesLoader *testfixtures.Loader
19+
type FixturesLoader interface {
20+
Load() error
21+
}
22+
23+
var fixturesLoader FixturesLoader
2224

2325
// GetXORMEngine gets the XORM engine
2426
func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) {
@@ -31,38 +33,7 @@ func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) {
3133
// InitFixtures initialize test fixtures for a test database
3234
func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) {
3335
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...)
36+
fixturesLoader, err = NewFixturesLoader(e, opts)
6637
if err != nil {
6738
return err
6839
}

models/unittest/fixtures_loader.go

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package unittest
5+
6+
import (
7+
"database/sql"
8+
"encoding/hex"
9+
"fmt"
10+
"os"
11+
"path/filepath"
12+
"slices"
13+
"strings"
14+
15+
"gopkg.in/yaml.v3"
16+
"xorm.io/xorm"
17+
"xorm.io/xorm/schemas"
18+
)
19+
20+
type fixtureItem struct {
21+
tableName string
22+
tableNameQuoted string
23+
sqlInserts []string
24+
sqlInsertArgs [][]any
25+
26+
mssqlHasIdentityColumn bool
27+
}
28+
29+
type fixturesLoaderInternal struct {
30+
db *sql.DB
31+
dbType schemas.DBType
32+
files []string
33+
fixtures map[string]*fixtureItem
34+
quoteObject func(string) string
35+
paramPlaceholder func(idx int) string
36+
}
37+
38+
func (f *fixturesLoaderInternal) mssqlTableHasIdentityColumn(db *sql.DB, tableName string) (bool, error) {
39+
row := db.QueryRow(`SELECT COUNT(*) FROM sys.identity_columns WHERE OBJECT_ID = OBJECT_ID(?)`, tableName)
40+
var count int
41+
if err := row.Scan(&count); err != nil {
42+
return false, err
43+
}
44+
return count > 0, nil
45+
}
46+
47+
func (f *fixturesLoaderInternal) preprocessFixtureRow(row []map[string]any) (err error) {
48+
for _, m := range row {
49+
for k, v := range m {
50+
if s, ok := v.(string); ok {
51+
if strings.HasPrefix(s, "0x") {
52+
if m[k], err = hex.DecodeString(s[2:]); err != nil {
53+
return err
54+
}
55+
}
56+
}
57+
}
58+
}
59+
return nil
60+
}
61+
62+
func (f *fixturesLoaderInternal) prepareFixtureItem(file string) (_ *fixtureItem, err error) {
63+
fixture := &fixtureItem{}
64+
fixture.tableName, _, _ = strings.Cut(filepath.Base(file), ".")
65+
fixture.tableNameQuoted = f.quoteObject(fixture.tableName)
66+
67+
if f.dbType == schemas.MSSQL {
68+
fixture.mssqlHasIdentityColumn, err = f.mssqlTableHasIdentityColumn(f.db, fixture.tableName)
69+
if err != nil {
70+
return nil, err
71+
}
72+
}
73+
74+
data, err := os.ReadFile(file)
75+
if err != nil {
76+
return nil, fmt.Errorf("failed to read file %q: %w", file, err)
77+
}
78+
79+
var rows []map[string]any
80+
if err = yaml.Unmarshal(data, &rows); err != nil {
81+
return nil, fmt.Errorf("failed to unmarshal yaml data from %q: %w", file, err)
82+
}
83+
if err = f.preprocessFixtureRow(rows); err != nil {
84+
return nil, fmt.Errorf("failed to preprocess fixture rows from %q: %w", file, err)
85+
}
86+
87+
var sqlBuf []byte
88+
var sqlArguments []any
89+
for _, row := range rows {
90+
sqlBuf = append(sqlBuf, fmt.Sprintf("INSERT INTO %s (", fixture.tableNameQuoted)...)
91+
for k, v := range row {
92+
sqlBuf = append(sqlBuf, f.quoteObject(k)...)
93+
sqlBuf = append(sqlBuf, ","...)
94+
sqlArguments = append(sqlArguments, v)
95+
}
96+
sqlBuf = sqlBuf[:len(sqlBuf)-1]
97+
sqlBuf = append(sqlBuf, ") VALUES ("...)
98+
paramIdx := 1
99+
for range row {
100+
sqlBuf = append(sqlBuf, f.paramPlaceholder(paramIdx)...)
101+
sqlBuf = append(sqlBuf, ',')
102+
paramIdx++
103+
}
104+
sqlBuf[len(sqlBuf)-1] = ')'
105+
fixture.sqlInserts = append(fixture.sqlInserts, string(sqlBuf))
106+
fixture.sqlInsertArgs = append(fixture.sqlInsertArgs, slices.Clone(sqlArguments))
107+
sqlBuf = sqlBuf[:0]
108+
sqlArguments = sqlArguments[:0]
109+
}
110+
return fixture, nil
111+
}
112+
113+
func (f *fixturesLoaderInternal) loadFixtures(tx *sql.Tx, file string) (err error) {
114+
fixture := f.fixtures[file]
115+
if fixture == nil {
116+
if fixture, err = f.prepareFixtureItem(file); err != nil {
117+
return err
118+
}
119+
f.fixtures[file] = fixture
120+
}
121+
122+
_, err = tx.Exec(fmt.Sprintf("DELETE FROM %s", fixture.tableNameQuoted)) // sqlite3 doesn't support truncate
123+
if err != nil {
124+
return err
125+
}
126+
127+
if fixture.mssqlHasIdentityColumn {
128+
_, err = tx.Exec(fmt.Sprintf("SET IDENTITY_INSERT %s ON", fixture.tableNameQuoted))
129+
if err != nil {
130+
return err
131+
}
132+
defer func() { _, err = tx.Exec(fmt.Sprintf("SET IDENTITY_INSERT %s OFF", fixture.tableNameQuoted)) }()
133+
}
134+
for i := range fixture.sqlInserts {
135+
_, err = tx.Exec(fixture.sqlInserts[i], fixture.sqlInsertArgs[i]...)
136+
}
137+
if err != nil {
138+
return err
139+
}
140+
return nil
141+
}
142+
143+
func (f *fixturesLoaderInternal) Load() error {
144+
tx, err := f.db.Begin()
145+
if err != nil {
146+
return err
147+
}
148+
defer func() { _ = tx.Rollback() }()
149+
150+
for _, file := range f.files {
151+
if err := f.loadFixtures(tx, file); err != nil {
152+
return fmt.Errorf("failed to load fixtures from %s: %w", file, err)
153+
}
154+
}
155+
return tx.Commit()
156+
}
157+
158+
func FixturesFileFullPaths(dir string, files []string) ([]string, error) {
159+
if files != nil && len(files) == 0 {
160+
return nil, nil // load nothing
161+
}
162+
files = slices.Clone(files)
163+
if len(files) == 0 {
164+
entries, err := os.ReadDir(dir)
165+
if err != nil {
166+
return nil, err
167+
}
168+
for _, e := range entries {
169+
files = append(files, e.Name())
170+
}
171+
}
172+
for i, file := range files {
173+
if !filepath.IsAbs(file) {
174+
files[i] = filepath.Join(dir, file)
175+
}
176+
}
177+
return files, nil
178+
}
179+
180+
func NewFixturesLoader(x *xorm.Engine, opts FixturesOptions) (FixturesLoader, error) {
181+
files, err := FixturesFileFullPaths(opts.Dir, opts.Files)
182+
if err != nil {
183+
return nil, fmt.Errorf("failed to get fixtures files: %w", err)
184+
}
185+
f := &fixturesLoaderInternal{db: x.DB().DB, dbType: x.Dialect().URI().DBType, files: files, fixtures: map[string]*fixtureItem{}}
186+
switch f.dbType {
187+
case schemas.SQLITE:
188+
f.quoteObject = func(s string) string { return fmt.Sprintf(`"%s"`, s) }
189+
f.paramPlaceholder = func(idx int) string { return "?" }
190+
case schemas.POSTGRES:
191+
f.quoteObject = func(s string) string { return fmt.Sprintf(`"%s"`, s) }
192+
f.paramPlaceholder = func(idx int) string { return fmt.Sprintf(`$%d`, idx) }
193+
case schemas.MYSQL:
194+
f.quoteObject = func(s string) string { return fmt.Sprintf("`%s`", s) }
195+
f.paramPlaceholder = func(idx int) string { return "?" }
196+
case schemas.MSSQL:
197+
f.quoteObject = func(s string) string { return fmt.Sprintf("[%s]", s) }
198+
f.paramPlaceholder = func(idx int) string { return "?" }
199+
}
200+
return f, nil
201+
}

modules/system/appstate_test.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ import (
1313
)
1414

1515
func TestMain(m *testing.M) {
16-
unittest.MainTest(m, &unittest.TestOptions{
17-
FixtureFiles: []string{""}, // load nothing
18-
})
16+
unittest.MainTest(m, &unittest.TestOptions{FixtureFiles: []string{ /* load nothing */ }})
1917
}
2018

2119
type testItem1 struct {
@@ -36,8 +34,6 @@ func (*testItem2) Name() string {
3634
}
3735

3836
func TestAppStateDB(t *testing.T) {
39-
assert.NoError(t, unittest.PrepareTestDatabase())
40-
4137
as := &DBStore{}
4238

4339
item1 := new(testItem1)

0 commit comments

Comments
 (0)