nakadi-client-0.6.0.0: tests/Network/Nakadi/Subscriptions/Test.hs
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Network.Nakadi.Subscriptions.Test where
import ClassyPrelude
import Control.Lens
import Network.Nakadi
import qualified Network.Nakadi.Lenses as L
import Network.Nakadi.Tests.Common
import Test.Tasty
import Test.Tasty.HUnit
import Network.Nakadi.Subscriptions.Processing.Test
import Network.Nakadi.Subscriptions.Stats.Test
testSubscriptions :: Config App -> TestTree
testSubscriptions conf = testGroup
"Subscriptions"
[ testSubscriptionsStats conf
, testSubscriptionsProcessing conf
, testCase "SubscriptionsList" (testSubscriptionsList conf)
, testCase "SubscriptionsCreateDelete" (testSubscriptionsCreateDelete conf)
, testCase "SubscriptionDoubleDeleteFailure" (testSubscriptionsDoubleDeleteFailure conf)
]
testSubscriptionsList :: Config App -> Assertion
testSubscriptionsList conf = run $ do
-- Cleanup
deleteSubscriptionsByAppPrefix prefix
recreateEvent myEventType
-- Create new Subscriptions
subscriptionIds <- forM [1 .. n] $ \i -> do
let owningApp = ApplicationName (prefix <> tshow i)
subscription <- subscriptionCreate (mySubscription (Just owningApp))
return (subscription ^. L.id)
liftIO $ n @=? length subscriptionIds
-- Retrieve list of all Subscriptions
subscriptions' <- subscriptionsList Nothing Nothing
-- Filter for the subscriptions we have created above
let subscriptionsFiltered = filter (subscriptionAppHasPrefix prefix) subscriptions'
subscriptionIdsFiltered = map (view L.id) $ subscriptionsFiltered
liftIO $ n @=? length subscriptionIdsFiltered
liftIO $ sort subscriptionIds @=? sort subscriptionIdsFiltered
where
n = 100
prefix = "test-suite-list-"
run = runApp . runNakadiT conf
deleteSubscriptionsByAppPrefix :: MonadNakadi b m => Text -> m ()
deleteSubscriptionsByAppPrefix prefix = do
subscriptions <- subscriptionsList Nothing Nothing
let subscriptionsFiltered = filter (subscriptionAppHasPrefix prefix) subscriptions
subscriptionIdsFiltered = map (view L.id) subscriptionsFiltered
forM_ subscriptionIdsFiltered subscriptionDelete
subscriptionAppHasPrefix :: Text -> Subscription -> Bool
subscriptionAppHasPrefix prefix subscription =
let ApplicationName owningApp = subscription ^. L.owningApplication
in take (length prefix) owningApp == prefix
mySubscription :: Maybe ApplicationName -> SubscriptionRequest
mySubscription maybeOwningApp = SubscriptionRequest
{ _owningApplication = fromMaybe "test-suite" maybeOwningApp
, _eventTypes = [myEventTypeName]
, _consumerGroup = Nothing
, _subscriptionPosition = Nothing
}
testSubscriptionsCreateDelete :: Config App -> Assertion
testSubscriptionsCreateDelete conf = runApp . runNakadiT conf $ do
recreateEvent myEventType
subscription <- subscriptionCreate (mySubscription Nothing)
subscriptionDelete (subscription ^. L.id)
return ()
testSubscriptionsDoubleDeleteFailure :: Config App -> Assertion
testSubscriptionsDoubleDeleteFailure conf = runApp . runNakadiT conf $ do
recreateEvent myEventType
subscription <- subscriptionCreate (mySubscription Nothing)
subscriptionDelete (subscription ^. L.id)
res <- try (subscriptionDelete (subscription ^. L.id))
case res of
Left (SubscriptionNotFound _) -> return ()
_ -> liftIO $ assertFailure "Expected SubscriptionNotFound exception"
return ()