Skip to content

Commit daae143

Browse files
committed
test: add error return tests
1 parent efeb3da commit daae143

2 files changed

Lines changed: 239 additions & 0 deletions

File tree

internal/controller/linodemachine_controller_helpers_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import (
66
"context"
77
"crypto/rand"
88
b64 "encoding/base64"
9+
"errors"
910
"fmt"
11+
"net/http"
1012
"slices"
1113
"testing"
1214

@@ -2727,3 +2729,108 @@ func TestBuildInstanceAddrs(t *testing.T) {
27272729
})
27282730
}
27292731
}
2732+
2733+
func TestRetryIfTransient(t *testing.T) {
2734+
t.Parallel()
2735+
2736+
tests := []struct {
2737+
name string
2738+
err error
2739+
expectRequeue bool
2740+
expectError bool
2741+
expectErrorMsg string
2742+
}{
2743+
{
2744+
name: "rate limit error (429) - should requeue without error",
2745+
err: &linodego.Error{
2746+
Code: http.StatusTooManyRequests,
2747+
Message: "rate limited",
2748+
},
2749+
expectRequeue: true,
2750+
expectError: false,
2751+
},
2752+
{
2753+
name: "internal server error (500) - should requeue without error",
2754+
err: &linodego.Error{
2755+
Code: http.StatusInternalServerError,
2756+
Message: "internal error",
2757+
},
2758+
expectRequeue: true,
2759+
expectError: false,
2760+
},
2761+
{
2762+
name: "bad gateway error (502) - should requeue without error",
2763+
err: &linodego.Error{
2764+
Code: http.StatusBadGateway,
2765+
Message: "bad gateway",
2766+
},
2767+
expectRequeue: true,
2768+
expectError: false,
2769+
},
2770+
{
2771+
name: "unauthorized error (401) - should return error",
2772+
err: &linodego.Error{
2773+
Code: http.StatusUnauthorized,
2774+
Message: "Invalid Token",
2775+
},
2776+
expectRequeue: false,
2777+
expectError: true,
2778+
expectErrorMsg: "Invalid Token",
2779+
},
2780+
{
2781+
name: "forbidden error (403) - should return error",
2782+
err: &linodego.Error{
2783+
Code: http.StatusForbidden,
2784+
Message: "Forbidden",
2785+
},
2786+
expectRequeue: false,
2787+
expectError: true,
2788+
expectErrorMsg: "Forbidden",
2789+
},
2790+
{
2791+
name: "bad request error (400) - should return error",
2792+
err: &linodego.Error{
2793+
Code: http.StatusBadRequest,
2794+
Message: "bad request",
2795+
},
2796+
expectRequeue: false,
2797+
expectError: true,
2798+
expectErrorMsg: "bad request",
2799+
},
2800+
{
2801+
name: "not found error (404) - should return error",
2802+
err: &linodego.Error{
2803+
Code: http.StatusNotFound,
2804+
Message: "not found",
2805+
},
2806+
expectRequeue: false,
2807+
expectError: true,
2808+
expectErrorMsg: "not found",
2809+
},
2810+
{
2811+
name: "generic error - should return error",
2812+
err: errors.New("some generic error"),
2813+
expectRequeue: false,
2814+
expectError: true,
2815+
expectErrorMsg: "some generic error",
2816+
},
2817+
}
2818+
2819+
for _, tt := range tests {
2820+
testcase := tt
2821+
t.Run(testcase.name, func(t *testing.T) {
2822+
t.Parallel()
2823+
2824+
result, err := retryIfTransient(testcase.err)
2825+
2826+
if testcase.expectError {
2827+
require.Error(t, err, "expected error but got nil")
2828+
assert.Contains(t, err.Error(), testcase.expectErrorMsg)
2829+
assert.True(t, result.IsZero(), "expected zero result for terminal errors")
2830+
} else {
2831+
require.NoError(t, err, "expected no error but got one")
2832+
assert.Positive(t, result.RequeueAfter, "expected requeue delay for retryable errors")
2833+
}
2834+
})
2835+
}
2836+
}

