1
- use async_std:: io:: prelude:: * ;
2
- use futures:: executor:: block_on;
3
1
use futures:: future:: BoxFuture ;
4
- use http_service:: Body ;
5
2
use http_service_mock:: make_server;
3
+ use http_types:: headers:: { HeaderName , HeaderValue } ;
4
+ use http_types:: { Method , Request , Url } ;
5
+ use std:: str:: FromStr ;
6
6
7
- #[ test]
8
- fn nested ( ) {
7
+ #[ async_std :: test]
8
+ async fn nested ( ) {
9
9
let mut inner = tide:: new ( ) ;
10
10
inner. at ( "/foo" ) . get ( |_| async { "foo" } ) ;
11
11
inner. at ( "/bar" ) . get ( |_| async { "bar" } ) ;
@@ -16,31 +16,36 @@ fn nested() {
16
16
17
17
let mut server = make_server ( outer. into_http_service ( ) ) . unwrap ( ) ;
18
18
19
- let mut buf = Vec :: new ( ) ;
20
- let req = http:: Request :: get ( "/foo/foo" ) . body ( Body :: empty ( ) ) . unwrap ( ) ;
19
+ let req = Request :: new (
20
+ Method :: Get ,
21
+ Url :: parse ( "http://example.com/foo/foo" ) . unwrap ( ) ,
22
+ ) ;
21
23
let res = server. simulate ( req) . unwrap ( ) ;
22
24
assert_eq ! ( res. status( ) , 200 ) ;
23
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
24
- assert_eq ! ( & * buf, & * b"foo" ) ;
25
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "foo" ) ;
25
26
26
- buf. clear ( ) ;
27
- let req = http:: Request :: get ( "/foo/bar" ) . body ( Body :: empty ( ) ) . unwrap ( ) ;
27
+ let req = Request :: new (
28
+ Method :: Get ,
29
+ Url :: parse ( "http://example.com/foo/bar" ) . unwrap ( ) ,
30
+ ) ;
28
31
let res = server. simulate ( req) . unwrap ( ) ;
29
32
assert_eq ! ( res. status( ) , 200 ) ;
30
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
31
- assert_eq ! ( & * buf, & * b"bar" ) ;
33
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "bar" ) ;
32
34
}
33
35
34
- #[ test]
35
- fn nested_middleware ( ) {
36
+ #[ async_std :: test]
37
+ async fn nested_middleware ( ) {
36
38
let echo_path = |req : tide:: Request < ( ) > | async move { req. uri ( ) . path ( ) . to_string ( ) } ;
37
39
fn test_middleware (
38
40
req : tide:: Request < ( ) > ,
39
41
next : tide:: Next < ' _ , ( ) > ,
40
42
) -> BoxFuture < ' _ , tide:: Response > {
41
43
Box :: pin ( async move {
42
44
let res = next. run ( req) . await ;
43
- res. set_header ( "X-Tide-Test" , "1" )
45
+ res. set_header (
46
+ HeaderName :: from_ascii ( "X-Tide-Test" . to_owned ( ) . into_bytes ( ) ) . unwrap ( ) ,
47
+ "1" ,
48
+ )
44
49
} )
45
50
}
46
51
@@ -56,41 +61,33 @@ fn nested_middleware() {
56
61
57
62
let mut server = make_server ( app. into_http_service ( ) ) . unwrap ( ) ;
58
63
59
- let mut buf = Vec :: new ( ) ;
60
- let req = http:: Request :: get ( "/foo/echo" ) . body ( Body :: empty ( ) ) . unwrap ( ) ;
61
- let res = server. simulate ( req) . unwrap ( ) ;
62
- assert_eq ! (
63
- res. headers( ) . get( "X-Tide-Test" ) ,
64
- Some ( & "1" . parse( ) . unwrap( ) )
64
+ let req = Request :: new (
65
+ Method :: Get ,
66
+ Url :: parse ( "http://example.com/foo/echo" ) . unwrap ( ) ,
65
67
) ;
68
+ let res = server. simulate ( req) . unwrap ( ) ;
69
+ assert_header ( & res, "X-Tide-Test" , Some ( "1" ) ) ;
66
70
assert_eq ! ( res. status( ) , 200 ) ;
67
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
68
- assert_eq ! ( & * buf, & * b"/echo" ) ;
71
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "/echo" ) ;
69
72
70
- buf. clear ( ) ;
71
- let req = http:: Request :: get ( "/foo/x/bar" )
72
- . body ( Body :: empty ( ) )
73
- . unwrap ( ) ;
74
- let res = server. simulate ( req) . unwrap ( ) ;
75
- assert_eq ! (
76
- res. headers( ) . get( "X-Tide-Test" ) ,
77
- Some ( & "1" . parse( ) . unwrap( ) )
73
+ let req = Request :: new (
74
+ Method :: Get ,
75
+ Url :: parse ( "http://example.com/foo/x/bar" ) . unwrap ( ) ,
78
76
) ;
77
+ let res = server. simulate ( req) . unwrap ( ) ;
78
+ assert_header ( & res, "X-Tide-Test" , Some ( "1" ) ) ;
79
79
assert_eq ! ( res. status( ) , 200 ) ;
80
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
81
- assert_eq ! ( & * buf, & * b"/" ) ;
80
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "/" ) ;
82
81
83
- buf. clear ( ) ;
84
- let req = http:: Request :: get ( "/bar" ) . body ( Body :: empty ( ) ) . unwrap ( ) ;
82
+ let req = Request :: new ( Method :: Get , Url :: parse ( "http://example.com/bar" ) . unwrap ( ) ) ;
85
83
let res = server. simulate ( req) . unwrap ( ) ;
86
- assert_eq ! ( res. headers ( ) . get ( "X-Tide-Test" ) , None ) ;
84
+ assert_header ( & res, "X-Tide-Test" , None ) ;
87
85
assert_eq ! ( res. status( ) , 200 ) ;
88
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
89
- assert_eq ! ( & * buf, & * b"/bar" ) ;
86
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "/bar" ) ;
90
87
}
91
88
92
- #[ test]
93
- fn nested_with_different_state ( ) {
89
+ #[ async_std :: test]
90
+ async fn nested_with_different_state ( ) {
94
91
let mut outer = tide:: new ( ) ;
95
92
let mut inner = tide:: with_state ( 42 ) ;
96
93
inner. at ( "/" ) . get ( |req : tide:: Request < i32 > | async move {
@@ -102,17 +99,37 @@ fn nested_with_different_state() {
102
99
103
100
let mut server = make_server ( outer. into_http_service ( ) ) . unwrap ( ) ;
104
101
105
- let mut buf = Vec :: new ( ) ;
106
- let req = http:: Request :: get ( "/foo" ) . body ( Body :: empty ( ) ) . unwrap ( ) ;
102
+ let req = Request :: new ( Method :: Get , Url :: parse ( "http://example.com/foo" ) . unwrap ( ) ) ;
107
103
let res = server. simulate ( req) . unwrap ( ) ;
108
104
assert_eq ! ( res. status( ) , 200 ) ;
109
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
110
- assert_eq ! ( & * buf, & * b"the number is 42" ) ;
105
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "the number is 42" ) ;
111
106
112
- buf. clear ( ) ;
113
- let req = http:: Request :: get ( "/" ) . body ( Body :: empty ( ) ) . unwrap ( ) ;
107
+ let req = Request :: new ( Method :: Get , Url :: parse ( "http://example.com/" ) . unwrap ( ) ) ;
114
108
let res = server. simulate ( req) . unwrap ( ) ;
115
109
assert_eq ! ( res. status( ) , 200 ) ;
116
- block_on ( res. into_body ( ) . read_to_end ( & mut buf) ) . unwrap ( ) ;
117
- assert_eq ! ( & * buf, & * b"Hello, world!" ) ;
110
+ assert_eq ! ( res. body_string( ) . await . unwrap( ) , "Hello, world!" ) ;
111
+ }
112
+
113
+ // See https://github.com/http-rs/http-types/issues/89 for a proposed fix to this boilerplate.
114
+ fn assert_header ( headers : impl AsRef < http_types:: Headers > , lhs : & str , rhs : Option < & str > ) {
115
+ match rhs {
116
+ Some ( s) => {
117
+ let header = headers
118
+ . as_ref ( )
119
+ . get (
120
+ & http_types:: headers:: HeaderName :: from_ascii ( lhs. to_owned ( ) . into_bytes ( ) )
121
+ . unwrap ( ) ,
122
+ )
123
+ . unwrap ( )
124
+ . iter ( )
125
+ . next ( ) ;
126
+ assert_eq ! ( header, Some ( & HeaderValue :: from_str( s) . unwrap( ) ) ) ;
127
+ }
128
+ None => {
129
+ let header = headers. as_ref ( ) . get (
130
+ & http_types:: headers:: HeaderName :: from_ascii ( lhs. to_owned ( ) . into_bytes ( ) ) . unwrap ( ) ,
131
+ ) ;
132
+ assert_eq ! ( header, None ) ;
133
+ }
134
+ }
118
135
}
0 commit comments