@@ -12,35 +12,48 @@ use axum::{
12
12
} ;
13
13
14
14
pub ( crate ) async fn status_handler (
15
- Path ( ( name, req_version) ) : Path < ( String , String ) > ,
16
- Extension ( pool) : Extension < Pool > ,
17
- ) -> AxumResult < impl IntoResponse > {
18
- let ( _, id) = match_version_axum ( & pool, & name, Some ( & req_version) )
19
- . await ?
20
- . exact_name_only ( ) ?
21
- . exact_version_only ( ) ?;
22
-
23
- let rustdoc_status: bool = spawn_blocking ( {
24
- move || {
25
- Ok ( pool
26
- . get ( ) ?
27
- . query_one (
28
- "SELECT releases.rustdoc_status
29
- FROM releases
30
- WHERE releases.id = $1
31
- " ,
32
- & [ & id] ,
33
- ) ?
34
- . get ( "rustdoc_status" ) )
35
- }
36
- } )
37
- . await ?;
38
-
39
- Ok ( (
15
+ path : Path < ( String , String ) > ,
16
+ pool : Extension < Pool > ,
17
+ ) -> impl IntoResponse {
18
+ async fn inner (
19
+ Path ( ( name, req_version) ) : Path < ( String , String ) > ,
20
+ Extension ( pool) : Extension < Pool > ,
21
+ ) -> AxumResult < impl IntoResponse > {
22
+ let ( version, id) = match_version_axum ( & pool, & name, Some ( & req_version) )
23
+ . await ?
24
+ . exact_name_only ( ) ?
25
+ . into_parts ( ) ;
26
+
27
+ let rustdoc_status: bool = spawn_blocking ( {
28
+ move || {
29
+ Ok ( pool
30
+ . get ( ) ?
31
+ . query_one (
32
+ "SELECT releases.rustdoc_status
33
+ FROM releases
34
+ WHERE releases.id = $1
35
+ " ,
36
+ & [ & id] ,
37
+ ) ?
38
+ . get ( "rustdoc_status" ) )
39
+ }
40
+ } )
41
+ . await ?;
42
+
43
+ Ok ( (
44
+ Extension ( CachePolicy :: NoStoreMustRevalidate ) ,
45
+ [ ( ACCESS_CONTROL_ALLOW_ORIGIN , "*" ) ] ,
46
+ Json ( serde_json:: json!( {
47
+ "version" : version,
48
+ "doc_status" : rustdoc_status,
49
+ } ) ) ,
50
+ ) )
51
+ }
52
+ (
40
53
Extension ( CachePolicy :: NoStoreMustRevalidate ) ,
41
54
[ ( ACCESS_CONTROL_ALLOW_ORIGIN , "*" ) ] ,
42
- Json ( serde_json :: json! ( { "doc_status" : rustdoc_status } ) ) ,
43
- ) )
55
+ inner ( path , pool ) . await ,
56
+ )
44
57
}
45
58
46
59
#[ cfg( test) ]
@@ -50,93 +63,88 @@ mod tests {
50
63
web:: cache:: CachePolicy ,
51
64
} ;
52
65
use reqwest:: StatusCode ;
66
+ use test_case:: test_case;
53
67
54
- #[ test]
55
- fn success ( ) {
68
+ #[ test_case( "latest" ) ]
69
+ #[ test_case( "0.1" ) ]
70
+ #[ test_case( "0.1.0" ) ]
71
+ fn status ( version : & str ) {
56
72
wrapper ( |env| {
57
73
env. fake_release ( ) . name ( "foo" ) . version ( "0.1.0" ) . create ( ) ?;
58
74
59
- let response = env. frontend ( ) . get ( "/crate/foo/0.1.0/status.json" ) . send ( ) ?;
75
+ let response = env
76
+ . frontend ( )
77
+ . get ( & format ! ( "/crate/foo/{version}/status.json" ) )
78
+ . send ( ) ?;
60
79
assert_cache_control ( & response, CachePolicy :: NoStoreMustRevalidate , & env. config ( ) ) ;
61
80
assert_eq ! ( response. headers( ) [ "access-control-allow-origin" ] , "*" ) ;
81
+ assert_eq ! ( response. status( ) , StatusCode :: OK ) ;
62
82
let value: serde_json:: Value = serde_json:: from_str ( & response. text ( ) ?) ?;
63
83
64
- assert_eq ! ( value, serde_json:: json!( { "doc_status" : true } ) ) ;
84
+ assert_eq ! (
85
+ value,
86
+ serde_json:: json!( {
87
+ "version" : "0.1.0" ,
88
+ "doc_status" : true ,
89
+ } )
90
+ ) ;
65
91
66
92
Ok ( ( ) )
67
93
} ) ;
68
94
}
69
95
70
- #[ test]
71
- fn failure ( ) {
96
+ #[ test_case( "latest" ) ]
97
+ #[ test_case( "0.1" ) ]
98
+ #[ test_case( "0.1.0" ) ]
99
+ fn failure ( version : & str ) {
72
100
wrapper ( |env| {
73
101
env. fake_release ( )
74
102
. name ( "foo" )
75
103
. version ( "0.1.0" )
76
104
. build_result_failed ( )
77
105
. create ( ) ?;
78
106
79
- let response = env. frontend ( ) . get ( "/crate/foo/0.1.0/status.json" ) . send ( ) ?;
107
+ let response = env
108
+ . frontend ( )
109
+ . get ( & format ! ( "/crate/foo/{version}/status.json" ) )
110
+ . send ( ) ?;
80
111
assert_cache_control ( & response, CachePolicy :: NoStoreMustRevalidate , & env. config ( ) ) ;
81
112
assert_eq ! ( response. headers( ) [ "access-control-allow-origin" ] , "*" ) ;
113
+ assert_eq ! ( response. status( ) , StatusCode :: OK ) ;
82
114
let value: serde_json:: Value = serde_json:: from_str ( & response. text ( ) ?) ?;
83
115
84
- assert_eq ! ( value, serde_json:: json!( { "doc_status" : false } ) ) ;
85
-
86
- Ok ( ( ) )
87
- } ) ;
88
- }
89
-
90
- #[ test]
91
- fn crate_version_not_found ( ) {
92
- wrapper ( |env| {
93
- env. fake_release ( ) . name ( "foo" ) . version ( "0.1.0" ) . create ( ) ?;
94
-
95
- let response = env. frontend ( ) . get ( "/crate/foo/0.2.0/status.json" ) . send ( ) ?;
96
- assert ! ( response
97
- . url( )
98
- . as_str( )
99
- . ends_with( "/crate/foo/0.2.0/status.json" ) ) ;
100
- assert_eq ! ( response. status( ) , StatusCode :: NOT_FOUND ) ;
101
- Ok ( ( ) )
102
- } ) ;
103
- }
104
-
105
- #[ test]
106
- fn invalid_semver ( ) {
107
- wrapper ( |env| {
108
- env. fake_release ( ) . name ( "foo" ) . version ( "0.1.0" ) . create ( ) ?;
116
+ assert_eq ! (
117
+ value,
118
+ serde_json:: json!( {
119
+ "version" : "0.1.0" ,
120
+ "doc_status" : false ,
121
+ } )
122
+ ) ;
109
123
110
- let response = env. frontend ( ) . get ( "/crate/foo/0,1,0/status.json" ) . send ( ) ?;
111
- assert ! ( response
112
- . url( )
113
- . as_str( )
114
- . ends_with( "/crate/foo/0,1,0/status.json" ) ) ;
115
- assert_eq ! ( response. status( ) , StatusCode :: NOT_FOUND ) ;
116
124
Ok ( ( ) )
117
125
} ) ;
118
126
}
119
127
120
- /// We only support asking for the status of exact versions
121
- #[ test]
122
- fn no_semver ( ) {
128
+ // crate not found
129
+ #[ test_case( "bar" , "0.1" ) ]
130
+ #[ test_case( "bar" , "0.1.0" ) ]
131
+ // version not found
132
+ #[ test_case( "foo" , "0.2" ) ]
133
+ #[ test_case( "foo" , "0.2.0" ) ]
134
+ // invalid semver
135
+ #[ test_case( "foo" , "0,1" ) ]
136
+ #[ test_case( "foo" , "0,1,0" ) ]
137
+ fn not_found ( krate : & str , version : & str ) {
123
138
wrapper ( |env| {
124
139
env. fake_release ( ) . name ( "foo" ) . version ( "0.1.0" ) . create ( ) ?;
125
140
126
- let response = env. frontend ( ) . get ( "/crate/foo/latest/status.json" ) . send ( ) ?;
127
- assert ! ( response
128
- . url( )
129
- . as_str( )
130
- . ends_with( "/crate/foo/latest/status.json" ) ) ;
131
- assert_eq ! ( response. status( ) , StatusCode :: NOT_FOUND ) ;
132
-
133
- let response = env. frontend ( ) . get ( "/crate/foo/0.1/status.json" ) . send ( ) ?;
134
- assert ! ( response
135
- . url( )
136
- . as_str( )
137
- . ends_with( "/crate/foo/0.1/status.json" ) ) ;
141
+ let response = env
142
+ . frontend ( )
143
+ . get ( & format ! ( "/crate/{krate}/{version}/status.json" ) )
144
+ . send ( ) ?;
145
+ assert_cache_control ( & response, CachePolicy :: NoStoreMustRevalidate , & env. config ( ) ) ;
146
+ assert_eq ! ( response. headers( ) [ "access-control-allow-origin" ] , "*" ) ;
138
147
assert_eq ! ( response. status( ) , StatusCode :: NOT_FOUND ) ;
139
-
140
148
Ok ( ( ) )
141
149
} ) ;
142
150
}
0 commit comments