Skip to content

Commit c5fd5e4

Browse files
committed
test(format): add unit tests
1 parent 0891083 commit c5fd5e4

File tree

2 files changed

+317
-0
lines changed

2 files changed

+317
-0
lines changed

internal/format/reader_test.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package format
2+
3+
import (
4+
"io"
5+
"strings"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestNewReader(t *testing.T) {
13+
t.Parallel()
14+
is := assert.New(t)
15+
16+
input := strings.NewReader("test input")
17+
reader := NewReader(input)
18+
19+
is.Equal(input, reader.Reader)
20+
}
21+
22+
func TestReader_BeforeApply(t *testing.T) {
23+
t.Parallel()
24+
25+
input := strings.NewReader("test input")
26+
27+
tests := []struct {
28+
name string
29+
reader *Reader
30+
input io.Reader
31+
expectReader io.Reader
32+
}{
33+
{
34+
name: "sets reader from input",
35+
reader: &Reader{},
36+
input: input,
37+
expectReader: input,
38+
},
39+
{
40+
name: "nil receiver does not panic",
41+
reader: nil,
42+
input: input,
43+
},
44+
{
45+
name: "nil input",
46+
reader: &Reader{},
47+
input: nil,
48+
expectReader: nil,
49+
},
50+
}
51+
52+
for _, tt := range tests {
53+
t.Run(tt.name, func(t *testing.T) {
54+
t.Parallel()
55+
is := assert.New(t)
56+
57+
err := tt.reader.BeforeApply(tt.input)
58+
require.NoError(t, err)
59+
60+
if tt.reader != nil {
61+
is.Equal(tt.expectReader, tt.reader.Reader)
62+
}
63+
})
64+
}
65+
}
66+
67+
func TestReader_Read(t *testing.T) {
68+
t.Parallel()
69+
is := assert.New(t)
70+
71+
input := strings.NewReader("hello")
72+
reader := NewReader(input)
73+
74+
buf := make([]byte, 5)
75+
n, err := reader.Read(buf)
76+
77+
require.NoError(t, err)
78+
is.Equal(5, n)
79+
is.Equal("hello", string(buf))
80+
}
81+
82+
func TestReader_ImplementsIOReader(t *testing.T) {
83+
t.Parallel()
84+
85+
var _ io.Reader = &Reader{}
86+
var _ io.Reader = Reader{}
87+
}

internal/format/writer_test.go

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
package format
2+
3+
import (
4+
"bytes"
5+
"io"
6+
"strings"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func TestNewWriter(t *testing.T) {
14+
t.Parallel()
15+
is := assert.New(t)
16+
17+
buf := &bytes.Buffer{}
18+
writer := NewWriter(buf)
19+
20+
is.Equal(buf, writer.Writer)
21+
}
22+
23+
func TestWriter_BeforeApply(t *testing.T) {
24+
t.Parallel()
25+
26+
buf := &bytes.Buffer{}
27+
28+
tests := []struct {
29+
name string
30+
writer *Writer
31+
input io.Writer
32+
expectWriter io.Writer
33+
}{
34+
{
35+
name: "sets writer from input",
36+
writer: &Writer{},
37+
input: buf,
38+
expectWriter: buf,
39+
},
40+
{
41+
name: "nil receiver does not panic",
42+
writer: nil,
43+
input: buf,
44+
},
45+
{
46+
name: "nil input",
47+
writer: &Writer{},
48+
input: nil,
49+
expectWriter: nil,
50+
},
51+
}
52+
53+
for _, tt := range tests {
54+
t.Run(tt.name, func(t *testing.T) {
55+
t.Parallel()
56+
is := assert.New(t)
57+
58+
err := tt.writer.BeforeApply(tt.input)
59+
require.NoError(t, err)
60+
61+
if tt.writer != nil {
62+
is.Equal(tt.expectWriter, tt.writer.Writer)
63+
}
64+
})
65+
}
66+
}
67+
68+
func TestWriter_writer(t *testing.T) {
69+
t.Parallel()
70+
71+
tests := []struct {
72+
name string
73+
writer *Writer
74+
expect io.Writer
75+
}{
76+
{
77+
name: "nil Writer field returns io.Discard",
78+
writer: &Writer{},
79+
expect: io.Discard,
80+
},
81+
{
82+
name: "nil receiver returns io.Discard",
83+
writer: nil,
84+
expect: io.Discard,
85+
},
86+
}
87+
88+
for _, tt := range tests {
89+
t.Run(tt.name, func(t *testing.T) {
90+
t.Parallel()
91+
is := assert.New(t)
92+
93+
w := tt.writer.writer()
94+
is.Equal(tt.expect, w)
95+
})
96+
}
97+
}
98+
99+
func TestWriter_Print(t *testing.T) {
100+
t.Parallel()
101+
102+
tests := []struct {
103+
name string
104+
action func(Writer)
105+
expected string
106+
}{
107+
{
108+
name: "Printf",
109+
action: func(w Writer) { w.Printf("hello %s", "world") },
110+
expected: "hello world",
111+
},
112+
{
113+
name: "Println",
114+
action: func(w Writer) { w.Println("hello", "world") },
115+
expected: "hello world\n",
116+
},
117+
}
118+
119+
for _, tt := range tests {
120+
t.Run(tt.name, func(t *testing.T) {
121+
t.Parallel()
122+
is := assert.New(t)
123+
124+
buf := &bytes.Buffer{}
125+
writer := NewWriter(buf)
126+
tt.action(writer)
127+
128+
is.Equal(tt.expected, buf.String())
129+
})
130+
}
131+
}
132+
133+
func TestWriter_FormattedOutput(t *testing.T) {
134+
t.Parallel()
135+
136+
tests := []struct {
137+
name string
138+
action func(Writer)
139+
contains []string
140+
}{
141+
{
142+
name: "Successf",
143+
action: func(w Writer) { w.Successf("🎉", "created %s", "resource") },
144+
contains: []string{SuccessChar, "created resource", "🎉"},
145+
},
146+
{
147+
name: "Success",
148+
action: func(w Writer) { w.Success("🎉", "operation complete") },
149+
contains: []string{SuccessChar, "operation complete", "🎉"},
150+
},
151+
{
152+
name: "Failuref",
153+
action: func(w Writer) { w.Failuref("💥", "failed to %s", "connect") },
154+
contains: []string{FailureChar, "failed to connect", "💥"},
155+
},
156+
{
157+
name: "Warningf",
158+
action: func(w Writer) { w.Warningf("something %s", "happened") },
159+
contains: []string{"Warning:", "something happened"},
160+
},
161+
}
162+
163+
for _, tt := range tests {
164+
t.Run(tt.name, func(t *testing.T) {
165+
t.Parallel()
166+
is := assert.New(t)
167+
168+
buf := &bytes.Buffer{}
169+
writer := NewWriter(buf)
170+
tt.action(writer)
171+
172+
for _, s := range tt.contains {
173+
is.Contains(buf.String(), s)
174+
}
175+
})
176+
}
177+
}
178+
179+
func TestWriter_ImplementsIOWriter(t *testing.T) {
180+
t.Parallel()
181+
182+
var _ io.Writer = &Writer{}
183+
var _ io.Writer = Writer{}
184+
}
185+
186+
func TestConfirm(t *testing.T) {
187+
t.Parallel()
188+
189+
tests := []struct {
190+
name string
191+
input string
192+
expected bool
193+
expectErr bool
194+
}{
195+
{"lowercase y", "y\n", true, false},
196+
{"uppercase Y", "Y\n", true, false},
197+
{"lowercase yes", "yes\n", true, false},
198+
{"uppercase YES", "YES\n", true, false},
199+
{"mixed case Yes", "Yes\n", true, false},
200+
{"lowercase n", "n\n", false, false},
201+
{"uppercase N", "N\n", false, false},
202+
{"lowercase no", "no\n", false, false},
203+
{"uppercase NO", "NO\n", false, false},
204+
{"other input", "maybe\n", false, false},
205+
{"empty input", "", false, true},
206+
{"whitespace only", " \n", false, true},
207+
}
208+
209+
for _, tt := range tests {
210+
t.Run(tt.name, func(t *testing.T) {
211+
t.Parallel()
212+
is := assert.New(t)
213+
214+
output := &bytes.Buffer{}
215+
writer := NewWriter(output)
216+
reader := NewReader(strings.NewReader(tt.input))
217+
218+
result, err := writer.Confirm(reader, "Continue?")
219+
220+
if tt.expectErr {
221+
is.Error(err)
222+
return
223+
}
224+
225+
require.NoError(t, err)
226+
is.Equal(tt.expected, result)
227+
is.Contains(output.String(), "Continue? [y|n]:")
228+
})
229+
}
230+
}

0 commit comments

Comments
 (0)