Skip to content

Commit 6bcdee8

Browse files
authored
test(commands): snapshot representative output contracts (#69)
1 parent be50bad commit 6bcdee8

3 files changed

Lines changed: 72 additions & 6 deletions

File tree

internal/commands/members/members_output_internal_test.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package members
22

33
import (
44
"bytes"
5+
"regexp"
6+
"strings"
57
"testing"
68
"time"
79

@@ -23,7 +25,7 @@ func TestRenderDeleteMemberResult(t *testing.T) {
2325
err := renderDeleteMemberResult(appCtx)
2426

2527
require.NoError(t, err)
26-
assert.Contains(t, out.String(), `"status": "deleted"`)
28+
assert.Equal(t, "{\n \"status\": \"deleted\"\n}\n", out.String())
2729
})
2830

2931
t.Run("writes status message in human mode", func(t *testing.T) {
@@ -34,7 +36,7 @@ func TestRenderDeleteMemberResult(t *testing.T) {
3436
err := renderDeleteMemberResult(appCtx)
3537

3638
require.NoError(t, err)
37-
assert.Contains(t, statusOut.String(), "Member deleted")
39+
assert.Equal(t, "✓ Member deleted\n", statusOut.String())
3840
})
3941
}
4042

@@ -56,7 +58,22 @@ func TestRenderMember(t *testing.T) {
5658
err := renderMember(&app.Context{Output: &out, ExactTimestamps: true}, &out, member)
5759

5860
require.NoError(t, err)
59-
assert.Contains(t, out.String(), createdAt.In(time.Local).Format(time.RFC3339))
60-
assert.Contains(t, out.String(), updatedAt.In(time.Local).Format(time.RFC3339))
61+
assert.Equal(t, "ID: member-1\nEmail: member@example.com\nRoles: role_employee\nStatus: Accepted\nNickname: -\nCreated At: "+createdAt.In(time.Local).Format(time.RFC3339)+"\nUpdated At: "+updatedAt.In(time.Local).Format(time.RFC3339), normalizeOutput(out.String()))
6162
})
6263
}
64+
65+
var ansiPattern = regexp.MustCompile(`\x1b\[[0-9;]*m`)
66+
67+
func normalizeOutput(value string) string {
68+
value = ansiPattern.ReplaceAllString(strings.ReplaceAll(value, "\r\n", "\n"), "")
69+
lines := strings.Split(value, "\n")
70+
normalized := make([]string, 0, len(lines))
71+
for _, line := range lines {
72+
line = strings.TrimSpace(line)
73+
if line == "" {
74+
continue
75+
}
76+
normalized = append(normalized, line)
77+
}
78+
return strings.Join(normalized, "\n")
79+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package roles_test
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"regexp"
7+
"strings"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
13+
"github.com/sumup/sumup-cli/internal/app"
14+
"github.com/sumup/sumup-cli/internal/commands/roles"
15+
)
16+
17+
func TestNewCommand(t *testing.T) {
18+
t.Run("list renders the human output contract", func(t *testing.T) {
19+
var out bytes.Buffer
20+
21+
cmd := roles.NewCommand()
22+
cmd.Commands[0].Metadata = map[string]any{
23+
app.ContextKey: &app.Context{Output: &out},
24+
}
25+
26+
listCmd := cmd.Commands[0]
27+
28+
err := listCmd.Action(context.Background(), listCmd)
29+
30+
require.NoError(t, err)
31+
assert.Equal(t, "Roles\nRole Display Name Description\nrole_owner Owner Full administrative access to the merchant account\nrole_admin Admin Administrative access with some restrictions\nrole_employee Employee Standard employee access for daily operations\nrole_manager Manager Management access with elevated permissions\nrole_cashier Cashier Limited access for point-of-sale operations", normalizeOutput(out.String()))
32+
})
33+
}
34+
35+
var ansiPattern = regexp.MustCompile(`\x1b\[[0-9;]*m`)
36+
37+
func normalizeOutput(value string) string {
38+
value = ansiPattern.ReplaceAllString(strings.ReplaceAll(value, "\r\n", "\n"), "")
39+
lines := strings.Split(value, "\n")
40+
normalized := make([]string, 0, len(lines))
41+
for _, line := range lines {
42+
line = strings.Join(strings.Fields(line), " ")
43+
if line == "" {
44+
continue
45+
}
46+
normalized = append(normalized, line)
47+
}
48+
return strings.Join(normalized, "\n")
49+
}

internal/commands/transactions/transactions_output_internal_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func TestRenderRefundResult(t *testing.T) {
1818
err := renderRefundResult(appCtx)
1919

2020
require.NoError(t, err)
21-
assert.Contains(t, statusOut.String(), "Transaction refunded")
21+
assert.Equal(t, "✓ Transaction refunded\n", statusOut.String())
2222
})
2323

2424
t.Run("prints json acknowledgement when requested", func(t *testing.T) {
@@ -32,6 +32,6 @@ func TestRenderRefundResult(t *testing.T) {
3232
err := renderRefundResult(appCtx)
3333

3434
require.NoError(t, err)
35-
assert.Contains(t, out.String(), `"status": "refunded"`)
35+
assert.Equal(t, "{\n \"status\": \"refunded\"\n}\n", out.String())
3636
})
3737
}

0 commit comments

Comments
 (0)