@@ -82,16 +82,35 @@ impl<'a> JsonRpcNotificationSer<'a> {
8282#[ cfg( test) ]
8383mod test {
8484 use super :: {
85- Id , JsonRpcCallSer , JsonRpcInvalidRequest , JsonRpcNotification , JsonRpcNotificationSer , JsonRpcRequest ,
86- TwoPointZero ,
85+ Id , JsonRpcCallSer , JsonRpcInvalidRequest , JsonRpcNotification , JsonRpcNotificationSer , JsonRpcParams ,
86+ JsonRpcRequest , TwoPointZero ,
8787 } ;
88+ use serde_json:: { value:: RawValue , Value } ;
8889
90+ fn assert_request < ' a > ( request : JsonRpcRequest < ' a > , id : Id < ' a > , method : & str , params : Option < & str > ) {
91+ assert_eq ! ( request. jsonrpc, TwoPointZero ) ;
92+ assert_eq ! ( request. id, id) ;
93+ assert_eq ! ( request. method, method) ;
94+ assert_eq ! ( request. params. map( RawValue :: get) , params) ;
95+ }
96+
97+ /// Checks that we can deserialize the object with or without non-mandatory fields.
8998 #[ test]
90- fn deserialize_valid_call_works ( ) {
91- let ser = r#"{"jsonrpc":"2.0","method":"say_hello","params":[1,"bar"],"id":1}"# ;
92- let dsr: JsonRpcRequest = serde_json:: from_str ( ser) . unwrap ( ) ;
93- assert_eq ! ( dsr. method, "say_hello" ) ;
94- assert_eq ! ( dsr. jsonrpc, TwoPointZero ) ;
99+ fn deserialize_request ( ) {
100+ let method = "subtract" ;
101+ let params = "[42, 23]" ;
102+
103+ let test_vector = vec ! [
104+ // With all fields set.
105+ ( r#"{"jsonrpc":"2.0", "method":"subtract", "params":[42, 23], "id":1}"# , Id :: Number ( 1 ) , Some ( params) ) ,
106+ // Without params field
107+ ( r#"{"jsonrpc":"2.0", "method":"subtract", "id":null}"# , Id :: Null , None ) ,
108+ ] ;
109+
110+ for ( ser, id, params) in test_vector. into_iter ( ) {
111+ let request = serde_json:: from_str ( ser) . unwrap ( ) ;
112+ assert_request ( request, id, method, params) ;
113+ }
95114 }
96115
97116 #[ test]
@@ -102,14 +121,6 @@ mod test {
102121 assert_eq ! ( dsr. jsonrpc, TwoPointZero ) ;
103122 }
104123
105- #[ test]
106- fn deserialize_valid_call_without_params_works ( ) {
107- let ser = r#"{"jsonrpc":"2.0","method":"say_hello", "id":1}"# ;
108- let dsr: JsonRpcRequest = serde_json:: from_str ( ser) . unwrap ( ) ;
109- assert_eq ! ( dsr. method, "say_hello" ) ;
110- assert_eq ! ( dsr. jsonrpc, TwoPointZero ) ;
111- }
112-
113124 // TODO(niklasad1): merge the types `JsonRpcParams` and `RpcParams` and remove `RawValue`.
114125 #[ test]
115126 #[ ignore]
@@ -131,12 +142,38 @@ mod test {
131142 assert_eq ! ( deserialized, JsonRpcInvalidRequest { id: Id :: Number ( 120 ) } ) ;
132143 }
133144
145+ /// Checks that we can serialize the object with or without non-mandatory fields.
134146 #[ test]
135147 fn serialize_call ( ) {
136- let exp = r#"{"jsonrpc":"2.0","method":"say_hello","id":"bar","params":[]}"# ;
137- let req = JsonRpcCallSer :: new ( Id :: Str ( "bar" . into ( ) ) , "say_hello" , vec ! [ ] . into ( ) ) ;
138- let ser = serde_json:: to_string ( & req) . unwrap ( ) ;
139- assert_eq ! ( exp, ser) ;
148+ let method = "subtract" ;
149+ let id = Id :: Number ( 1 ) ; // It's enough to check one variant, since the type itself also has tests.
150+ let params: JsonRpcParams = vec ! [ Value :: Number ( 42 . into( ) ) , Value :: Number ( 23 . into( ) ) ] . into ( ) ; // Same as above.
151+ let test_vector = & [
152+ // With all fields set.
153+ (
154+ r#"{"jsonrpc":"2.0","method":"subtract","id":1,"params":[42,23]}"# ,
155+ Some ( id. clone ( ) ) ,
156+ Some ( params. clone ( ) ) ,
157+ ) ,
158+ // Without ID field.
159+ ( r#"{"jsonrpc":"2.0","method":"subtract","id":null,"params":[42,23]}"# , None , Some ( params) ) ,
160+ // Without params field
161+ ( r#"{"jsonrpc":"2.0","method":"subtract","id":1,"params":null}"# , Some ( id) , None ) ,
162+ // Without params and ID.
163+ ( r#"{"jsonrpc":"2.0","method":"subtract","id":null,"params":null}"# , None , None ) ,
164+ ] ;
165+
166+ for ( ser, id, params) in test_vector. iter ( ) . cloned ( ) {
167+ let request = serde_json:: to_string ( & JsonRpcCallSer {
168+ jsonrpc : TwoPointZero ,
169+ method,
170+ id : id. unwrap_or ( Id :: Null ) ,
171+ params : params. unwrap_or ( JsonRpcParams :: NoParams ) ,
172+ } )
173+ . unwrap ( ) ;
174+
175+ assert_eq ! ( & request, ser) ;
176+ }
140177 }
141178
142179 #[ test]
0 commit comments