1package cli
2
3import (
4 "bytes"
5 "errors"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
11type failingWriter struct{}
12
13func (failingWriter) Write(_ []byte) (int, error) {
14 return 0, errors.New("write failed")
15}
16
17func TestSortSemverTags(t *testing.T) {
18 tests := []struct {
19 name string
20 tags []string
21 wantTags []string
22 }{
23 {
24 name: "v-prefixed tags sorted descending",
25 tags: []string{"v1.0.0", "v2.0.0", "v1.5.0"},
26 wantTags: []string{"v2.0.0", "v1.5.0", "v1.0.0"},
27 },
28 {
29 name: "non-v-prefixed tags sorted as semver",
30 tags: []string{"1.0.0", "2.0.0", "1.5.0"},
31 wantTags: []string{"2.0.0", "1.5.0", "1.0.0"},
32 },
33 {
34 name: "mixed v and non-v prefixed",
35 tags: []string{"v1.0.0", "2.0.0", "1.5.0"},
36 wantTags: []string{"2.0.0", "1.5.0", "v1.0.0"}, // all recognized as semver, sorted desc
37 },
38 {
39 name: "pre-release tags",
40 tags: []string{"v1.0.0-rc1", "v1.0.0", "1.0.0-beta"},
41 wantTags: []string{"v1.0.0", "v1.0.0-rc1", "1.0.0-beta"}, // release > pre-release
42 },
43 {
44 name: "non-semver tags appended after",
45 tags: []string{"latest", "v1.0.0", "dev"},
46 wantTags: []string{"v1.0.0", "latest", "dev"},
47 },
48 }
49
50 for _, tt := range tests {
51 t.Run(tt.name, func(t *testing.T) {
52 gotTags := sortSemverTags(tt.tags)
53 assert.Equal(t, tt.wantTags, gotTags)
54 })
55 }
56}
57
58func TestValidateTagExists(t *testing.T) {
59 assert.True(t, validateTagExists("v1.0.0", []string{"v1.0.0", "v2.0.0"}))
60 assert.False(t, validateTagExists("v3.0.0", []string{"v1.0.0", "v2.0.0"}))
61}
62
63func TestPrintRollbackTags_WritesToProvidedWriter(t *testing.T) {
64 var buf bytes.Buffer
65
66 err := printRollbackTags(&buf, "myapp.example.com", "v1.2.0", []string{"v1.2.0", "v1.1.0"}, false)
67 assert.NoError(t, err)
68
69 output := buf.String()
70 assert.Contains(t, output, "Available tags for")
71 assert.Contains(t, output, "myapp.example.com")
72 assert.Contains(t, output, "- v1.2.0 (current)")
73 assert.Contains(t, output, "- v1.1.0")
74}
75
76func TestPrintRollbackTags_ReturnsWriteError(t *testing.T) {
77 err := printRollbackTags(failingWriter{}, "myapp.example.com", "v1.2.0", []string{"v1.2.0"}, false)
78 assert.Error(t, err)
79 assert.Contains(t, err.Error(), "write failed")
80}