@@ -17,107 +17,125 @@ import Control.Applicative
17
17
import Control.Monad.Trans
18
18
import Control.Monad.State
19
19
import Control.Monad.Identity
20
- import Test.HUnit hiding (State )
20
+ import Test.HUnit hiding (State , Test )
21
21
import Test.Framework
22
22
import Test.Framework.Providers.HUnit
23
23
import Prelude hiding (subtract )
24
24
25
25
main :: IO ()
26
- main = defaultMain [ testCase " encode RPC error" $
27
- fromByteString (encode $ rpcError (- 1 ) " error" ) @?= Just (TestRpcError (- 1 ) " error" Nothing )
26
+ main = defaultMain $ errorHandlingTests ++ otherTests
28
27
29
- , let err = rpcErrorWithData 1 " my message" errData
30
- testError = TestRpcError 1 " my message" $ Just $ toJSON errData
31
- errData = (' \x03BB ' , [True ], () )
32
- in testCase " encode error with data" $ fromByteString (encode err) @?= Just testError
28
+ errorHandlingTests :: [Test ]
29
+ errorHandlingTests = [ testCase " invalid JSON" $
30
+ assertSubtractResponse (" 5" :: String ) (errResponse idNull (- 32700 ))
33
31
34
- , testCase " invalid JSON" $
35
- assertSubtractResponse (" 5 " :: String ) (errResponse idNull (- 32700 ))
32
+ , testCase " invalid JSON RPC " $
33
+ assertSubtractResponse (object [ " id " .= ( 10 :: Int )]) (errResponse idNull (- 32600 ))
36
34
37
- , testCase " invalid JSON RPC " $
38
- assertSubtractResponse (object [ " id " .= ( 10 :: Int )]) (errResponse idNull (- 32600 ))
35
+ , testCase " empty batch call " $
36
+ assertSubtractResponse emptyArray (errResponse idNull (- 32600 ))
39
37
40
- , testCase " empty batch call " $
41
- assertSubtractResponse emptyArray ( errResponse idNull (- 32600 ))
38
+ , testCase " invalid batch element " $
39
+ map removeErrMsg <$> callSubtractMethods [ True ] @?= Just [ errResponse idNull (- 32600 )]
42
40
43
- , testCase " invalid batch element" $
44
- map removeErrMsg <$> callSubtractMethods [True ] @?= Just [errResponse idNull (- 32600 )]
41
+ , testCase " wrong request version" testWrongVersion
45
42
46
- , testCase " wrong version in request " testWrongVersion
43
+ , testCase " wrong id type " testWrongIdType
47
44
48
- , let req = TestRequest " add" (Just defaultArgs) (Just nonNullId )
49
- rsp = errResponse nonNullId (- 32601 )
50
- in testCase " method not found" $ assertSubtractResponse req rsp
45
+ , let req = TestRequest " add" (Just defaultArgs) (Just defaultIdNonNull )
46
+ rsp = errResponse defaultIdNonNull (- 32601 )
47
+ in testCase " method not found" $ assertSubtractResponse req rsp
51
48
52
- , let req = TestRequest " Subtract" (Just defaultArgs) (Just nonNullId )
53
- rsp = errResponse nonNullId (- 32601 )
54
- in testCase " wrong method name capitalization" $ assertSubtractResponse req rsp
49
+ , let req = TestRequest " Subtract" (Just defaultArgs) (Just defaultIdNonNull )
50
+ rsp = errResponse defaultIdNonNull (- 32601 )
51
+ in testCase " wrong method name capitalization" $ assertSubtractResponse req rsp
55
52
56
- , let req = subtractRequestNamed [(" X" , Number 1 ), (" y" , Number 20 )] nonNullId
57
- rsp = errResponse nonNullId (- 32602 )
58
- in testCase " missing required named argument" $ assertSubtractResponse req rsp
53
+ , testCase " missing required named argument" $
54
+ assertInvalidParams " subtract" $ object [" a" .= Number 1 , " y" .= Number 20 ]
59
55
60
- , let req = TestRequest " subtract 2" (Just [Number 0 ]) (Just nonNullId)
61
- rsp = errResponse nonNullId (- 32602 )
62
- in testCase " missing required unnamed argument" $ assertSubtractResponse req rsp
56
+ , testCase " missing required unnamed argument" $
57
+ assertInvalidParams " subtract 2" [Number 0 ]
63
58
64
- , let req = subtractRequestNamed [(" x" , Number 1 ), (" y" , String " 2" )] nonNullId
65
- rsp = errResponse nonNullId (- 32602 )
66
- in testCase " wrong argument type" $ assertSubtractResponse req rsp
59
+ , testCase " wrong argument type" $
60
+ assertInvalidParams " subtract" $ object [(" x" , Number 1 ), (" y" , String " 2" )]
67
61
68
- , let req = subtractRequestUnnamed (map Number [1 , 2 , 3 ]) nonNullId
69
- rsp = errResponse nonNullId (- 32602 )
70
- in testCase " disallow extra unnamed arguments" $ assertSubtractResponse req rsp
62
+ , testCase " extra unnamed arguments" $
63
+ assertInvalidParams " subtract" $ map Number [1 , 2 , 3 ]
71
64
72
- , let req = TestRequest " 12345" (Nothing :: Maybe () ) Nothing
73
- in testCase " invalid notification" $ callSubtractMethods req @?= (Nothing :: Maybe Value )
65
+ , let req = TestRequest " 12345" (Just defaultArgs ) Nothing
66
+ in testCase " invalid notification" $ callSubtractMethods req @?= (Nothing :: Maybe Value ) ]
74
67
75
- , testCase " batch request " testBatch
76
- , testCase " batch notifications " testBatchNotifications
77
- , testCase " allow missing version " testAllowMissingVersion
68
+ otherTests :: [ Test ]
69
+ otherTests = [ testCase " encode RPC error " $
70
+ fromByteString (encode $ rpcError ( - 1 ) " error " ) @?= Just ( TestRpcError ( - 1 ) " error " Nothing )
78
71
79
- , testCase " no arguments" $
80
- assertGetTimeResponse (Nothing :: Maybe Value )
72
+ , let err = rpcErrorWithData 1 " my message" errData
73
+ testError = TestRpcError 1 " my message" $ Just $ toJSON errData
74
+ errData = (' \x03BB ' , [True ], () )
75
+ in testCase " encode RPC error with data" $ fromByteString (encode err) @?= Just testError
81
76
82
- , testCase " empty argument array" $
83
- assertGetTimeResponse $ Just (empty :: Array )
77
+ , testCase " batch request" testBatch
78
+ , testCase " batch notifications" testBatchNotifications
79
+ , testCase " allow missing version" testAllowMissingVersion
84
80
85
- , testCase " empty argument object " $
86
- assertGetTimeResponse $ Just ( H. empty :: Object )
81
+ , testCase " no arguments " $
82
+ assertGetTimeResponse ( Nothing :: Maybe Value )
87
83
88
- , let req = subtractRequestNamed [(" x" , Number 10 ), (" y" , Number 20 ), (" z" , String " extra" )] nonNullId
89
- rsp = TestResponse nonNullId $ Right $ Number (- 10 )
90
- in testCase " allow extra named argument" $ assertSubtractResponse req rsp
84
+ , testCase " empty argument array" $
85
+ assertGetTimeResponse $ Just (empty :: Array )
91
86
92
- , let req = subtractRequestNamed [(" x1" , Number 500 ), (" x" , Number 1000 )] nonNullId
93
- rsp = TestResponse nonNullId (Right $ Number 1000 )
94
- in testCase " use default named argument" $ assertSubtractResponse req rsp
87
+ , testCase " empty argument object" $
88
+ assertGetTimeResponse $ Just (H. empty :: Object )
95
89
96
- , let req = subtractRequestUnnamed [ Number 4 ] nonNullId
97
- rsp = TestResponse nonNullId ( Right $ Number 4 )
98
- in testCase " use default unnamed argument" $ assertSubtractResponse req rsp
90
+ , let req = subtractRequestNamed [ " x " .= Number 10 , " y " .= Number 20 , " z " .= String " extra " ]
91
+ rsp = TestResponse defaultIdNonNull $ Right $ Number ( - 10 )
92
+ in testCase " allow extra named argument" $ assertSubtractResponse req rsp
99
93
100
- , let req = subtractRequestNamed [(" y " , Number 70 ), (" x" , Number ( - 10 ))] idNull
101
- rsp = TestResponse idNull (Right $ Number ( - 80 ) )
102
- in testCase " null request ID " $ assertSubtractResponse req rsp
94
+ , let req = subtractRequestNamed [(" x1 " , Number 500 ), (" x" , Number 1000 )]
95
+ rsp = TestResponse defaultIdNonNull (Right $ Number 1000 )
96
+ in testCase " use default named argument " $ assertSubtractResponse req rsp
103
97
104
- , testCase " parallelize tasks" P. testParallelizingTasks ]
98
+ , let req = subtractRequestUnnamed [Number 4 ]
99
+ rsp = TestResponse defaultIdNonNull (Right $ Number 4 )
100
+ in testCase " use default unnamed argument" $ assertSubtractResponse req rsp
101
+
102
+ , testCase " string request ID" $ assertEqualId $ idString " ID 5"
103
+
104
+ , testCase " null request ID" $ assertEqualId idNull
105
+
106
+ , testCase " parallelize tasks" P. testParallelizingTasks ]
105
107
106
108
assertSubtractResponse :: ToJSON a => a -> TestResponse -> Assertion
107
109
assertSubtractResponse request expectedRsp = removeErrMsg <$> rsp @?= Just expectedRsp
108
110
where rsp = callSubtractMethods request
109
111
112
+ assertEqualId :: TestId -> Assertion
113
+ assertEqualId i = let req = TestRequest " subtract" (Just defaultArgs) (Just i)
114
+ rsp = TestResponse i $ Right defaultResult
115
+ in assertSubtractResponse req rsp
116
+
117
+ assertInvalidParams :: ToJSON a => Text -> a -> Assertion
118
+ assertInvalidParams name args = let req = TestRequest name (Just args) $ Just defaultIdNonNull
119
+ rsp = errResponse defaultIdNonNull (- 32602 )
120
+ in assertSubtractResponse req rsp
121
+
110
122
testWrongVersion :: Assertion
111
123
testWrongVersion = removeErrMsg <$> rsp @?= Just (errResponse idNull (- 32600 ))
112
124
where rsp = callSubtractMethods $ Object $ H. insert versionKey (String " 1" ) hm
113
- Object hm = toJSON $ subtractRequestNamed [(" x" , Number 4 )] nonNullId
125
+ Object hm = toJSON $ subtractRequestNamed [(" x" , Number 4 )]
126
+
127
+ testWrongIdType :: Assertion
128
+ testWrongIdType = removeErrMsg <$> rsp @?= Just (errResponse idNull (- 32600 ))
129
+ where rsp = callSubtractMethods $ Object $ H. insert idKey (Bool True ) hm
130
+ Object hm = toJSON $ subtractRequestNamed [(" x" , Number 4 )]
114
131
115
132
testBatch :: Assertion
116
133
testBatch = sortBy (compare `on` fromIntId) (fromJust (fromByteString =<< runIdentity response)) @?= expected
117
134
where expected = [TestResponse i1 (Right $ Number 2 ), TestResponse i2 (Right $ Number 4 )]
118
135
response = call (toMethods [subtractMethod]) $ encode request
119
- request = [subtractRequestNamed (toArgs 10 8 ) i1, subtractRequestNamed (toArgs 24 20 ) i2]
120
- toArgs x y = [(" x" , Number x), (" y" , Number y)]
136
+ request = [TestRequest " subtract" (toArgs 10 8 ) (Just i1), TestRequest " subtract" (toArgs 24 20 ) (Just i2)]
137
+ toArgs :: Int -> Int -> Maybe Value
138
+ toArgs x y = Just $ object [" x" .= x, " y" .= y]
121
139
i1 = idNumber 1
122
140
i2 = idNumber 2
123
141
fromIntId rsp = (fromNumId $ rspId rsp) :: Maybe Int
@@ -128,11 +146,10 @@ testBatchNotifications = runState response 0 @?= (Nothing, 10)
128
146
request = replicate 10 $ TestRequest " increment" (Nothing :: Maybe () ) Nothing
129
147
130
148
testAllowMissingVersion :: Assertion
131
- testAllowMissingVersion = (fromByteString =<< runIdentity response) @?= (Just $ TestResponse i (Right $ Number 1 ))
149
+ testAllowMissingVersion = (fromByteString =<< runIdentity response) @?= (Just $ TestResponse defaultIdNonNull (Right $ Number 1 ))
132
150
where requestNoVersion = Object $ H. delete versionKey hm
133
- Object hm = toJSON $ subtractRequestNamed [(" x" , Number 1 )] i
151
+ Object hm = toJSON $ subtractRequestNamed [(" x" , Number 1 )]
134
152
response = call (toMethods [subtractMethod]) $ encode requestNoVersion
135
- i = idNumber (- 1 )
136
153
137
154
incrementStateMethod :: Method (State Int )
138
155
incrementStateMethod = toMethod " increment" f ()
@@ -142,15 +159,15 @@ incrementStateMethod = toMethod "increment" f ()
142
159
assertGetTimeResponse :: ToJSON a => a -> Assertion
143
160
assertGetTimeResponse args = passed @? " unexpected RPC response"
144
161
where passed = (expected == ) <$> rsp
145
- expected = Just $ TestResponse nonNullId (Right $ Number 100 )
146
- req = TestRequest " get_time_seconds" (Just args) (Just nonNullId )
162
+ expected = Just $ TestResponse defaultIdNonNull (Right $ Number 100 )
163
+ req = TestRequest " get_time_seconds" (Just args) (Just defaultIdNonNull )
147
164
rsp = callGetTimeMethod req
148
165
149
- subtractRequestNamed :: [(Text , Value )] -> TestId -> TestRequest
150
- subtractRequestNamed args i = TestRequest " subtract" (Just $ H. fromList args) (Just i )
166
+ subtractRequestNamed :: [(Text , Value )] -> TestRequest
167
+ subtractRequestNamed args = TestRequest " subtract" (Just $ H. fromList args) (Just defaultIdNonNull )
151
168
152
- subtractRequestUnnamed :: [Value ] -> TestId -> TestRequest
153
- subtractRequestUnnamed args i = TestRequest " subtract" (Just args) (Just i )
169
+ subtractRequestUnnamed :: [Value ] -> TestRequest
170
+ subtractRequestUnnamed args = TestRequest " subtract" (Just args) (Just defaultIdNonNull )
154
171
155
172
callSubtractMethods :: (ToJSON a , FromJSON b ) => a -> Maybe b
156
173
callSubtractMethods req = let methods :: Methods Identity
@@ -192,8 +209,11 @@ removeErrMsg rsp = rsp
192
209
errResponse :: TestId -> Int -> TestResponse
193
210
errResponse i code = TestResponse i (Left (TestRpcError code " " Nothing ))
194
211
195
- nonNullId :: TestId
196
- nonNullId = idNumber 3
212
+ defaultIdNonNull :: TestId
213
+ defaultIdNonNull = idNumber 3
197
214
198
215
defaultArgs :: [Int ]
199
216
defaultArgs = [1 , 2 ]
217
+
218
+ defaultResult :: Value
219
+ defaultResult = Number (- 1 )
0 commit comments