util/helpers_test.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,138 @@ func TestIsRetryableError(t *testing.T) {
121121
}
122122
}
123123

124+
func TestIsAuthenticationError(t *testing.T) {
125+
t.Parallel()
126+
tests := []struct {
127+
name string
128+
err error
129+
want bool
130+
}{{
131+
name: "unauthorized error (401)",
132+
err: &linodego.Error{
133+
Response: nil,
134+
Code: http.StatusUnauthorized,
135+
Message: "Invalid Token",
136+
},
137+
want: true,
138+
}, {
139+
name: "forbidden error (403)",
140+
err: &linodego.Error{
141+
Response: nil,
142+
Code: http.StatusForbidden,
143+
Message: "Forbidden",
144+
},
145+
want: true,
146+
}, {
147+
name: "bad request error (400)",
148+
err: &linodego.Error{
149+
Response: nil,
150+
Code: http.StatusBadRequest,
151+
Message: "bad request",
152+
},
153+
want: false,
154+
}, {
155+
name: "not found error (404)",
156+
err: &linodego.Error{
157+
Response: nil,
158+
Code: http.StatusNotFound,
159+
Message: "not found",
160+
},
161+
want: false,
162+
}, {
163+
name: "internal server error (500)",
164+
err: &linodego.Error{
165+
Response: nil,
166+
Code: http.StatusInternalServerError,
167+
Message: "internal error",
168+
},
169+
want: false,
170+
}, {
171+
name: "non-Linode error",
172+
err: errors.New("random error"),
173+
want: false,
174+
}}
175+
for _, tt := range tests {
176+
testcase := tt
177+
t.Run(testcase.name, func(t *testing.T) {
178+
t.Parallel()
179+
if testcase.want != IsAuthenticationError(testcase.err) {
180+
t.Errorf("IsAuthenticationError() = %v, want %v", IsAuthenticationError(testcase.err), testcase.want)
181+
}
182+
})
183+
}
184+
}
185+
186+
func TestIsTerminalError(t *testing.T) {
187+
t.Parallel()
188+
tests := []struct {
189+
name string
190+
err error
191+
want bool
192+
}{{
193+
name: "bad request error (400)",
194+
err: &linodego.Error{
195+
Response: nil,
196+
Code: http.StatusBadRequest,
197+
Message: "bad request",
198+
},
199+
want: true,
200+
}, {
201+
name: "unauthorized error (401)",
202+
err: &linodego.Error{
203+
Response: nil,
204+
Code: http.StatusUnauthorized,
205+
Message: "Invalid Token",
206+
},
207+
want: true,
208+
}, {
209+
name: "forbidden error (403)",
210+
err: &linodego.Error{
211+
Response: nil,
212+
Code: http.StatusForbidden,
213+
Message: "Forbidden",
214+
},
215+
want: true,
216+
}, {
217+
name: "not found error (404)",
218+
err: &linodego.Error{
219+
Response: nil,
220+
Code: http.StatusNotFound,
221+
Message: "not found",
222+
},
223+
want: true,
224+
}, {
225+
name: "internal server error (500)",
226+
err: &linodego.Error{
227+
Response: nil,
228+
Code: http.StatusInternalServerError,
229+
Message: "internal error",
230+
},
231+
want: false,
232+
}, {
233+
name: "too many requests (429)",
234+
err: &linodego.Error{
235+
Response: nil,
236+
Code: http.StatusTooManyRequests,
237+
Message: "rate limited",
238+
},
239+
want: false,
240+
}, {
241+
name: "non-Linode error",
242+
err: errors.New("random error"),
243+
want: false,
244+
}}
245+
for _, tt := range tests {
246+
testcase := tt
247+
t.Run(testcase.name, func(t *testing.T) {
248+
t.Parallel()
249+
if testcase.want != IsTerminalError(testcase.err) {
250+
t.Errorf("IsTerminalError() = %v, want %v", IsTerminalError(testcase.err), testcase.want)
251+
}
252+
})
253+
}
254+
}
255+
124256
func TestGetInstanceID(t *testing.T) {
125257
t.Parallel()
126258
tests := []struct {

0 commit comments

Comments
 (0)