packages feed

natskell-0.3.0.0: test/Unit/SubSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module SubSpec (spec) where

import           Control.Monad
import           Data.ByteString
import qualified Data.ByteString.Lazy      as LBS
import           Data.Either               (isLeft)
import           Fixtures                  (invalidSubjectCases)
import           Subscription.Types
import           Test.Hspec
import           Text.Printf
import           Transformers.Transformers
import           Types.Sub
import           Validators.Validators

spec :: Spec
spec = do
  subscribeOptionCases
  transformerCases
  validateCases
  validateSubjectCases

subscribeOptionCases = parallel $ do
  describe "subscribe config" $ do
    it "stores the queue group" $ do
      subscribeQueueGroup (SubscribeConfig Nothing (Just "WORKERS"))
        `shouldBe` Just "WORKERS"

explicitTransformerCases :: [(Sub, ByteString)]
explicitTransformerCases = [
  (Sub "SOME.SUBJ" Nothing "uuid", "SUB SOME.SUBJ uuid\r\n"),
  (Sub "SOME.SUBJ" (Just "QUEUE.GROUP.A") "uuid", "SUB SOME.SUBJ QUEUE.GROUP.A uuid\r\n")
  ]

transformerCases = parallel $ do
  describe "SUB transformer" $ do
    forM_ explicitTransformerCases $ \(input, want) ->
      it (printf "correctly transforms %s" (show input)) $ do
        LBS.toStrict (transform input) `shouldBe` want

explicitValidaterCases :: [(Sub, Either ByteString ())]
explicitValidaterCases = [
  (Sub ">" Nothing "a", Right ()),
  (Sub ">" (Just "1") "a", Right ()),
  (Sub "" Nothing "a", Left "explicit empty subject"),
  (Sub ">" (Just "") "a", Left "explicit empty queue group"),
  (Sub ">" Nothing "", Left "explicit empty sid")
  ]

validateCases = parallel $ do
  describe "SUB validater" $ do
    forM_ explicitValidaterCases $ \(input, want) ->
      it (printf "correctly validates %s" (show input)) $ do
        validate input `shouldBe` want

validateSubjectCases = parallel $ do
  describe "SUB subject validater" $ do
    forM_ invalidSubjectCases $ \input ->
      it (printf "rejects invalid subscription subject %s" (show input)) $ do
        validate (Sub input Nothing "a") `shouldSatisfy` isLeft

    it "rejects queue groups containing whitespace" $ do
      validate (Sub "FOO" (Just "bad queue") "a") `shouldSatisfy` isLeft