Skip to content

Commit efaf8e5

Browse files
committed
chore: add test to fmt cmd
1 parent 19ffb1c commit efaf8e5

File tree

59 files changed

+197
-47
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+197
-47
lines changed

.version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.2.708
1+
0.2.709

cmd/templ/fmtcmd/main_test.go

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package fmtcmd
2+
3+
import (
4+
_ "embed"
5+
"fmt"
6+
"io"
7+
"log/slog"
8+
"os"
9+
"path/filepath"
10+
"strings"
11+
"testing"
12+
13+
"github.com/google/go-cmp/cmp"
14+
"golang.org/x/tools/txtar"
15+
)
16+
17+
//go:embed testdata.txtar
18+
var testDataTxTar []byte
19+
20+
type testProject struct {
21+
dir string
22+
cleanup func()
23+
testFiles map[string]testFile
24+
}
25+
26+
type testFile struct {
27+
name string
28+
input, expected string
29+
}
30+
31+
func setupProjectDir() (tp testProject, err error) {
32+
tp.dir, err = os.MkdirTemp("", "fmtcmd_test_*")
33+
if err != nil {
34+
return tp, fmt.Errorf("failed to make test dir: %w", err)
35+
}
36+
tp.testFiles = make(map[string]testFile)
37+
testData := txtar.Parse(testDataTxTar)
38+
for i := 0; i < len(testData.Files); i += 2 {
39+
file := testData.Files[i]
40+
err = os.WriteFile(filepath.Join(tp.dir, file.Name), file.Data, 0660)
41+
if err != nil {
42+
return tp, fmt.Errorf("failed to write file: %w", err)
43+
}
44+
tp.testFiles[file.Name] = testFile{
45+
name: filepath.Join(tp.dir, file.Name),
46+
input: string(file.Data),
47+
expected: string(testData.Files[i+1].Data),
48+
}
49+
}
50+
tp.cleanup = func() {
51+
os.RemoveAll(tp.dir)
52+
}
53+
return tp, nil
54+
}
55+
56+
func TestFormat(t *testing.T) {
57+
log := slog.New(slog.NewJSONHandler(io.Discard, nil))
58+
t.Run("can format a single file from stdin to stdout", func(t *testing.T) {
59+
tp, err := setupProjectDir()
60+
if err != nil {
61+
t.Fatalf("failed to setup project dir: %v", err)
62+
}
63+
defer tp.cleanup()
64+
stdin := strings.NewReader(tp.testFiles["a.templ"].input)
65+
stdout := new(strings.Builder)
66+
Run(log, stdin, stdout, Arguments{
67+
ToStdout: true,
68+
})
69+
if diff := cmp.Diff(tp.testFiles["a.templ"].expected, stdout.String()); diff != "" {
70+
t.Error(diff)
71+
}
72+
})
73+
t.Run("can process a single file to stdout", func(t *testing.T) {
74+
tp, err := setupProjectDir()
75+
if err != nil {
76+
t.Fatalf("failed to setup project dir: %v", err)
77+
}
78+
defer tp.cleanup()
79+
stdout := new(strings.Builder)
80+
Run(log, nil, stdout, Arguments{
81+
ToStdout: true,
82+
Files: []string{
83+
tp.testFiles["a.templ"].name,
84+
},
85+
})
86+
if diff := cmp.Diff(tp.testFiles["a.templ"].expected, stdout.String()); diff != "" {
87+
t.Error(diff)
88+
}
89+
})
90+
t.Run("can process a single file in place", func(t *testing.T) {
91+
tp, err := setupProjectDir()
92+
if err != nil {
93+
t.Fatalf("failed to setup project dir: %v", err)
94+
}
95+
defer tp.cleanup()
96+
Run(log, nil, nil, Arguments{
97+
Files: []string{
98+
tp.testFiles["a.templ"].name,
99+
},
100+
})
101+
data, err := os.ReadFile(tp.testFiles["a.templ"].name)
102+
if err != nil {
103+
t.Fatalf("failed to read file: %v", err)
104+
}
105+
if diff := cmp.Diff(tp.testFiles["a.templ"].expected, string(data)); diff != "" {
106+
t.Error(diff)
107+
}
108+
})
109+
}

cmd/templ/fmtcmd/testdata.txtar

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
-- a.templ --
2+
package test
3+
4+
templ a() {
5+
<div><p>A
6+
</p></div>
7+
}
8+
-- a.templ --
9+
package test
10+
11+
templ a() {
12+
<div>
13+
<p>
14+
A
15+
</p>
16+
</div>
17+
}
18+
-- b.templ --
19+
package test
20+
21+
templ b() {
22+
<div><p>B
23+
</p></div>
24+
}
25+
-- a.templ --
26+
package test
27+
28+
templ b() {
29+
<div>
30+
<p>
31+
B
32+
</p>
33+
</div>
34+
}

cmd/templ/lspcmd/lsp_test.go

+3-44
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
package lspcmd
22

