From e42ea94eab62164ef438d1122b9105857093ce80 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Thu, 29 Sep 2016 22:03:00 +0700 Subject: [PATCH] BrokerClient: support for notifications request --- src/ATrade/Broker/Client.hs | 17 ++++++++++++++--- test/TestBrokerClient.hs | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/ATrade/Broker/Client.hs b/src/ATrade/Broker/Client.hs index c75287a..9298fd6 100644 --- a/src/ATrade/Broker/Client.hs +++ b/src/ATrade/Broker/Client.hs @@ -4,7 +4,8 @@ module ATrade.Broker.Client ( startBrokerClient, stopBrokerClient, submitOrder, - cancelOrder + cancelOrder, + getNotifications ) where import ATrade.Types @@ -29,6 +30,7 @@ data BrokerClientHandle = BrokerClientHandle { completionMvar :: MVar (), submitOrder :: Order -> IO (Either T.Text OrderId), cancelOrder :: OrderId -> IO (Either T.Text ()), + getNotifications :: IO (Either T.Text [Notification]), cmdVar :: MVar BrokerServerRequest, respVar :: MVar BrokerServerResponse } @@ -61,6 +63,7 @@ startBrokerClient ctx endpoint = do completionMvar = compMv, submitOrder = bcSubmitOrder idCounter cmdVar respVar, cancelOrder = bcCancelOrder idCounter cmdVar respVar, + getNotifications = bcGetNotifications idCounter cmdVar respVar, cmdVar = cmdVar, respVar = respVar } @@ -79,8 +82,8 @@ bcSubmitOrder idCounter cmdVar respVar order = do (ResponseOrderSubmitted oid) -> return $ Right oid _ -> return $ Left "Unknown error" (ResponseError msg) -> return $ Left msg - +bcCancelOrder :: IORef RequestSqnum -> MVar BrokerServerRequest -> MVar BrokerServerResponse -> OrderId -> IO (Either T.Text ()) bcCancelOrder idCounter cmdVar respVar orderId = do sqnum <- nextId idCounter putMVar cmdVar (RequestCancelOrder sqnum orderId) @@ -90,4 +93,12 @@ bcCancelOrder idCounter cmdVar respVar orderId = do _ -> return $ Left "Unknown error" (ResponseError msg) -> return $ Left msg - +bcGetNotifications :: IORef RequestSqnum -> MVar BrokerServerRequest -> MVar BrokerServerResponse -> IO (Either T.Text [Notification]) +bcGetNotifications idCounter cmdVar respVar = do + sqnum <- nextId idCounter + putMVar cmdVar (RequestNotifications sqnum) + resp <- takeMVar respVar + case resp of + (ResponseNotifications ns) -> return $ Right ns + _ -> return $ Left "Unknown error" + (ResponseError msg) -> return $ Left msg diff --git a/test/TestBrokerClient.hs b/test/TestBrokerClient.hs index 3954e6c..846896e 100644 --- a/test/TestBrokerClient.hs +++ b/test/TestBrokerClient.hs @@ -38,6 +38,7 @@ import MockBroker unitTests = testGroup "Broker.Client" [ testBrokerClientStartStop , testBrokerClientCancelOrder + , testBrokerClientGetNotifications ] makeEndpoint = do @@ -77,3 +78,18 @@ testBrokerClientCancelOrder = testCase "Broker client: submit and cancel order" Right _ -> return() ))) +testBrokerClientGetNotifications = testCase "Broker client: get notifications" $ withContext (\ctx -> do + ep <- makeEndpoint + (mockBroker, broState) <- mkMockBroker ["demo"] + bracket (startBrokerServer [mockBroker] ctx ep) stopBrokerServer (\broS -> + bracket (startBrokerClient ctx ep) stopBrokerClient (\broC -> do + maybeOid <- submitOrder broC defaultOrder + case maybeOid of + Left err -> assertFailure "Invalid response" + Right oid -> do + maybeNs <- getNotifications broC + case maybeNs of + Left err -> assertFailure "Invalid response" + Right ns -> 1 @=? length ns + ))) +