packages feed

postgresql-simple-opts-0.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}
import Test.Hspec
import Database.PostgreSQL.Simple.Options
import Database.PostgreSQL.Simple
import System.Environment
import Options.Applicative
import System.Exit

testParser :: IO Options
testParser = execParser $ info completeParser mempty

main :: IO ()
main = hspec $ describe "Options Parser" $ do
  it "parses all options" $ do
    let testArgs = [ "--host=example.com"
                   , "--port=1234"
                   , "--user=nobody"
                   , "--password=everytimeiclosemyeyes"
                   , "--database=future"
                   ]

        expected = OConnectInfo $ ConnectInfo
                   { connectHost     = "example.com"
                   , connectPort     = 1234
                   , connectUser     = "nobody"
                   , connectPassword = "everytimeiclosemyeyes"
                   , connectDatabase = "future"
                   }

    actual <- withArgs testArgs testParser
    actual `shouldBe` expected

  it "parses some and uses defaults for others" $ do
    let testArgs = [ "--user=nobody"
                   , "--password=everytimeiclosemyeyes"
                   , "--database=future"
                   ]

        expected = OConnectInfo $ ConnectInfo
                   { connectHost     = "127.0.0.1"
                   , connectPort     = 5432
                   , connectUser     = "nobody"
                   , connectPassword = "everytimeiclosemyeyes"
                   , connectDatabase = "future"
                   }

    actual <- withArgs testArgs testParser
    actual `shouldBe` expected

  it "parses no options and gives defaults" $ do
    let expected = OConnectInfo $ ConnectInfo
                   { connectHost     = "127.0.0.1"
                   , connectPort     = 5432
                   , connectUser     = "postgres"
                   , connectPassword = ""
                   , connectDatabase = ""
                   }

    actual <- withArgs [] testParser
    actual `shouldBe` expected
  it "parses the connection string double quoted" $ do
    let testArgs = ["--connectString=\"a b\""]
        expected = OConnectString "a b"

    actual <- withArgs testArgs testParser
    actual `shouldBe` expected
  it "parses the connection string single quoted" $ do
    let testArgs = ["--connectString='a b'"]
        expected = OConnectString "a b"

    actual <- withArgs testArgs testParser
    actual `shouldBe` expected
  it "parses the connection string no quotes" $ do
    let testArgs = ["--connectString=a_b"]
        expected = OConnectString "a_b"

    actual <- withArgs testArgs testParser
    actual `shouldBe` expected
  it "fails if connectString and other args are passed" $ do
    let testArgs = ["--connectString=a_b", "--port=1234"]
        handler :: ExitCode -> Bool
        handler (ExitFailure 1) = True
        handler _ = False

    shouldThrow (withArgs testArgs testParser) handler