@@ -5,13 +5,16 @@ import (
5
5
"errors"
6
6
"io"
7
7
"net/http"
8
+ "slices"
8
9
"strings"
9
10
"testing"
10
11
"time"
11
12
12
- "k8s.io/client -go/rest "
13
+ "oras.land/oras -go/pkg/registry/remote "
13
14
)
14
15
16
+ var _ remote.Client = & MockHTTPClient {}
17
+
15
18
type MockHTTPClient struct {
16
19
wantErr bool
17
20
mutateFn func (res * http.Response )
@@ -30,11 +33,14 @@ func (m MockHTTPClient) Do(_ *http.Request) (*http.Response, error) {
30
33
return resp , nil
31
34
}
32
35
33
- var _ rest.HTTPClient = & MockHTTPClient {}
36
+ var (
37
+ testBaseUrl = "https://quay.io/api/v1/"
38
+ testRepo = "testOrg/kuadrant-operator"
39
+ )
34
40
35
41
func Test_fetchTags (t * testing.T ) {
36
42
t .Run ("test error making request" , func (t * testing.T ) {
37
- tags , err := fetchTags (& MockHTTPClient {wantErr : true })
43
+ tags , err := fetchTags (& MockHTTPClient {wantErr : true }, & testBaseUrl , & testRepo )
38
44
39
45
if err == nil {
40
46
t .Error ("error expected" )
@@ -53,7 +59,7 @@ func Test_fetchTags(t *testing.T) {
53
59
tags , err := fetchTags (& MockHTTPClient {mutateFn : func (res * http.Response ) {
54
60
res .Status = string (rune (400 ))
55
61
res .Body = io .NopCloser (bytes .NewReader (nil ))
56
- }})
62
+ }}, & testBaseUrl , & testRepo )
57
63
58
64
if err == nil {
59
65
t .Error ("error expected" )
@@ -72,7 +78,7 @@ func Test_fetchTags(t *testing.T) {
72
78
tags , err := fetchTags (& MockHTTPClient {mutateFn : func (res * http.Response ) {
73
79
res .Status = string (rune (200 ))
74
80
res .Body = io .NopCloser (bytes .NewReader ([]byte ("{notTags: error}" )))
75
- }})
81
+ }}, & testBaseUrl , & testRepo )
76
82
77
83
if err == nil {
78
84
t .Error ("error expected" )
@@ -90,16 +96,16 @@ func Test_fetchTags(t *testing.T) {
90
96
t .Run ("test successful response with tags" , func (t * testing.T ) {
91
97
mockJSONResponse := `{
92
98
"tags": [
93
- {"name": "v1.0.0", "last_modified": "Mon, 02 Jan 2006 15:04:05 MST" },
94
- {"name": "v1.1.0", "last_modified": "Tue, 03 Jan 2006 15:04:05 MST" },
95
- {"name": "latest", "last_modified": "Wed, 04 Jan 2006 15:04:05 MST" }
99
+ {"name": "v1.0.0"},
100
+ {"name": "v1.1.0"},
101
+ {"name": "latest"}
96
102
]
97
103
}`
98
104
99
105
tags , err := fetchTags (& MockHTTPClient {mutateFn : func (res * http.Response ) {
100
106
res .StatusCode = http .StatusOK
101
107
res .Body = io .NopCloser (bytes .NewReader ([]byte (mockJSONResponse )))
102
- }})
108
+ }}, & testBaseUrl , & testRepo )
103
109
104
110
if err != nil {
105
111
t .Fatalf ("unexpected error: %v" , err )
@@ -110,15 +116,15 @@ func Test_fetchTags(t *testing.T) {
110
116
t .Fatalf ("expected 3 tags, got %d" , len (tags ))
111
117
}
112
118
113
- expectedTags := map [ string ]string {
114
- "v1.0.0" : "Mon, 02 Jan 2006 15:04:05 MST" ,
115
- "v1.1.0" : "Tue, 03 Jan 2006 15:04:05 MST" ,
116
- "latest" : "Wed, 04 Jan 2006 15:04:05 MST" ,
119
+ expectedTags := [ ]string {
120
+ "v1.0.0" ,
121
+ "v1.1.0" ,
122
+ "latest" ,
117
123
}
118
124
119
125
for _ , tag := range tags {
120
- if expectedDate , ok := expectedTags [ tag .Name ]; ! ok || expectedDate != tag . LastModified {
121
- t .Errorf ("unexpected tag: got %v, expected %v" , tag , expectedTags [ tag . Name ] )
126
+ if ! slices . Contains ( expectedTags , tag .Name ) {
127
+ t .Errorf ("unexpected tag: %v, does not exist in expected tags %v" , tag , expectedTags )
122
128
}
123
129
}
124
130
})
@@ -131,7 +137,7 @@ func Test_deleteTag(t *testing.T) {
131
137
res .Body = io .NopCloser (bytes .NewReader (nil ))
132
138
}}
133
139
134
- err := deleteTag (client , "fake_access_token" , "v1.0.0" )
140
+ err := deleteTag (client , & testBaseUrl , & testRepo , "fake_access_token" , "v1.0.0" )
135
141
136
142
if err != nil {
137
143
t .Error ("expected successful delete, got error" )
@@ -144,7 +150,7 @@ func Test_deleteTag(t *testing.T) {
144
150
res .Body = io .NopCloser (bytes .NewReader ([]byte ("internal server error" )))
145
151
}}
146
152
147
- err := deleteTag (client , "fake_access_token" , "v1.0.0" )
153
+ err := deleteTag (client , & testBaseUrl , & testRepo , "fake_access_token" , "v1.0.0" )
148
154
149
155
if err == nil {
150
156
t .Error ("expected failure, got success" )
@@ -154,7 +160,7 @@ func Test_deleteTag(t *testing.T) {
154
160
t .Run ("test error making delete request" , func (t * testing.T ) {
155
161
client := & MockHTTPClient {wantErr : true }
156
162
157
- err := deleteTag (client , "fake_access_token" , "v1.0.0" )
163
+ err := deleteTag (client , & testBaseUrl , & testRepo , "fake_access_token" , "v1.0.0" )
158
164
159
165
if err == nil {
160
166
t .Error ("expected failure, got success" )
@@ -165,13 +171,13 @@ func Test_deleteTag(t *testing.T) {
165
171
func Test_filterTags (t * testing.T ) {
166
172
t .Run ("test filter tags correctly" , func (t * testing.T ) {
167
173
tags := []Tag {
168
- {Name : "nightly-build" , LastModified : time . Now (). Add ( - 24 * time . Hour ). Format ( time . RFC1123 ) }, // Old tag, should be deleted
169
- {Name : "v1.1.0" , LastModified : time . Now (). Format ( time . RFC1123 ) }, // Recent tag, should be kept
170
- {Name : "latest" , LastModified : time . Now (). Add ( - 24 * time . Hour ). Format ( time . RFC1123 ) }, // Old tag, but name contains preserveSubstring latest
171
- {Name : "release- v1.2.3" , LastModified : time . Now (). Add ( - 24 * time . Hour ). Format ( time . RFC1123 ) }, // Old tag, but name contains preserveSubstring release-v*
172
- {Name : "v1.0.0" , LastModified : time . Now (). Add ( - 24 * time . Hour ). Format ( time . RFC1123 ) }, // Old tag, but name contains preserveSubstring semver release
173
- {Name : "v1.2.0-rc1 " , LastModified : time .Now ().Add ( - 24 * time . Hour ). Format (time .RFC1123 )}, // Old tag, but name contains preserveSubstring semver release-candidate
174
- {Name : "expiry_set" , LastModified : time . Now (). Add ( - 24 * time . Hour ). Format ( time . RFC1123 ), Expiration : time . Now (). Format ( time . RFC1123 )}, // Old tag, but already has an expiry set
174
+ {Name : "nightly-build" }, // Not a preserved tag, should be deleted
175
+ {Name : "latest" }, // Preserved tag, name is latest
176
+ {Name : "release-v1.0.0" }, // Preserved tag, name contains preserveSubstring branch release semver, release-v*
177
+ {Name : "v1.0.0" }, // Preserved tag, but name contains preserveSubstring tag semver release
178
+ {Name : "v1.1.0-rc1" }, // Preserved tag, but name contains preserveSubstring tag semver release-candidate
179
+ {Name : "expiry_set " , Expiration : time .Now ().Format (time .RFC1123 )}, // Skipped tag, already has an expiry set
180
+ {Name : "release-not-semver" }, // Not a preserved tag, should be deleted
175
181
}
176
182
177
183
tagsToDelete , remainingTags , err := filterTags (tags , preserveSubstrings )
@@ -180,43 +186,39 @@ func Test_filterTags(t *testing.T) {
180
186
t .Errorf ("unexpected error: %v" , err )
181
187
}
182
188
183
- if len (tagsToDelete ) != 1 || len (remainingTags ) != 6 {
184
- t .Fatalf ("expected 1 tag to delete and 6 remaining, got %d to delete and %d remaining" , len (tagsToDelete ), len (remainingTags ))
189
+ if len (tagsToDelete ) != 2 || len (remainingTags ) != 4 {
190
+ t .Fatalf ("expected 2 tag to delete and 4 remaining, got %d to delete and %d remaining" , len (tagsToDelete ), len (remainingTags ))
185
191
}
186
192
187
193
if _ , ok := tagsToDelete ["nightly-build" ]; ! ok {
188
194
t .Error ("expected nightly-build to be deleted" )
189
195
}
190
196
191
- if _ , ok := remainingTags [ "v1.1.0 " ]; ! ok {
192
- t .Error ("expected v1.1.0 to be kept " )
197
+ if _ , ok := tagsToDelete [ "release-not-semver " ]; ! ok {
198
+ t .Error ("expected nightly-build to be deleted " )
193
199
}
194
200
195
201
if _ , ok := remainingTags ["latest" ]; ! ok {
196
202
t .Error ("expected latest to be kept" )
197
203
}
198
204
199
- if _ , ok := remainingTags ["release-v1.2.3 " ]; ! ok {
200
- t .Error ("expected release-v1.2.3 to be kept" )
205
+ if _ , ok := remainingTags ["release-v1.0.0 " ]; ! ok {
206
+ t .Error ("expected release-v1.0.0 to be kept" )
201
207
}
202
208
203
209
if _ , ok := remainingTags ["v1.0.0" ]; ! ok {
204
210
t .Error ("expected v1.0.0 to be kept" )
205
211
}
206
212
207
- if _ , ok := remainingTags ["v1.2.0-rc1" ]; ! ok {
208
- t .Error ("expected v1.2.0-rc1 to be kept" )
209
- }
210
-
211
- if _ , ok := remainingTags ["expiry_set" ]; ! ok {
212
- t .Error ("expected expiry_set to be kept" )
213
+ if _ , ok := remainingTags ["v1.1.0-rc1" ]; ! ok {
214
+ t .Error ("expected v1.1.0-rc1 to be kept" )
213
215
}
214
216
})
215
217
216
218
t .Run ("test filter tags with no deletions" , func (t * testing.T ) {
217
219
tags := []Tag {
218
- {Name : "v1.1.0" , LastModified : time . Now (). Format ( time . RFC1123 ) }, // Preserved tag, should be kept
219
- {Name : "recent" , LastModified : time . Now (). Format ( time . RFC1123 ) }, // Recent tag, should be kept
220
+ {Name : "v1.1.0" }, // Preserved tag, should be kept
221
+ {Name : "latest" }, // Preserved tag, should be kept
220
222
}
221
223
222
224
tagsToDelete , remainingTags , err := filterTags (tags , preserveSubstrings )
@@ -229,16 +231,4 @@ func Test_filterTags(t *testing.T) {
229
231
t .Fatalf ("expected 0 tags to delete and 2 remaining, got %d to delete and %d remaining" , len (tagsToDelete ), len (remainingTags ))
230
232
}
231
233
})
232
-
233
- t .Run ("test error unexpected time format" , func (t * testing.T ) {
234
- tags := []Tag {
235
- {Name : "v1.1.0" , LastModified : time .Now ().Format (time .ANSIC )},
236
- }
237
-
238
- _ , _ , err := filterTags (tags , preserveSubstrings )
239
-
240
- if err == nil {
241
- t .Fatal ("expected error, got success" )
242
- }
243
- })
244
234
}
0 commit comments