Skip to content

Commit d031855

Browse files
committed
Add golden test for ci-report
1 parent 5ba9c18 commit d031855

File tree

8 files changed

+21437
-23
lines changed

8 files changed

+21437
-23
lines changed

.gitignore

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ site/e2e/states/*.json
3030
site/playwright-report/*
3131
site/.swc
3232

33-
# Make target for updating golden files.
34-
cli/testdata/.gen-golden
35-
helm/tests/testdata/.gen-golden
33+
# Make target for updating golden files (any dir).
34+
.gen-golden
3635

3736
# Build
3837
/build/

.prettierignore

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@ site/e2e/states/*.json
3333
site/playwright-report/*
3434
site/.swc
3535

36-
# Make target for updating golden files.
37-
cli/testdata/.gen-golden
38-
helm/tests/testdata/.gen-golden
36+
# Make target for updating golden files (any dir).
37+
.gen-golden
3938

4039
# Build
4140
/build/

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ coderd/apidoc/swagger.json: $(shell find ./scripts/apidocgen $(FIND_EXCLUSIONS)
514514
./scripts/apidocgen/generate.sh
515515
yarn run --cwd=site format:write:only ../docs/api ../docs/manifest.json ../coderd/apidoc/swagger.json
516516

517-
update-golden-files: cli/testdata/.gen-golden helm/tests/testdata/.gen-golden
517+
update-golden-files: cli/testdata/.gen-golden helm/tests/testdata/.gen-golden scripts/ci-report/testdata/.gen-golden
518518
.PHONY: update-golden-files
519519

520520
cli/testdata/.gen-golden: $(wildcard cli/testdata/*.golden) $(wildcard cli/*.tpl) $(GO_SRC_FILES)
@@ -525,6 +525,10 @@ helm/tests/testdata/.gen-golden: $(wildcard helm/tests/testdata/*.golden) $(GO_S
525525
go test ./helm/tests -run=TestUpdateGoldenFiles -update
526526
touch "$@"
527527

528+
scripts/ci-report/testdata/.gen-golden: $(wildcard scripts/ci-report/testdata/*) $(wildcard scripts/ci-report/*.go)
529+
go test ./scripts/ci-report -run=TestOutputMatchesGoldenFile -update
530+
touch "$@"
531+
528532
# Generate a prettierrc for the site package that uses relative paths for
529533
# overrides. This allows us to share the same prettier config between the
530534
# site and the root of the repo.

scripts/ci-report/main.go

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"time"
1111

1212
"golang.org/x/exp/slices"
13+
"golang.org/x/xerrors"
1314
)
1415

1516
func main() {
@@ -19,11 +20,30 @@ func main() {
1920
}
2021
name := os.Args[1]
2122

22-
f, err := os.Open(name)
23+
goTests, err := parseGoTestJSON(name)
24+
if err != nil {
25+
_, _ = fmt.Printf("error parsing gotestsum report: %v", err)
26+
os.Exit(1)
27+
}
28+
29+
rep, err := parseCIReport(goTests)
2330
if err != nil {
24-
_, _ = fmt.Printf("error opening gotestsum json file: %v", err)
31+
_, _ = fmt.Printf("error parsing ci report: %v", err)
2532
os.Exit(1)
2633
}
34+
35+
err = printCIReport(os.Stdout, rep)
36+
if err != nil {
37+
_, _ = fmt.Printf("error printing report: %v", err)
38+
os.Exit(1)
39+
}
40+
}
41+
42+
func parseGoTestJSON(name string) (GotestsumReport, error) {
43+
f, err := os.Open(name)
44+
if err != nil {
45+
return GotestsumReport{}, xerrors.Errorf("error opening gotestsum json file: %w", err)
46+
}
2747
defer f.Close()
2848

2949
dec := json.NewDecoder(f)
@@ -35,13 +55,16 @@ func main() {
3555
break
3656
}
3757
if err != nil {
38-
_, _ = fmt.Printf("error decoding json: %v", err)
39-
os.Exit(1)
58+
return GotestsumReport{}, xerrors.Errorf("error decoding json: %w", err)
4059
}
4160
e.Package = strings.TrimPrefix(e.Package, "github.com/coder/coder/")
4261
report = append(report, e)
4362
}
4463

64+
return report, nil
65+
}
66+
67+
func parseCIReport(report GotestsumReport) (CIReport, error) {
4568
packagesSortedByName := []string{}
4669
packageTimes := map[string]float64{}
4770
packageFail := map[string]int{}
@@ -97,8 +120,7 @@ func main() {
97120
case Pause:
98121

99122
default:
100-
_, _ = fmt.Printf("unknown action: %v in entry %d (%v)", e.Action, i, e)
101-
os.Exit(1)
123+
return CIReport{}, xerrors.Errorf("unknown action: %v in entry %d (%v)", e.Action, i, e)
102124
}
103125
}
104126

@@ -132,13 +154,17 @@ func main() {
132154
})
133155
}
134156

135-
enc := json.NewEncoder(os.Stdout)
157+
return rep, nil
158+
}
159+
160+
func printCIReport(dst io.Writer, rep CIReport) error {
161+
enc := json.NewEncoder(dst)
136162
enc.SetIndent("", " ")
137-
err = enc.Encode(rep)
163+
err := enc.Encode(rep)
138164
if err != nil {
139-
_, _ = fmt.Printf("error encoding json: %v", err)
140-
os.Exit(1)
165+
return xerrors.Errorf("error encoding json: %w", err)
141166
}
167+
return nil
142168
}
143169

144170
type CIReport struct {

scripts/ci-report/main_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"flag"
6+
"os"
7+
"path/filepath"
8+
"testing"
9+
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
// To update the golden files:
14+
// make update-golden-files
15+
var updateGoldenFiles = flag.Bool("update", false, "update .golden files")
16+
17+
func TestOutputMatchesGoldenFile(t *testing.T) {
18+
t.Parallel()
19+
20+
goTests, err := parseGoTestJSON(filepath.Join("testdata", "gotests.json"))
21+
if err != nil {
22+
t.Fatalf("error parsing gotestsum report: %v", err)
23+
}
24+
25+
rep, err := parseCIReport(goTests)
26+
if err != nil {
27+
t.Fatalf("error parsing ci report: %v", err)
28+
}
29+
30+
var b bytes.Buffer
31+
err = printCIReport(&b, rep)
32+
if err != nil {
33+
t.Fatalf("error printing report: %v", err)
34+
}
35+
36+
goldenFile := filepath.Join("testdata", "ci-report.golden")
37+
got := b.Bytes()
38+
if updateGoldenFile(t, goldenFile, got) {
39+
return
40+
}
41+
42+
want := readGoldenFile(t, goldenFile)
43+
require.Equal(t, string(want), string(got))
44+
}
45+
46+
func readGoldenFile(t *testing.T, name string) []byte {
47+
t.Helper()
48+
b, err := os.ReadFile(name)
49+
require.NoError(t, err, "error reading golden file")
50+
return b
51+
}
52+
53+
func updateGoldenFile(t *testing.T, name string, content []byte) bool {
54+
t.Helper()
55+
if *updateGoldenFiles {
56+
err := os.WriteFile(name, content, 0o644)
57+
require.NoError(t, err, "error updating golden file")
58+
return true
59+
}
60+
return false
61+
}

0 commit comments

Comments
 (0)