packages feed

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 ()