packages feed

natskell-0.0.0.1: test/Unit/ErrSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module ErrSpec (spec) where

import           Control.Monad
import qualified Data.ByteString   as BS
import           Fixtures
import           Parser.API
    ( ParseStep (Emit)
    , ParsedMessage (ParsedErr)
    , parse
    )
import           Parser.Attoparsec (parserApi)
import           Test.Hspec
import           Text.Printf
import           Types.Err

explicitCases :: [(BS.ByteString, Err)]
explicitCases = [
  ("-ERR 'Unknown Protocol Operation'\r\n", ErrUnknownOp "Unknown Protocol Operation"),
  ("-ERR 'Attempted To Connect To Route Port'\r\n", ErrRoutePortConn "Attempted To Connect To Route Port"),
  ("-ERR 'Authorization Violation'\r\n", ErrAuthViolation "Authorization Violation"),
  ("-ERR 'Authorization Timeout'\r\n", ErrAuthTimeout "Authorization Timeout"),
  ("-ERR 'Invalid Client Protocol'\r\n", ErrInvalidProtocol "Invalid Client Protocol"),
  ("-ERR 'Maximum Control Line Exceeded'\r\n", ErrMaxControlLineEx "Maximum Control Line Exceeded"),
  ("-ERR 'Secure Connection - TLS Required'\r\n", ErrTlsRequired "Secure Connection - TLS Required"),
  ("-ERR 'Stale Connection'\r\n", ErrStaleConn "Stale Connection"),
  ("-ERR 'Maximum Connections Exceeded'\r\n", ErrMaxConnsEx "Maximum Connections Exceeded"),
  ("-ERR 'Slow Consumer'\r\n", ErrSlowConsumer"Slow Consumer"),
  ("-ERR 'Maximum Payload Violation'\r\n", ErrMaxPayload "Maximum Payload Violation"),
  ("-ERR 'Invalid Subject'\r\n", ErrInvalidSubject "Invalid Subject"),
  ("-ERR 'Permissions Violation For Subscription To FOO.'\r\n", ErrPermViolation "Permissions Violation For Subscription To FOO."),
  ("-ERR 'Permissions Violation For Publish To FOO.'\r\n", ErrPermViolation "Permissions Violation For Publish To FOO.")
  ]

generatedCases =
  zip
    ((\x n-> foldr BS.append "" ["-ERR 'Permissions Violation For ", x, " To ", n, "'\r\n"]) <$> ["Subscription", "Publish"] <*> invalidSubjectCases)
    ((\x n-> ErrPermViolation $ foldr BS.append "" ["Permissions Violation For ", x, " To ", n]) <$> ["Subscription", "Publish"] <*> invalidSubjectCases)

spec :: Spec
spec = do
  cases

cases = parallel $ do
  describe "generic parser" $ do
    forM_ explicitCases $ \(input, want) ->
      it (printf "correctly parses explicit case %s" (show input)) $ do
        let output = parse parserApi input
        output `shouldBe` Emit (ParsedErr want) ""
    forM_ generatedCases $ \(input, want) ->
      it (printf "correctly parses generated case %s" (show input)) $ do
        let output = parse parserApi input
        output `shouldBe` Emit (ParsedErr want) ""