1
1
use conduit:: { Request , Method } ;
2
+ use conduit_test:: MockRequest ;
2
3
use postgres:: GenericConnection ;
3
4
4
- use cargo_registry:: db:: RequestTransaction ;
5
5
use cargo_registry:: badge:: Badge ;
6
+ use cargo_registry:: db:: RequestTransaction ;
7
+ use cargo_registry:: krate:: Crate ;
6
8
7
9
use std:: collections:: HashMap ;
8
10
11
+ struct BadgeRef {
12
+ appveyor : Badge ,
13
+ appveyor_attributes : HashMap < String , String > ,
14
+ travis_ci : Badge ,
15
+ travis_ci_attributes : HashMap < String , String > ,
16
+ gitlab : Badge ,
17
+ gitlab_attributes : HashMap < String , String > ,
18
+ }
19
+
9
20
fn tx ( req : & Request ) -> & GenericConnection { req. tx ( ) . unwrap ( ) }
10
21
11
- #[ test]
12
- fn update_crate ( ) {
22
+ fn set_up ( ) -> ( MockRequest , Crate , BadgeRef ) {
13
23
let ( _b, app, _middle) = :: app ( ) ;
14
24
let mut req = :: req ( app, Method :: Get , "/api/v1/crates/badged_crate" ) ;
15
25
@@ -59,39 +69,113 @@ fn update_crate() {
59
69
String :: from ( "rust-lang/rust" )
60
70
) ;
61
71
62
- let mut badges = HashMap :: new ( ) ;
72
+ let badges = BadgeRef {
73
+ appveyor : appveyor,
74
+ appveyor_attributes : badge_attributes_appveyor,
75
+ travis_ci : travis_ci,
76
+ travis_ci_attributes : badge_attributes_travis_ci,
77
+ gitlab : gitlab,
78
+ gitlab_attributes : badge_attributes_gitlab,
79
+ } ;
80
+ ( req, krate, badges)
81
+ }
82
+
83
+ #[ test]
84
+ fn update_no_badges ( ) {
85
+ // Add no badges
86
+ let ( req, krate, _) = set_up ( ) ;
87
+
88
+ let badges = HashMap :: new ( ) ;
63
89
64
90
// Updating with no badges has no effect
65
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
91
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
66
92
assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
93
+ }
94
+
95
+ #[ test]
96
+ fn update_add_appveyor ( ) {
97
+ // Update attributes for the appveyor badge
98
+ let ( req, krate, test_badges) = set_up ( ) ;
67
99
68
- // Happy path adding one badge
100
+ let mut badges = HashMap :: new ( ) ;
69
101
badges. insert (
70
102
String :: from ( "appveyor" ) ,
71
- badge_attributes_appveyor . clone ( )
103
+ test_badges . appveyor_attributes . clone ( )
72
104
) ;
73
105
Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
74
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ appveyor. clone( ) ] ) ;
106
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. appveyor. clone( ) ] ) ;
107
+ }
108
+
109
+ #[ test]
110
+ fn update_add_travis_ci ( ) {
111
+ // Update attributes for the travis ci badge
112
+ let ( req, krate, test_badges) = set_up ( ) ;
113
+
114
+ let mut badges = HashMap :: new ( ) ;
115
+ badges. insert (
116
+ String :: from ( "travis_ci" ) ,
117
+ test_badges. travis_ci_attributes
118
+ ) ;
119
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
120
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. travis_ci] ) ;
121
+ }
122
+
123
+ #[ test]
124
+ fn update_add_gitlab ( ) {
125
+ // Update attributes for the gitlab badge
126
+ let ( req, krate, test_badges) = set_up ( ) ;
127
+
128
+ let mut badges = HashMap :: new ( ) ;
129
+ badges. insert (
130
+ String :: from ( "gitlab" ) ,
131
+ test_badges. gitlab_attributes
132
+ ) ;
133
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
134
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. gitlab] ) ;
135
+ }
75
136
137
+ #[ test]
138
+ fn replace_badge ( ) {
76
139
// Replacing one badge with another
77
- badges. clear ( ) ;
140
+ let ( req, krate, test_badges) = set_up ( ) ;
141
+
142
+ // Add a badge
143
+ let mut badges = HashMap :: new ( ) ;
78
144
badges. insert (
79
- String :: from ( "travis-ci " ) ,
80
- badge_attributes_travis_ci . clone ( )
145
+ String :: from ( "gitlab " ) ,
146
+ test_badges . gitlab_attributes
81
147
) ;
82
148
Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
83
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ travis_ci . clone ( ) ] ) ;
149
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges . gitlab ] ) ;
84
150
85
- // Replacing one badge with another (again)
151
+ // Replace with another badge
86
152
badges. clear ( ) ;
87
153
badges. insert (
88
- String :: from ( "gitlab " ) ,
89
- badge_attributes_gitlab . clone ( )
154
+ String :: from ( "travis-ci " ) ,
155
+ test_badges . travis_ci_attributes . clone ( )
90
156
) ;
91
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
92
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ gitlab. clone( ) ] ) ;
157
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
158
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. travis_ci] ) ;
159
+ }
160
+
161
+ #[ test]
162
+ fn update_attributes ( ) {
163
+ // Update badge attributes
164
+ let ( req, krate, test_badges) = set_up ( ) ;
93
165
94
- // Updating badge attributes
166
+ // Add a travis-ci badge
167
+ let mut badges = HashMap :: new ( ) ;
168
+ badges. insert (
169
+ String :: from ( "travis-ci" ) ,
170
+ test_badges. travis_ci_attributes
171
+ ) ;
172
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
173
+ let current_badges = krate. badges ( tx ( & req) ) . unwrap ( ) ;
174
+ assert_eq ! ( current_badges. len( ) , 1 ) ;
175
+ assert ! ( current_badges. contains( & test_badges. travis_ci) ) ;
176
+
177
+ // Now update the travis ci badge with different attributes
178
+ let mut badges = HashMap :: new ( ) ;
95
179
let travis_ci2 = Badge :: TravisCi {
96
180
branch : None ,
97
181
repository : String :: from ( "rust-lang/rust" ) ,
@@ -105,73 +189,118 @@ fn update_crate() {
105
189
String :: from ( "travis-ci" ) ,
106
190
badge_attributes_travis_ci2. clone ( )
107
191
) ;
108
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
192
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
109
193
let current_badges = krate. badges ( tx ( & req) ) . unwrap ( ) ;
110
194
assert_eq ! ( current_badges. len( ) , 2 ) ;
111
- assert ! ( current_badges. contains( & gitlab) ) ;
195
+ assert ! ( current_badges. contains( & test_badges . gitlab) ) ;
112
196
assert ! ( current_badges. contains( & travis_ci2) ) ;
197
+ }
113
198
114
- // Removing one badge
115
- badges. clear ( ) ;
116
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
117
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
199
+ #[ test]
200
+ fn clear_badges ( ) {
201
+ // Add 3 badges and then remove them
202
+ let ( req, krate, test_badges) = set_up ( ) ;
203
+
204
+ let mut badges = HashMap :: new ( ) ;
118
205
119
206
// Adding 3 badges
120
207
badges. insert (
121
208
String :: from ( "appveyor" ) ,
122
- badge_attributes_appveyor . clone ( )
209
+ test_badges . appveyor_attributes
123
210
) ;
124
211
badges. insert (
125
212
String :: from ( "travis-ci" ) ,
126
- badge_attributes_travis_ci . clone ( )
213
+ test_badges . travis_ci_attributes
127
214
) ;
128
215
badges. insert (
129
216
String :: from ( "gitlab" ) ,
130
- badge_attributes_gitlab . clone ( )
217
+ test_badges . gitlab_attributes
131
218
) ;
132
- Badge :: update_crate (
133
- tx ( & req) , & krate, badges. clone ( )
134
- ) . unwrap ( ) ;
219
+ Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
135
220
136
221
let current_badges = krate. badges ( tx ( & req) ) . unwrap ( ) ;
137
222
assert_eq ! ( current_badges. len( ) , 3 ) ;
138
- assert ! ( current_badges. contains( & appveyor) ) ;
139
- assert ! ( current_badges. contains( & travis_ci) ) ;
140
- assert ! ( current_badges. contains( & gitlab) ) ;
223
+ assert ! ( current_badges. contains( & test_badges . appveyor) ) ;
224
+ assert ! ( current_badges. contains( & test_badges . travis_ci) ) ;
225
+ assert ! ( current_badges. contains( & test_badges . gitlab) ) ;
141
226
142
227
// Removing all badges
143
228
badges. clear ( ) ;
144
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
229
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
145
230
assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
231
+ }
146
232
147
- // Attempting to add one valid badge (appveyor) and three invalid badges
148
- // (travis-ci and gitlab without a required attribute and an unknown badge
149
- // type)
233
+ #[ test]
234
+ fn appveyor_extra_keys ( ) {
235
+ // Add a badge with extra invalid keys
236
+ let ( req, krate, test_badges) = set_up ( ) ;
237
+
238
+ let mut badges = HashMap :: new ( ) ;
150
239
151
240
// Extra invalid keys are fine, we'll just ignore those
152
- badge_attributes_appveyor. insert (
241
+ let mut appveyor_attributes = test_badges. appveyor_attributes . clone ( ) ;
242
+ appveyor_attributes. insert (
153
243
String :: from ( "extra" ) ,
154
244
String :: from ( "info" )
155
245
) ;
156
246
badges. insert (
157
247
String :: from ( "appveyor" ) ,
158
- badge_attributes_appveyor . clone ( )
248
+ test_badges . appveyor_attributes
159
249
) ;
160
250
251
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
252
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
253
+ assert ! ( invalid_badges. contains( & String :: from( "appveyor" ) ) ) ;
254
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. appveyor] ) ;
255
+ }
256
+
257
+ #[ test]
258
+ fn travis_ci_required_keys ( ) {
259
+ // Add a travis ci badge missing a required field
260
+ let ( req, krate, mut test_badges) = set_up ( ) ;
261
+
262
+ let mut badges = HashMap :: new ( ) ;
263
+
161
264
// Repository is a required key
162
- badge_attributes_travis_ci . remove ( "repository" ) ;
265
+ test_badges . travis_ci_attributes . remove ( "repository" ) ;
163
266
badges. insert (
164
267
String :: from ( "travis-ci" ) ,
165
- badge_attributes_travis_ci . clone ( )
268
+ test_badges . travis_ci_attributes
166
269
) ;
167
270
271
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
272
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
273
+ assert ! ( invalid_badges. contains( & String :: from( "travis-ci" ) ) ) ;
274
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
275
+ }
276
+
277
+ #[ test]
278
+ fn gitlab_required_keys ( ) {
279
+ // Add a gitlab badge missing a required field
280
+ let ( req, krate, mut test_badges) = set_up ( ) ;
281
+
282
+ let mut badges = HashMap :: new ( ) ;
283
+
168
284
// Repository is a required key
169
- badge_attributes_gitlab . remove ( "repository" ) ;
285
+ test_badges . gitlab_attributes . remove ( "repository" ) ;
170
286
badges. insert (
171
287
String :: from ( "gitlab" ) ,
172
- badge_attributes_gitlab . clone ( )
288
+ test_badges . gitlab_attributes
173
289
) ;
174
290
291
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
292
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
293
+ assert ! ( invalid_badges. contains( & String :: from( "gitlab" ) ) ) ;
294
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
295
+ }
296
+
297
+ #[ test]
298
+ fn unknown_badge ( ) {
299
+ // Add an unknown badge
300
+ let ( req, krate, _) = set_up ( ) ;
301
+
302
+ let mut badges = HashMap :: new ( ) ;
303
+
175
304
// This is not a badge that crates.io knows about
176
305
let mut invalid_attributes = HashMap :: new ( ) ;
177
306
invalid_attributes. insert (
@@ -180,15 +309,11 @@ fn update_crate() {
180
309
) ;
181
310
badges. insert (
182
311
String :: from ( "not-a-badge" ) ,
183
- invalid_attributes. clone ( )
312
+ invalid_attributes
184
313
) ;
185
314
186
- let invalid_badges = Badge :: update_crate (
187
- tx ( & req) , & krate, badges. clone ( )
188
- ) . unwrap ( ) ;
189
- assert_eq ! ( invalid_badges. len( ) , 3 ) ;
190
- assert ! ( invalid_badges. contains( & String :: from( "travis-ci" ) ) ) ;
191
- assert ! ( invalid_badges. contains( & String :: from( "gitlab" ) ) ) ;
315
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
316
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
192
317
assert ! ( invalid_badges. contains( & String :: from( "not-a-badge" ) ) ) ;
193
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ appveyor . clone ( ) ] ) ;
318
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
194
319
}
0 commit comments