@@ -63,6 +63,7 @@ pub struct Release {
63
63
pub version : String ,
64
64
pub build_status : bool ,
65
65
pub yanked : bool ,
66
+ pub is_library : bool ,
66
67
}
67
68
68
69
impl CrateDetails {
@@ -243,23 +244,29 @@ impl CrateDetails {
243
244
fn map_to_release ( conn : & Connection , crate_id : i32 , version : String ) -> Release {
244
245
let rows = conn
245
246
. query (
246
- "SELECT build_status, yanked
247
+ "SELECT build_status,
248
+ yanked,
249
+ is_library
247
250
FROM releases
248
251
WHERE releases.crate_id = $1 and releases.version = $2;" ,
249
252
& [ & crate_id, & version] ,
250
253
)
251
254
. unwrap ( ) ;
252
255
253
- let ( build_status, yanked) = if !rows. is_empty ( ) {
254
- ( rows. get ( 0 ) . get ( 0 ) , rows. get ( 0 ) . get ( 1 ) )
255
- } else {
256
- Default :: default ( )
257
- } ;
256
+ let ( build_status, yanked, is_library) =
257
+ rows. iter ( ) . next ( ) . map_or_else ( Default :: default, |row| {
258
+ (
259
+ row. get ( "build_status" ) ,
260
+ row. get ( "yanked" ) ,
261
+ row. get ( "is_library" ) ,
262
+ )
263
+ } ) ;
258
264
259
265
Release {
260
266
version,
261
267
build_status,
262
268
yanked,
269
+ is_library,
263
270
}
264
271
}
265
272
@@ -308,8 +315,9 @@ pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
308
315
#[ cfg( test) ]
309
316
mod tests {
310
317
use super :: * ;
311
- use crate :: test:: TestDatabase ;
318
+ use crate :: test:: { wrapper , TestDatabase } ;
312
319
use failure:: Error ;
320
+ use kuchiki:: traits:: TendrilSink ;
313
321
314
322
fn assert_last_successful_build_equals (
315
323
db : & TestDatabase ,
@@ -329,7 +337,7 @@ mod tests {
329
337
330
338
#[ test]
331
339
fn test_last_successful_build_when_last_releases_failed_or_yanked ( ) {
332
- crate :: test :: wrapper ( |env| {
340
+ wrapper ( |env| {
333
341
let db = env. db ( ) ;
334
342
335
343
db. fake_release ( ) . name ( "foo" ) . version ( "0.0.1" ) . create ( ) ?;
@@ -362,7 +370,7 @@ mod tests {
362
370
363
371
#[ test]
364
372
fn test_last_successful_build_when_all_releases_failed_or_yanked ( ) {
365
- crate :: test :: wrapper ( |env| {
373
+ wrapper ( |env| {
366
374
let db = env. db ( ) ;
367
375
368
376
db. fake_release ( )
@@ -390,7 +398,7 @@ mod tests {
390
398
391
399
#[ test]
392
400
fn test_last_successful_build_with_intermittent_releases_failed_or_yanked ( ) {
393
- crate :: test :: wrapper ( |env| {
401
+ wrapper ( |env| {
394
402
let db = env. db ( ) ;
395
403
396
404
db. fake_release ( ) . name ( "foo" ) . version ( "0.0.1" ) . create ( ) ?;
@@ -416,7 +424,7 @@ mod tests {
416
424
417
425
#[ test]
418
426
fn test_releases_should_be_sorted ( ) {
419
- crate :: test :: wrapper ( |env| {
427
+ wrapper ( |env| {
420
428
let db = env. db ( ) ;
421
429
422
430
// Add new releases of 'foo' out-of-order since CrateDetails should sort them descending
@@ -438,6 +446,12 @@ mod tests {
438
446
. name ( "foo" )
439
447
. version ( "0.2.0-alpha" )
440
448
. create ( ) ?;
449
+ db. fake_release ( )
450
+ . name ( "foo" )
451
+ . version ( "0.0.1" )
452
+ . build_result_successful ( false )
453
+ . binary ( true )
454
+ . create ( ) ?;
441
455
442
456
let details = CrateDetails :: new ( & db. conn ( ) , "foo" , "0.2.0" ) . unwrap ( ) ;
443
457
assert_eq ! (
@@ -446,37 +460,50 @@ mod tests {
446
460
Release {
447
461
version: "1.0.0" . to_string( ) ,
448
462
build_status: true ,
449
- yanked: false
463
+ yanked: false ,
464
+ is_library: true ,
450
465
} ,
451
466
Release {
452
467
version: "0.12.0" . to_string( ) ,
453
468
build_status: true ,
454
- yanked: false
469
+ yanked: false ,
470
+ is_library: true ,
455
471
} ,
456
472
Release {
457
473
version: "0.3.0" . to_string( ) ,
458
474
build_status: false ,
459
- yanked: false
475
+ yanked: false ,
476
+ is_library: true ,
460
477
} ,
461
478
Release {
462
479
version: "0.2.0" . to_string( ) ,
463
480
build_status: true ,
464
- yanked: true
481
+ yanked: true ,
482
+ is_library: true ,
465
483
} ,
466
484
Release {
467
485
version: "0.2.0-alpha" . to_string( ) ,
468
486
build_status: true ,
469
- yanked: false
487
+ yanked: false ,
488
+ is_library: true ,
470
489
} ,
471
490
Release {
472
491
version: "0.1.1" . to_string( ) ,
473
492
build_status: true ,
474
- yanked: false
493
+ yanked: false ,
494
+ is_library: true ,
475
495
} ,
476
496
Release {
477
497
version: "0.1.0" . to_string( ) ,
478
498
build_status: true ,
479
- yanked: false
499
+ yanked: false ,
500
+ is_library: true ,
501
+ } ,
502
+ Release {
503
+ version: "0.0.1" . to_string( ) ,
504
+ build_status: false ,
505
+ yanked: false ,
506
+ is_library: false ,
480
507
} ,
481
508
]
482
509
) ;
@@ -487,7 +514,7 @@ mod tests {
487
514
488
515
#[ test]
489
516
fn test_latest_version ( ) {
490
- crate :: test :: wrapper ( |env| {
517
+ wrapper ( |env| {
491
518
let db = env. db ( ) ;
492
519
493
520
db. fake_release ( ) . name ( "foo" ) . version ( "0.0.1" ) . create ( ) ?;
@@ -505,7 +532,7 @@ mod tests {
505
532
506
533
#[ test]
507
534
fn test_latest_version_ignores_yanked ( ) {
508
- crate :: test :: wrapper ( |env| {
535
+ wrapper ( |env| {
509
536
let db = env. db ( ) ;
510
537
511
538
db. fake_release ( ) . name ( "foo" ) . version ( "0.0.1" ) . create ( ) ?;
@@ -527,7 +554,7 @@ mod tests {
527
554
528
555
#[ test]
529
556
fn test_latest_version_only_yanked ( ) {
530
- crate :: test :: wrapper ( |env| {
557
+ wrapper ( |env| {
531
558
let db = env. db ( ) ;
532
559
533
560
db. fake_release ( )
@@ -554,4 +581,35 @@ mod tests {
554
581
Ok ( ( ) )
555
582
} )
556
583
}
584
+
585
+ #[ test]
586
+ fn releases_dropdowns_is_correct ( ) {
587
+ wrapper ( |env| {
588
+ let db = env. db ( ) ;
589
+
590
+ db. fake_release ( )
591
+ . name ( "binary" )
592
+ . version ( "0.1.0" )
593
+ . binary ( true )
594
+ . create ( ) ?;
595
+
596
+ let page = kuchiki:: parse_html ( )
597
+ . one ( env. frontend ( ) . get ( "/crate/binary/0.1.0" ) . send ( ) ?. text ( ) ?) ;
598
+ let warning = page. select_first ( "a.pure-menu-link.warn" ) . unwrap ( ) ;
599
+
600
+ assert_eq ! (
601
+ warning
602
+ . as_node( )
603
+ . as_element( )
604
+ . unwrap( )
605
+ . attributes
606
+ . borrow( )
607
+ . get( "title" )
608
+ . unwrap( ) ,
609
+ "binary-0.1.0 is not a library"
610
+ ) ;
611
+
612
+ Ok ( ( ) )
613
+ } ) ;
614
+ }
557
615
}
0 commit comments