33
import (
4-
"bytes"
54
"context"
6-
"embed"
75
"fmt"
86
"io"
97
"os"
10-
"path/filepath"
11-
"strings"
128
"sync"
139
"testing"
1410
"time"
@@ -17,49 +13,12 @@ import (
1713
"github.com/a-h/protocol"
1814
"github.com/a-h/templ/cmd/templ/generatecmd/modcheck"
1915
"github.com/a-h/templ/cmd/templ/lspcmd/lspdiff"
16+
"github.com/a-h/templ/cmd/templ/testproject"
2017
"go.lsp.dev/jsonrpc2"
2118
"go.lsp.dev/uri"
2219
"go.uber.org/zap"
2320
)
2421

25-
//go:embed testdata/*
26-
var testdata embed.FS
27-
28-
func createTestProject(moduleRoot string) (dir string, err error) {
29-
dir, err = os.MkdirTemp("", "templ_watch_test_*")
30-
if err != nil {
31-
return dir, fmt.Errorf("failed to make test dir: %w", err)
32-
}
33-
files, err := testdata.ReadDir("testdata")
34-
if err != nil {
35-
return dir, fmt.Errorf("failed to read embedded dir: %w", err)
36-
}
37-
for _, file := range files {
38-
src := filepath.Join("testdata", file.Name())
39-
data, err := testdata.ReadFile(src)
40-
if err != nil {
41-
return dir, fmt.Errorf("failed to read file: %w", err)
42-
}
43-
44-
target := filepath.Join(dir, file.Name())
45-
if file.Name() == "go.mod.embed" {
46-
data = bytes.ReplaceAll(data, []byte("{moduleRoot}"), []byte(moduleRoot))
47-
target = filepath.Join(dir, "go.mod")
48-
}
49-
err = os.WriteFile(target, data, 0660)
50-
if err != nil {
51-
return dir, fmt.Errorf("failed to copy file: %w", err)
52-
}
53-
}
54-
return dir, nil
55-
}
56-
57-
func mustReplaceLine(file string, line int, replacement string) string {
58-
lines := strings.Split(file, "\n")
59-
lines[line-1] = replacement
60-
return strings.Join(lines, "\n")
61-
}
62-
6322
func TestCompletion(t *testing.T) {
6423
if testing.Short() {
6524
return
@@ -145,7 +104,7 @@ func TestCompletion(t *testing.T) {
145104
for i, test := range tests {
146105
t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
147106
// Edit the file.
148-
updated := mustReplaceLine(string(templFile), test.line, test.replacement)
107+
updated := testproject.MustReplaceLine(string(templFile), test.line, test.replacement)
149108
err = server.DidChange(ctx, &protocol.DidChangeTextDocumentParams{
150109
TextDocument: protocol.VersionedTextDocumentIdentifier{
151110
TextDocumentIdentifier: protocol.TextDocumentIdentifier{
@@ -454,7 +413,7 @@ func Setup(ctx context.Context, log *zap.Logger) (clientCtx context.Context, app
454413
return ctx, appDir, client, server, teardown, fmt.Errorf("could not find local templ go.mod file: %v", err)
455414
}
456415

457-
appDir, err = createTestProject(moduleRoot)
416+
appDir, err = testproject.Create(moduleRoot)
458417
if err != nil {
459418
return ctx, appDir, client, server, teardown, fmt.Errorf("failed to create test project: %v", err)
460419
}

cmd/templ/lspcmd/testdata/templates_templ.go renamed to cmd/templ/testproject/testdata/templates_templ.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/templ/testproject/testproject.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package testproject
2+
3+
import (
4+
"bytes"
5+
"embed"
6+
"fmt"
7+
"os"
8+
"path/filepath"
9+
"strings"
10+
)
11+
12+
//go:embed testdata/*
13+
var testdata embed.FS
14+
15+
func Create(moduleRoot string) (dir string, err error) {
16+
dir, err = os.MkdirTemp("", "templ_test_*")
17+
if err != nil {
18+
return dir, fmt.Errorf("failed to make test dir: %w", err)
19+
}
20+
files, err := testdata.ReadDir("testdata")
21+
if err != nil {
22+
return dir, fmt.Errorf("failed to read embedded dir: %w", err)
23+
}
24+
for _, file := range files {
25+
src := filepath.Join("testdata", file.Name())
26+
data, err := testdata.ReadFile(src)
27+
if err != nil {
28+
return dir, fmt.Errorf("failed to read file: %w", err)
29+
}
30+
31+
target := filepath.Join(dir, file.Name())
32+
if file.Name() == "go.mod.embed" {
33+
data = bytes.ReplaceAll(data, []byte("{moduleRoot}"), []byte(moduleRoot))
34+
target = filepath.Join(dir, "go.mod")
35+
}
36+
err = os.WriteFile(target, data, 0660)
37+
if err != nil {
38+
return dir, fmt.Errorf("failed to copy file: %w", err)
39+
}
40+
}
41+
return dir, nil
42+
}
43+
44+
func MustReplaceLine(file string, line int, replacement string) string {
45+
lines := strings.Split(file, "\n")
46+
lines[line-1] = replacement
47+
return strings.Join(lines, "\n")
48+
}

parser/v2/format_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
func TestFormatting(t *testing.T) {
13-
files, _ := filepath.Glob("testdata/*.txt")
13+
files, _ := filepath.Glob("formattestdata/*.txt")
1414
if len(files) == 0 {
1515
t.Errorf("no test files found")
1616
}

0 commit comments

Comments
 (0)