-
Notifications
You must be signed in to change notification settings - Fork 4
/
cli_test.go
133 lines (110 loc) · 3.08 KB
/
cli_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package mermaid
import (
"context"
"flag"
"fmt"
"log"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.abhg.dev/goldmark/mermaid/internal/exectest"
)
func TestCLI_NoPath(t *testing.T) {
t.Parallel()
var cli mmdcCLI
cmd := cli.CommandContext(context.Background(), "--version")
assert.Equal(t, []string{"mmdc", "--version"}, cmd.Args)
}
func TestCLI_ExplicitPath(t *testing.T) {
t.Parallel()
cli := mmdcCLI{Path: "/bin/false"}
cmd := cli.CommandContext(context.Background(), "--version")
assert.Equal(t, []string{"/bin/false", "--version"}, cmd.Args)
}
func TestCLICompiler_Simple(t *testing.T) {
t.Parallel()
mmdc := exectest.Act(t, func() {
opts, err := parseMermaidOpts(os.Args[1:])
if err != nil {
log.Fatal(err)
}
if want, got := "neutral", opts.Theme; want != got {
log.Fatalf("unexpected theme: want %q, got %q", want, got)
}
if want, got := "svg", opts.OutputFormat; want != got {
log.Fatalf("unexpected output format: want %q, got %q", want, got)
}
src, err := os.ReadFile(opts.Input)
if err != nil {
log.Fatal(err)
}
// This isn't real output, but it's good enough for the test.
svg := "<svg>" + string(src) + "</svg>"
if err := os.WriteFile(opts.Output, []byte(svg), 0o644); err != nil {
log.Fatal(err)
}
})
c := CLICompiler{
CLI: mmdc,
Theme: "neutral",
}
res, err := c.Compile(context.Background(), &CompileRequest{
Source: `A -> B`,
})
require.NoError(t, err)
assert.Equal(t, `<svg>A -> B</svg>`, res.SVG)
}
func TestCLICompiler_Error_MermaidRender(t *testing.T) {
t.Parallel()
mmdc := exectest.Act(t, func() {
log.Fatal("great sadness")
})
c := CLICompiler{CLI: mmdc}
_, err := c.Compile(context.Background(), &CompileRequest{
Source: `A -> B`,
})
require.Error(t, err)
assert.ErrorContains(t, err, "exit status 1")
assert.ErrorContains(t, err, "great sadness")
}
func TestCLICompiler_Error_NoOutput(t *testing.T) {
t.Parallel()
mmdc := exectest.Act(t, func() {
opts, err := parseMermaidOpts(os.Args[1:])
if err != nil {
log.Fatal(err)
}
if err := os.Remove(opts.Output); err != nil {
log.Fatal(err)
}
fmt.Println("intentional no-op")
})
c := &CLICompiler{CLI: mmdc}
_, err := c.Compile(context.Background(), &CompileRequest{
Source: `A -> B`,
})
require.Error(t, err)
assert.ErrorContains(t, err, "read svg:")
assert.ErrorContains(t, err, "no such file or directory")
assert.ErrorContains(t, err, "output:\nintentional no-op")
}
type mermaidOpts struct {
Input string
Output string
OutputFormat string
Theme string
Quiet bool
}
// parseMermaidOpts is a helper used in tests pretending to be the mmdc CLI.
func parseMermaidOpts(args []string) (*mermaidOpts, error) {
var o mermaidOpts
flag := flag.NewFlagSet("mmdc", flag.ContinueOnError)
flag.StringVar(&o.Input, "input", "", "")
flag.StringVar(&o.Output, "output", "", "")
flag.StringVar(&o.Theme, "theme", "", "")
flag.StringVar(&o.OutputFormat, "outputFormat", "", "")
flag.BoolVar(&o.Quiet, "quiet", false, "")
err := flag.Parse(args)
return &o, err
}