@@ -137,3 +137,93 @@ async fn raw_query() {
137137 let extracted = req. filter ( & as_raw) . await . unwrap ( ) ;
138138 assert_eq ! ( extracted, "foo=bar&baz=quux" . to_owned( ) ) ;
139139}
140+
141+ #[ tokio:: test]
142+ async fn url_encoded_raw_query ( ) {
143+ let as_raw = warp:: query:: raw ( ) ;
144+
145+ let req = warp:: test:: request ( ) . path ( "/?foo=bar%20hi&baz=quux" ) ;
146+
147+ let extracted = req. filter ( & as_raw) . await . unwrap ( ) ;
148+ assert_eq ! ( extracted, "foo=bar%20hi&baz=quux" . to_owned( ) ) ;
149+ }
150+
151+ #[ tokio:: test]
152+ async fn plus_encoded_raw_query ( ) {
153+ let as_raw = warp:: query:: raw ( ) ;
154+
155+ let req = warp:: test:: request ( ) . path ( "/?foo=bar+hi&baz=quux" ) ;
156+
157+ let extracted = req. filter ( & as_raw) . await . unwrap ( ) ;
158+ assert_eq ! ( extracted, "foo=bar+hi&baz=quux" . to_owned( ) ) ;
159+ }
160+
161+ #[ derive( Deserialize , Debug , Eq , PartialEq ) ]
162+ struct MyArgsWithInt {
163+ string : Option < String > ,
164+ number : Option < u32 > ,
165+ }
166+
167+ #[ tokio:: test]
168+ async fn query_struct_with_int ( ) {
169+ let as_struct = warp:: query :: < MyArgsWithInt > ( ) ;
170+
171+ let req = warp:: test:: request ( ) . path ( "/?string=text&number=30" ) ;
172+
173+ let extracted = req. filter ( & as_struct) . await . unwrap ( ) ;
174+ assert_eq ! (
175+ extracted,
176+ MyArgsWithInt {
177+ string: Some ( "text" . into( ) ) ,
178+ number: Some ( 30 )
179+ }
180+ ) ;
181+ }
182+
183+ #[ tokio:: test]
184+ async fn missing_query_struct_with_int ( ) {
185+ let as_struct = warp:: query :: < MyArgsWithInt > ( ) ;
186+
187+ let req = warp:: test:: request ( ) . path ( "/" ) ;
188+
189+ let extracted = req. filter ( & as_struct) . await . unwrap ( ) ;
190+ assert_eq ! (
191+ extracted,
192+ MyArgsWithInt {
193+ string: None ,
194+ number: None
195+ }
196+ ) ;
197+ }
198+
199+ #[ tokio:: test]
200+ async fn url_encoded_query_struct_with_int ( ) {
201+ let as_struct = warp:: query :: < MyArgsWithInt > ( ) ;
202+
203+ let req = warp:: test:: request ( ) . path ( "/?string=test%20text&number=%33%30" ) ;
204+
205+ let extracted = req. filter ( & as_struct) . await . unwrap ( ) ;
206+ assert_eq ! (
207+ extracted,
208+ MyArgsWithInt {
209+ string: Some ( "test text" . into( ) ) ,
210+ number: Some ( 30 )
211+ }
212+ ) ;
213+ }
214+
215+ #[ tokio:: test]
216+ async fn plus_encoded_query_struct ( ) {
217+ let as_struct = warp:: query :: < MyArgsWithInt > ( ) ;
218+
219+ let req = warp:: test:: request ( ) . path ( "/?string=test+text" ) ;
220+
221+ let extracted = req. filter ( & as_struct) . await . unwrap ( ) ;
222+ assert_eq ! (
223+ extracted,
224+ MyArgsWithInt {
225+ string: Some ( "test text" . into( ) ) ,
226+ number: None
227+ }
228+ ) ;
229+ }
0 commit comments