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
@@ -45,7 +55,7 @@ fn update_crate() {
45
55
String :: from ( "rust-lang/rust" )
46
56
) ;
47
57
48
- let gitlab = Badge :: Gitlab {
58
+ let gitlab = Badge :: GitLab {
49
59
branch : Some ( String :: from ( "beta" ) ) ,
50
60
repository : String :: from ( "rust-lang/rust" ) ,
51
61
} ;
@@ -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] ) ;
150
+
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) ) ;
93
176
94
- // Updating badge attributes
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,70 +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 ( ) ;
109
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ gitlab. clone( ) , travis_ci2. clone( ) ] ) ;
192
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
193
+ let current_badges = krate. badges ( tx ( & req) ) . unwrap ( ) ;
194
+ assert_eq ! ( current_badges. len( ) , 1 ) ;
195
+ assert ! ( current_badges. contains( & travis_ci2) ) ;
196
+ }
110
197
111
- // Removing one badge
112
- badges. clear ( ) ;
113
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
114
- 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 ( ) ;
115
204
116
205
// Adding 3 badges
117
206
badges. insert (
118
207
String :: from ( "appveyor" ) ,
119
- badge_attributes_appveyor . clone ( )
208
+ test_badges . appveyor_attributes
120
209
) ;
121
210
badges. insert (
122
211
String :: from ( "travis-ci" ) ,
123
- badge_attributes_travis_ci . clone ( )
212
+ test_badges . travis_ci_attributes
124
213
) ;
125
214
badges. insert (
126
215
String :: from ( "gitlab" ) ,
127
- badge_attributes_gitlab . clone ( )
216
+ test_badges . gitlab_attributes
128
217
) ;
129
- Badge :: update_crate (
130
- tx ( & req) , & krate, badges. clone ( )
131
- ) . unwrap ( ) ;
218
+ Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
132
219
133
220
let current_badges = krate. badges ( tx ( & req) ) . unwrap ( ) ;
134
221
assert_eq ! ( current_badges. len( ) , 3 ) ;
135
- assert ! ( current_badges. contains( & appveyor) ) ;
136
- assert ! ( current_badges. contains( & travis_ci) ) ;
137
- 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) ) ;
138
225
139
226
// Removing all badges
140
227
badges. clear ( ) ;
141
- Badge :: update_crate ( tx ( & req) , & krate, badges. clone ( ) ) . unwrap ( ) ;
228
+ Badge :: update_crate ( tx ( & req) , & krate, badges) . unwrap ( ) ;
142
229
assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
230
+ }
143
231
144
- // Attempting to add one valid badge (appveyor) and three invalid badges
145
- // (travis-ci and gitlab without a required attribute and an unknown badge
146
- // type)
232
+ #[ test]
233
+ fn appveyor_extra_keys ( ) {
234
+ // Add a badge with extra invalid keys
235
+ let ( req, krate, test_badges) = set_up ( ) ;
147
236
148
- // Extra invalid keys are fine, we'll just ignore those
149
- 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 (
150
242
String :: from ( "extra" ) ,
151
243
String :: from ( "info" )
152
244
) ;
153
245
badges. insert (
154
246
String :: from ( "appveyor" ) ,
155
- badge_attributes_appveyor . clone ( )
247
+ test_badges . appveyor_attributes
156
248
) ;
157
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
+
158
261
// Repository is a required key
159
- badge_attributes_travis_ci . remove ( "repository" ) ;
262
+ test_badges . travis_ci_attributes . remove ( "repository" ) ;
160
263
badges. insert (
161
264
String :: from ( "travis-ci" ) ,
162
- badge_attributes_travis_ci . clone ( )
265
+ test_badges . travis_ci_attributes
163
266
) ;
164
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
+
165
281
// Repository is a required key
166
- badge_attributes_gitlab . remove ( "repository" ) ;
282
+ test_badges . gitlab_attributes . remove ( "repository" ) ;
167
283
badges. insert (
168
284
String :: from ( "gitlab" ) ,
169
- badge_attributes_gitlab . clone ( )
285
+ test_badges . gitlab_attributes
170
286
) ;
171
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
+
172
301
// This is not a badge that crates.io knows about
173
302
let mut invalid_attributes = HashMap :: new ( ) ;
174
303
invalid_attributes. insert (
@@ -177,15 +306,11 @@ fn update_crate() {
177
306
) ;
178
307
badges. insert (
179
308
String :: from ( "not-a-badge" ) ,
180
- invalid_attributes. clone ( )
309
+ invalid_attributes
181
310
) ;
182
311
183
- let invalid_badges = Badge :: update_crate (
184
- tx ( & req) , & krate, badges. clone ( )
185
- ) . unwrap ( ) ;
186
- assert_eq ! ( invalid_badges. len( ) , 3 ) ;
187
- assert ! ( invalid_badges. contains( & String :: from( "travis-ci" ) ) ) ;
188
- 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 ) ;
189
314
assert ! ( invalid_badges. contains( & String :: from( "not-a-badge" ) ) ) ;
190
- assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ appveyor . clone ( ) ] ) ;
315
+ assert_eq ! ( krate. badges( tx( & req) ) . unwrap( ) , vec![ ] ) ;
191
316
}
0 commit comments