{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Main (main) where
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import qualified MainSpec
import qualified JsonSpec
import Options.Applicative
import System.Environment (withArgs)
import Test.Hspec
import qualified Text.PrettyPrint.ANSI.Leijen as PP
import Web.Telegram.API.Bot
-- | Command line options for test suite
data Options = Options
{
opt_integration :: Bool -- ^ Run integration tests
, opt_token :: Maybe String -- ^ Bot token from BotFather
, opt_chatId :: Maybe String -- ^ Id of a chat or of your bot
, opt_botName :: Maybe String -- ^ Bot name
, opt_hSpecOpts :: Maybe [String] -- ^ Command line options to pass to hSpec
}
options :: Parser Options
options = Options
<$> switch
( long "integration"
<> help "Run integration tests" )
<*> optional ( strOption
( long "token"
<> short 't'
<> metavar "BOT_TOKEN"
<> help "Bot Token" ))
<*> optional ( strOption
( long "chatid"
<> short 'c'
<> metavar "CHAT_ID"
<> help "Chat Id" ))
<*> optional ( strOption
( long "botname"
<> short 'b'
<> metavar "BOT_NAME"
<> help "Bot Name" ))
<*> optional ( some ( argument str
( metavar "HSPEC_ARGS"
<> help "Hspec arguments")))
main :: IO ()
main = do
Options{..} <- execParser opts
let integration = opt_integration
token = fmap (\x -> Token ("bot" <> T.pack x)) opt_token
chatId = T.pack <$> opt_chatId
botName = T.pack <$> opt_botName
hspecArgs = fromMaybe [] opt_hSpecOpts
withArgs hspecArgs $ hspec (runSpec' integration token chatId botName)
where opts = info (helper <*> options)
( fullDesc
<> progDescDoc description)
runSpec' :: Bool -> Maybe Token -> Maybe Text -> Maybe Text -> SpecWith ()
runSpec' integration token chatId botName = do
describe "Unit tests" $ do
describe "Json tests" $ JsonSpec.spec
if integration then runIntegrationSpec token chatId botName
else describe "Integration tests" $ it "skipping..." $
pendingWith "Use --integration switch to run integration tests"
runIntegrationSpec :: Maybe Token -> Maybe Text -> Maybe Text -> SpecWith ()
runIntegrationSpec (Just token) (Just chatId) (Just botName) = do
describe "Main integration tests" $ MainSpec.spec token chatId botName
--describe "Inline integration tests" $ InlineSpec.spec token chatId botName
runIntegrationSpec _ _ _ = describe "Integration tests" $ do
fail "Missing required arguments for integration tests. Run stack test --test-arguments \"--help\" for more info"
description :: Maybe PP.Doc
description = Just $
(PP.text "Run the haskell-telegram-api tests")
PP.<$> ((PP.text "Running with stack: ") PP.<> (PP.text "stack test --test-arguments=\"--integration -t asd128903uiasbfì1023u -c 1235122 -b MyTeleBot -- -m send\""))
PP.<$> ((PP.red . PP.text $ "WARNING: ") PP.<> (PP.text "the HSPEC_ARGS are optional but if present MUST be at the end and seperated from the other options with a -- "))