Skip to content

Commit 7e92070

Browse files
guillep2klunny
andauthored
Move fixture generation to contrib and add test (#10277)
* Add fixture gen tool and fix "access" test * Close file before exiting * Add missing repo_unit for repo id: 5 * Fix count on TestAPIOrgRepos * Generate access fixture from contrib and add test * Remove old access fixture generation * Fix lint Co-authored-by: Lunny Xiao <[email protected]>
1 parent 62a1322 commit 7e92070

File tree

5 files changed

+163
-56
lines changed

5 files changed

+163
-56
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright 2020 The Gitea 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+
5+
package main
6+
7+
import (
8+
"fmt"
9+
"io/ioutil"
10+
"os"
11+
"path/filepath"
12+
13+
"code.gitea.io/gitea/models"
14+
)
15+
16+
// To generate derivative fixtures, execute the following from Gitea's repository base dir:
17+
// go run -tags 'sqlite sqlite_unlock_notify' contrib/fixtures/fixture_generation.go [fixture...]
18+
19+
var (
20+
generators = []struct {
21+
gen func() (string, error)
22+
name string
23+
}{
24+
{
25+
models.GetYamlFixturesAccess, "access",
26+
},
27+
}
28+
fixturesDir string
29+
)
30+
31+
func main() {
32+
pathToGiteaRoot := "."
33+
fixturesDir = filepath.Join(pathToGiteaRoot, "models", "fixtures")
34+
if err := models.CreateTestEngine(fixturesDir); err != nil {
35+
fmt.Printf("CreateTestEngine: %+v", err)
36+
os.Exit(1)
37+
}
38+
if err := models.PrepareTestDatabase(); err != nil {
39+
fmt.Printf("PrepareTestDatabase: %+v\n", err)
40+
os.Exit(1)
41+
}
42+
if len(os.Args) == 0 {
43+
for _, r := range os.Args {
44+
if err := generate(r); err != nil {
45+
fmt.Printf("generate '%s': %+v\n", r, err)
46+
os.Exit(1)
47+
}
48+
}
49+
} else {
50+
for _, g := range generators {
51+
if err := generate(g.name); err != nil {
52+
fmt.Printf("generate '%s': %+v\n", g.name, err)
53+
os.Exit(1)
54+
}
55+
}
56+
}
57+
}
58+
59+
func generate(name string) error {
60+
for _, g := range generators {
61+
if g.name == name {
62+
data, err := g.gen()
63+
if err != nil {
64+
return err
65+
}
66+
path := filepath.Join(fixturesDir, name+".yml")
67+
if err := ioutil.WriteFile(path, []byte(data), 0644); err != nil {
68+
return fmt.Errorf("%s: %+v", path, err)
69+
}
70+
fmt.Printf("%s created.\n", path)
71+
return nil
72+
}
73+
}
74+
75+
return fmt.Errorf("generator not found")
76+
}

models/fixture_access_test.go

Lines changed: 0 additions & 52 deletions
This file was deleted.

models/fixture_generation.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2020 The Gitea 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+
5+
package models
6+
7+
import (
8+
"fmt"
9+
"strings"
10+
)
11+
12+
// GetYamlFixturesAccess returns a string containing the contents
13+
// for the access table, as recalculated using repo.RecalculateAccesses()
14+
func GetYamlFixturesAccess() (string, error) {
15+
16+
repos := make([]*Repository, 0, 50)
17+
if err := x.Find(&repos); err != nil {
18+
return "", err
19+
}
20+
21+
for _, repo := range repos {
22+
repo.MustOwner()
23+
if err := repo.RecalculateAccesses(); err != nil {
24+
return "", err
25+
}
26+
}
27+
28+
var b strings.Builder
29+
30+
accesses := make([]*Access, 0, 200)
31+
if err := x.OrderBy("user_id, repo_id").Find(&accesses); err != nil {
32+
return "", err
33+
}
34+
35+
for i, a := range accesses {
36+
fmt.Fprintf(&b, "-\n")
37+
fmt.Fprintf(&b, " id: %d\n", i+1)
38+
fmt.Fprintf(&b, " user_id: %d\n", a.UserID)
39+
fmt.Fprintf(&b, " repo_id: %d\n", a.RepoID)
40+
fmt.Fprintf(&b, " mode: %d\n", a.Mode)
41+
fmt.Fprintf(&b, "\n")
42+
}
43+
44+
return b.String(), nil
45+
}

models/fixture_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2020 The Gitea 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+
5+
package models
6+
7+
import (
8+
"io/ioutil"
9+
"path/filepath"
10+
"testing"
11+
12+
"code.gitea.io/gitea/modules/util"
13+
14+
"github.com/stretchr/testify/assert"
15+
)
16+
17+
func TestFixtureGeneration(t *testing.T) {
18+
assert.NoError(t, PrepareTestDatabase())
19+
20+
test := func(gen func() (string, error), name string) {
21+
expected, err := gen()
22+
if !assert.NoError(t, err) {
23+
return
24+
}
25+
bytes, err := ioutil.ReadFile(filepath.Join(fixturesDir, name+".yml"))
26+
if !assert.NoError(t, err) {
27+
return
28+
}
29+
data := string(util.NormalizeEOL(bytes))
30+
assert.True(t, data == expected, "Differences detected for %s.yml", name)
31+
}
32+
33+
test(GetYamlFixturesAccess, "access")
34+
}

models/unit_tests.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ import (
2828
const NonexistentID = int64(math.MaxInt64)
2929

3030
// giteaRoot a path to the gitea root
31-
var giteaRoot string
31+
var (
32+
giteaRoot string
33+
fixturesDir string
34+
)
3235

3336
func fatalTestError(fmtStr string, args ...interface{}) {
3437
fmt.Fprintf(os.Stderr, fmtStr, args...)
@@ -40,8 +43,8 @@ func fatalTestError(fmtStr string, args ...interface{}) {
4043
func MainTest(m *testing.M, pathToGiteaRoot string) {
4144
var err error
4245
giteaRoot = pathToGiteaRoot
43-
fixturesDir := filepath.Join(pathToGiteaRoot, "models", "fixtures")
44-
if err = createTestEngine(fixturesDir); err != nil {
46+
fixturesDir = filepath.Join(pathToGiteaRoot, "models", "fixtures")
47+
if err = CreateTestEngine(fixturesDir); err != nil {
4548
fatalTestError("Error creating test engine: %v\n", err)
4649
}
4750

@@ -82,7 +85,8 @@ func MainTest(m *testing.M, pathToGiteaRoot string) {
8285
os.Exit(exitStatus)
8386
}
8487

85-
func createTestEngine(fixturesDir string) error {
88+
// CreateTestEngine creates a memory database and loads the fixture data from fixturesDir
89+
func CreateTestEngine(fixturesDir string) error {
8690
var err error
8791
x, err = xorm.NewEngine("sqlite3", "file::memory:?cache=shared")
8892
if err != nil {

0 commit comments

Comments
 (0)