@@ -3,7 +3,7 @@ use pretty_assertions::assert_eq;
33use serde:: Deserialize ;
44
55use crate :: {
6- client:: options:: { ClientOptions , StreamAddress } ,
6+ client:: options:: { ClientOptions , ClientOptionsParser , StreamAddress } ,
77 error:: ErrorKind ,
88 selection_criteria:: { ReadPreference , SelectionCriteria } ,
99 test:: run_spec_test,
@@ -332,3 +332,37 @@ async fn run_uri_options_spec_tests() {
332332async fn run_connection_string_spec_tests ( ) {
333333 run_spec_test ( & [ "connection-string" ] , run_test) . await ;
334334}
335+
336+ async fn parse_uri ( option : & str , suggestion : Option < & str > ) {
337+ match ClientOptionsParser :: parse ( & format ! ( "mongodb://host:27017/?{}=test" , option) )
338+ . as_ref ( )
339+ . map_err ( |e| e. as_ref ( ) )
340+ {
341+ Ok ( _) => panic ! ( "expected error for option {}" , option) ,
342+ Err ( ErrorKind :: ArgumentError { message, .. } ) => {
343+ match suggestion {
344+ Some ( s) => assert ! ( message. contains( s) ) ,
345+ None => assert ! ( !message. contains( "similar" ) ) ,
346+ } ;
347+ }
348+ Err ( e) => panic ! ( "expected ArgumentError, but got {:?}" , e) ,
349+ }
350+ }
351+
352+ #[ cfg_attr( feature = "tokio-runtime" , tokio:: test) ]
353+ #[ cfg_attr( feature = "async-std-runtime" , async_std:: test) ]
354+ async fn parse_unknown_options ( ) {
355+ parse_uri ( "invalidoption" , None ) . await ;
356+ parse_uri ( "x" , None ) . await ;
357+ parse_uri ( "max" , None ) . await ;
358+ parse_uri ( "tlstimeout" , None ) . await ;
359+ parse_uri ( "waitqueuetimeout" , Some ( "waitqueuetimeoutms" ) ) . await ;
360+ parse_uri ( "retry_reads" , Some ( "retryreads" ) ) . await ;
361+ parse_uri ( "poolsize" , Some ( "maxpoolsize" ) ) . await ;
362+ parse_uri (
363+ "tlspermitinvalidcertificates" ,
364+ Some ( "tlsallowinvalidcertificates" ) ,
365+ )
366+ . await ;
367+ parse_uri ( "maxstalenessms" , Some ( "maxstalenessseconds" ) ) . await ;
368+ }
0 commit comments