Skip to content

Commit b5aec73

Browse files
committed
test: more test coverage
1 parent 494a4da commit b5aec73

13 files changed

+608
-2
lines changed

pkg/clients/gitlab/gitlab_test.go

+179
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package gitlab_test
2+
3+
import (
4+
"context"
5+
"io"
6+
"net/http"
7+
"os"
8+
"strings"
9+
"testing"
10+
11+
"github.com/stretchr/testify/assert"
12+
13+
"github.com/ekristen/distillery/pkg/clients/gitlab"
14+
)
15+
16+
func loadTestData(t *testing.T, filename string) string {
17+
data, err := os.ReadFile("testdata/" + filename)
18+
assert.NoError(t, err)
19+
return string(data)
20+
}
21+
22+
func newMockClient(responseBody string, statusCode int) *http.Client {
23+
return &http.Client{
24+
Transport: roundTripperFunc(func(req *http.Request) *http.Response {
25+
return &http.Response{
26+
StatusCode: statusCode,
27+
Body: io.NopCloser(strings.NewReader(responseBody)),
28+
Header: make(http.Header),
29+
}
30+
}),
31+
}
32+
}
33+
34+
type roundTripperFunc func(req *http.Request) *http.Response
35+
36+
func (f roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) {
37+
return f(req), nil
38+
}
39+
40+
func TestListReleases(t *testing.T) {
41+
mockResponse := loadTestData(t, "list-releases.json")
42+
client := gitlab.NewClient(newMockClient(mockResponse, http.StatusOK))
43+
client.SetToken("test-token")
44+
45+
releases, err := client.ListReleases(context.Background(), "owner/repo")
46+
assert.NoError(t, err)
47+
assert.NotNil(t, releases)
48+
assert.Equal(t, 2, len(releases))
49+
}
50+
51+
func TestGetLatestRelease(t *testing.T) {
52+
mockResponse := loadTestData(t, "latest-release.json")
53+
client := gitlab.NewClient(newMockClient(mockResponse, http.StatusOK))
54+
client.SetToken("test-token")
55+
56+
release, err := client.GetLatestRelease(context.Background(), "owner/repo")
57+
assert.NoError(t, err)
58+
assert.NotNil(t, release)
59+
assert.Equal(t, "v1.0.0", release.TagName)
60+
}
61+
62+
func TestGetRelease(t *testing.T) {
63+
mockResponse := loadTestData(t, "get-release.json")
64+
client := gitlab.NewClient(newMockClient(mockResponse, http.StatusOK))
65+
client.SetToken("test-token")
66+
67+
release, err := client.GetRelease(context.Background(), "owner/repo", "v1.0.0")
68+
assert.NoError(t, err)
69+
assert.NotNil(t, release)
70+
assert.Equal(t, "v1.0.0", release.TagName)
71+
}
72+
73+
func TestGitlabClientErrors(t *testing.T) {
74+
t.Parallel()
75+
76+
tests := []struct {
77+
name string
78+
testFunc func() error
79+
shouldFail bool
80+
}{
81+
{
82+
name: "ListReleases_InvalidURL",
83+
testFunc: func() error {
84+
client := gitlab.NewClient(newMockClient("", http.StatusOK))
85+
client.SetToken("test-token")
86+
_, err := client.ListReleases(context.Background(), "invalid-url-%%")
87+
return err
88+
},
89+
shouldFail: true,
90+
},
91+
{
92+
name: "GetLatestRelease_InvalidURL",
93+
testFunc: func() error {
94+
client := gitlab.NewClient(newMockClient("", http.StatusOK))
95+
client.SetToken("test-token")
96+
_, err := client.GetLatestRelease(context.Background(), "invalid-url-%%")
97+
return err
98+
},
99+
shouldFail: true,
100+
},
101+
{
102+
name: "GetRelease_InvalidURL",
103+
testFunc: func() error {
104+
client := gitlab.NewClient(newMockClient("", http.StatusOK))
105+
client.SetToken("test-token")
106+
_, err := client.GetRelease(context.Background(), "invalid-url-%%", "v1.0.0")
107+
return err
108+
},
109+
shouldFail: true,
110+
},
111+
{
112+
name: "ListReleases_HTTPError",
113+
testFunc: func() error {
114+
client := gitlab.NewClient(newMockClient("", http.StatusInternalServerError))
115+
_, err := client.ListReleases(context.Background(), "owner/repo")
116+
return err
117+
},
118+
shouldFail: true,
119+
},
120+
{
121+
name: "ListReleases_InvalidJSON",
122+
testFunc: func() error {
123+
client := gitlab.NewClient(newMockClient("invalid json", http.StatusOK))
124+
_, err := client.ListReleases(context.Background(), "owner/repo")
125+
return err
126+
},
127+
shouldFail: true,
128+
},
129+
{
130+
name: "GetLatestRelease_HTTPError",
131+
testFunc: func() error {
132+
client := gitlab.NewClient(newMockClient("", http.StatusInternalServerError))
133+
_, err := client.GetLatestRelease(context.Background(), "owner/repo")
134+
return err
135+
},
136+
shouldFail: true,
137+
},
138+
{
139+
name: "GetLatestRelease_InvalidJSON",
140+
testFunc: func() error {
141+
client := gitlab.NewClient(newMockClient("invalid json", http.StatusOK))
142+
_, err := client.GetLatestRelease(context.Background(), "owner/repo")
143+
return err
144+
},
145+
shouldFail: true,
146+
},
147+
{
148+
name: "GetRelease_HTTPError",
149+
testFunc: func() error {
150+
client := gitlab.NewClient(newMockClient("", http.StatusInternalServerError))
151+
_, err := client.GetRelease(context.Background(), "owner/repo", "v1.0.0")
152+
return err
153+
},
154+
shouldFail: true,
155+
},
156+
{
157+
name: "GetRelease_InvalidJSON",
158+
testFunc: func() error {
159+
client := gitlab.NewClient(newMockClient("invalid json", http.StatusOK))
160+
_, err := client.GetRelease(context.Background(), "owner/repo", "v1.0.0")
161+
return err
162+
},
163+
shouldFail: true,
164+
},
165+
}
166+
167+
for _, tt := range tests {
168+
tt := tt
169+
t.Run(tt.name, func(t *testing.T) {
170+
t.Parallel()
171+
err := tt.testFunc()
172+
if tt.shouldFail {
173+
assert.Error(t, err)
174+
} else {
175+
assert.NoError(t, err)
176+
}
177+
})
178+
}
179+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"tag_name": "v1.0.0",
3+
"name": "Release 1.0.0"
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[
2+
{
3+
"tag_name": "v1.0.0",
4+
"name": "Release 1.0.0"
5+
}
6+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[
2+
{
3+
"tag_name": "v1.0.0",
4+
"name": "Release 1.0.0"
5+
},
6+
{
7+
"tag_name": "v1.1.0",
8+
"name": "Release 1.1.0"
9+
}
10+
]
+170
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package hashicorp_test
2+
3+
import (
4+
"context"
5+
"io"
6+
"net/http"
7+
"os"
8+
"strings"
9+
"testing"
10+
11+
"github.com/stretchr/testify/assert"
12+
13+
"github.com/ekristen/distillery/pkg/clients/hashicorp"
14+
)
15+
16+
func loadTestData(t *testing.T, filename string) string {
17+
data, err := os.ReadFile("testdata/" + filename)
18+
assert.NoError(t, err)
19+
return string(data)
20+
}
21+
22+
func newMockClient(responseBody string, statusCode int) *http.Client {
23+
return &http.Client{
24+
Transport: roundTripperFunc(func(req *http.Request) *http.Response {
25+
return &http.Response{
26+
StatusCode: statusCode,
27+
Body: io.NopCloser(strings.NewReader(responseBody)),
28+
Header: make(http.Header),
29+
}
30+
}),
31+
}
32+
}
33+
34+
type roundTripperFunc func(req *http.Request) *http.Response
35+
36+
func (f roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) {
37+
return f(req), nil
38+
}
39+
40+
func TestHashicorpClient(t *testing.T) {
41+
client := hashicorp.NewClient(newMockClient("", http.StatusOK))
42+
43+
tests := []struct {
44+
name string
45+
testFunc func() error
46+
shouldFail bool
47+
}{
48+
{
49+
name: "ListProducts_Success",
50+
testFunc: func() error {
51+
mockResponse := loadTestData(t, "list-products.json")
52+
client := hashicorp.NewClient(newMockClient(mockResponse, http.StatusOK))
53+
_, err := client.ListProducts(context.Background())
54+
return err
55+
},
56+
shouldFail: false,
57+
},
58+
{
59+
name: "ListReleases_Success",
60+
testFunc: func() error {
61+
mockResponse := loadTestData(t, "list-releases.json")
62+
client := hashicorp.NewClient(newMockClient(mockResponse, http.StatusOK))
63+
_, err := client.ListReleases(context.Background(), "owner/repo", nil)
64+
return err
65+
},
66+
shouldFail: false,
67+
},
68+
{
69+
name: "GetVersion_Success",
70+
testFunc: func() error {
71+
mockResponse := loadTestData(t, "get-release.json")
72+
client := hashicorp.NewClient(newMockClient(mockResponse, http.StatusOK))
73+
_, err := client.GetVersion(context.Background(), "owner/repo", "v1.0.0")
74+
return err
75+
},
76+
shouldFail: false,
77+
},
78+
{
79+
name: "ListProducts_InvalidURL",
80+
testFunc: func() error {
81+
_, err := client.ListProducts(context.Background())
82+
return err
83+
},
84+
shouldFail: true,
85+
},
86+
{
87+
name: "ListReleases_InvalidURL",
88+
testFunc: func() error {
89+
_, err := client.ListReleases(context.Background(), "invalid-url-%%", nil)
90+
return err
91+
},
92+
shouldFail: true,
93+
},
94+
{
95+
name: "GetVersion_InvalidURL",
96+
testFunc: func() error {
97+
_, err := client.GetVersion(context.Background(), "invalid-url-%%", "v1.0.0")
98+
return err
99+
},
100+
shouldFail: true,
101+
},
102+
{
103+
name: "ListProducts_HTTPError",
104+
testFunc: func() error {
105+
client := hashicorp.NewClient(newMockClient("", http.StatusInternalServerError))
106+
_, err := client.ListProducts(context.Background())
107+
return err
108+
},
109+
shouldFail: true,
110+
},
111+
{
112+
name: "ListReleases_HTTPError",
113+
testFunc: func() error {
114+
client := hashicorp.NewClient(newMockClient("", http.StatusInternalServerError))
115+
_, err := client.ListReleases(context.Background(), "owner/repo", nil)
116+
return err
117+
},
118+
shouldFail: true,
119+
},
120+
{
121+
name: "GetVersion_HTTPError",
122+
testFunc: func() error {
123+
client := hashicorp.NewClient(newMockClient("", http.StatusInternalServerError))
124+
_, err := client.GetVersion(context.Background(), "owner/repo", "v1.0.0")
125+
return err
126+
},
127+
shouldFail: true,
128+
},
129+
{
130+
name: "ListProducts_InvalidJSON",
131+
testFunc: func() error {
132+
client := hashicorp.NewClient(newMockClient("invalid json", http.StatusOK))
133+
_, err := client.ListProducts(context.Background())
134+
return err
135+
},
136+
shouldFail: true,
137+
},
138+
{
139+
name: "ListReleases_InvalidJSON",
140+
testFunc: func() error {
141+
client := hashicorp.NewClient(newMockClient("invalid json", http.StatusOK))
142+
_, err := client.ListReleases(context.Background(), "owner/repo", nil)
143+
return err
144+
},
145+
shouldFail: true,
146+
},
147+
{
148+
name: "GetVersion_InvalidJSON",
149+
testFunc: func() error {
150+
client := hashicorp.NewClient(newMockClient("invalid json", http.StatusOK))
151+
_, err := client.GetVersion(context.Background(), "owner/repo", "v1.0.0")
152+
return err
153+
},
154+
shouldFail: true,
155+
},
156+
}
157+
158+
for _, tt := range tests {
159+
tt := tt
160+
t.Run(tt.name, func(t *testing.T) {
161+
t.Parallel()
162+
err := tt.testFunc()
163+
if tt.shouldFail {
164+
assert.Error(t, err)
165+
} else {
166+
assert.NoError(t, err)
167+
}
168+
})
169+
}
170+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"version": "v1.0.0",
3+
"name": "Release 1.0.0",
4+
"is_prerelease": false
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
"product1",
3+
"product2"
4+
]

0 commit comments

Comments
 (0)