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
+ // Add an 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
72
104
) ;
73
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
74
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ appveyor. clone( ) ] ) ;
105
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
106
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. appveyor] ) ;
107
+ }
75
108
76
- // Replacing one badge with another
77
- badges. clear ( ) ;
109
+ #[ test]
110
+ fn update_add_travis_ci ( ) {
111
+ // Add a travis ci badge
112
+ let ( req, krate, test_badges) = set_up ( ) ;
113
+
114
+ let mut badges = HashMap :: new ( ) ;
78
115
badges. insert (
79
116
String :: from ( "travis-ci" ) ,
80
- badge_attributes_travis_ci . clone ( )
117
+ test_badges . travis_ci_attributes
81
118
) ;
82
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
83
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ travis_ci. clone( ) ] ) ;
119
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
120
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. travis_ci] ) ;
121
+ }
84
122
85
- // Replacing one badge with another (again)
86
- badges. clear ( ) ;
123
+ #[ test]
124
+ fn update_add_gitlab ( ) {
125
+ // Add a gitlab badge
126
+ let ( req, krate, test_badges) = set_up ( ) ;
127
+
128
+ let mut badges = HashMap :: new ( ) ;
87
129
badges. insert (
88
130
String :: from ( "gitlab" ) ,
89
- badge_attributes_gitlab. clone ( )
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
+ }
136
+
137
+ #[ test]
138
+ fn replace_badge ( ) {
139
+ // Replacing one badge with another
140
+ let ( req, krate, test_badges) = set_up ( ) ;
141
+
142
+ // Add a badge
143
+ let mut badges = HashMap :: new ( ) ;
144
+ badges. insert (
145
+ String :: from ( "gitlab" ) ,
146
+ test_badges. gitlab_attributes
90
147
) ;
91
148
Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
92
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ gitlab . clone ( ) ] ) ;
149
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges . gitlab ] ) ;
93
150
94
- // Updating badge attributes
151
+ // Replace with another badge
152
+ badges. clear ( ) ;
153
+ badges. insert (
154
+ String :: from ( "travis-ci" ) ,
155
+ test_badges. travis_ci_attributes . clone ( )
156
+ ) ;
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 ( ) ;
165
+
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,115 @@ 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
- assert_eq ! ( current_badges. len( ) , 2 ) ;
111
- assert ! ( current_badges. contains( & gitlab) ) ;
194
+ assert_eq ! ( current_badges. len( ) , 1 ) ;
112
195
assert ! ( current_badges. contains( & travis_ci2) ) ;
196
+ }
113
197
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![ ] ) ;
198
+ #[ test]
199
+ fn clear_badges ( ) {
200
+ // Add 3 badges and then remove them
201
+ let ( req, krate, test_badges) = set_up ( ) ;
202
+
203
+ let mut badges = HashMap :: new ( ) ;
118
204
119
205
// Adding 3 badges
120
206
badges. insert (
121
207
String :: from ( "appveyor" ) ,
122
- badge_attributes_appveyor . clone ( )
208
+ test_badges . appveyor_attributes
123
209
) ;
124
210
badges. insert (
125
211
String :: from ( "travis-ci" ) ,
126
- badge_attributes_travis_ci . clone ( )
212
+ test_badges . travis_ci_attributes
127
213
) ;
128
214
badges. insert (
129
215
String :: from ( "gitlab" ) ,
130
- badge_attributes_gitlab . clone ( )
216
+ test_badges . gitlab_attributes
131
217
) ;
132
- Badge :: update_crate (
133
- tx ( & req) , & krate, badges. clone ( )
134
- ) . unwrap ( ) ;
218
+ Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
135
219
136
220
let current_badges = krate. badges ( tx ( & req) ) . unwrap ( ) ;
137
221
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) ) ;
222
+ assert ! ( current_badges. contains( & test_badges . appveyor) ) ;
223
+ assert ! ( current_badges. contains( & test_badges . travis_ci) ) ;
224
+ assert ! ( current_badges. contains( & test_badges . gitlab) ) ;
141
225
142
226
// Removing all badges
143
227
badges. clear ( ) ;
144
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
228
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
145
229
assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
230
+ }
146
231
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)
232
+ #[ test]
233
+ fn appveyor_extra_keys ( ) {
234
+ // Add a badge with extra invalid keys
235
+ let ( req, krate, test_badges) = set_up ( ) ;
150
236
151
- // Extra invalid keys are fine, we'll just ignore those
152
- badge_attributes_appveyor. insert (
237
+ let mut badges = HashMap :: new ( ) ;
238
+
239
+ // Extra invalid keys are fine, they just get ignored
240
+ let mut appveyor_attributes = test_badges. appveyor_attributes . clone ( ) ;
241
+ appveyor_attributes. insert (
153
242
String :: from ( "extra" ) ,
154
243
String :: from ( "info" )
155
244
) ;
156
245
badges. insert (
157
246
String :: from ( "appveyor" ) ,
158
- badge_attributes_appveyor . clone ( )
247
+ test_badges . appveyor_attributes
159
248
) ;
160
249
250
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
251
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ test_badges. appveyor] ) ;
252
+ }
253
+
254
+ #[ test]
255
+ fn travis_ci_required_keys ( ) {
256
+ // Add a travis ci badge missing a required field
257
+ let ( req, krate, mut test_badges) = set_up ( ) ;
258
+
259
+ let mut badges = HashMap :: new ( ) ;
260
+
161
261
// Repository is a required key
162
- badge_attributes_travis_ci . remove ( "repository" ) ;
262
+ test_badges . travis_ci_attributes . remove ( "repository" ) ;
163
263
badges. insert (
164
264
String :: from ( "travis-ci" ) ,
165
- badge_attributes_travis_ci . clone ( )
265
+ test_badges . travis_ci_attributes
166
266
) ;
167
267
268
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
269
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
270
+ assert ! ( invalid_badges. contains( & String :: from( "travis-ci" ) ) ) ;
271
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
272
+ }
273
+
274
+ #[ test]
275
+ fn gitlab_required_keys ( ) {
276
+ // Add a gitlab badge missing a required field
277
+ let ( req, krate, mut test_badges) = set_up ( ) ;
278
+
279
+ let mut badges = HashMap :: new ( ) ;
280
+
168
281
// Repository is a required key
169
- badge_attributes_gitlab . remove ( "repository" ) ;
282
+ test_badges . gitlab_attributes . remove ( "repository" ) ;
170
283
badges. insert (
171
284
String :: from ( "gitlab" ) ,
172
- badge_attributes_gitlab . clone ( )
285
+ test_badges . gitlab_attributes
173
286
) ;
174
287
288
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
289
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
290
+ assert ! ( invalid_badges. contains( & String :: from( "gitlab" ) ) ) ;
291
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
292
+ }
293
+
294
+ #[ test]
295
+ fn unknown_badge ( ) {
296
+ // Add an unknown badge
297
+ let ( req, krate, _) = set_up ( ) ;
298
+
299
+ let mut badges = HashMap :: new ( ) ;
300
+
175
301
// This is not a badge that crates.io knows about
176
302
let mut invalid_attributes = HashMap :: new ( ) ;
177
303
invalid_attributes. insert (
@@ -180,15 +306,11 @@ fn update_crate() {
180
306
) ;
181
307
badges. insert (
182
308
String :: from ( "not-a-badge" ) ,
183
- invalid_attributes. clone ( )
309
+ invalid_attributes
184
310
) ;
185
311
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" ) ) ) ;
312
+ let invalid_badges = Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
313
+ assert_eq ! ( invalid_badges. len( ) , 1 ) ;
192
314
assert ! ( invalid_badges. contains( & String :: from( "not-a-badge" ) ) ) ;
193
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ appveyor . clone ( ) ] ) ;
315
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
194
316
}
0 commit comments