packages feed

dotenv-0.5.2.0: spec/Configuration/Dotenv/Scheme/ParseSpec.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Configuration.Dotenv.Scheme.ParseSpec (spec) where

import Data.Either (isLeft, isRight)
import Data.Yaml (decodeFileEither)
import Test.Hspec

import Configuration.Dotenv.Scheme.Types
import Configuration.Dotenv.Scheme.Parser

fromRight :: (Show a, Show b) => Either a b -> b
fromRight (Right v) = v
fromRight (Left v) = error ("Left " ++ show v ++ " constructor instead" )

spec :: Spec
spec = do
  specInstance
  specParse

specInstance :: Spec
specInstance = describe "parse a config env file" $
  it "parses the env config values from a file" $
    let expected :: [Env]
        expected =
            [ Env "DOTENV" EnvBool True
            , Env "OTHERENV" EnvBool False
            , Env "PORT" EnvInteger True
            , Env "TOKEN" EnvInteger False
            , Env "URL" EnvText True
            ]
     in do
       actual <- decodeFileEither "spec/fixtures/.scheme.yml"
       fromRight actual `shouldBe` expected

specParse :: Spec
specParse =
  describe "parseEnvAs" $ do
    context "given an integer" $ do
      context "when the integer can be parsed" $
        it "should return Right ()" $
          let varContent = "123"
              integer = EnvInteger
           in varContent `parseEnvAs` integer `shouldSatisfy` isRight

      context "when the integer can't be parsed" $
        it "should return Left (ParseError Char Void)" $
          let varContent = "123x"
              integer = EnvInteger
           in varContent `parseEnvAs` integer `shouldSatisfy` isLeft

    context "given a bool" $ do
      context "when the bool can be parsed" $
        it "should return Right ()" $
          let varContent = "true"
              boolean = EnvBool
           in varContent `parseEnvAs` boolean `shouldSatisfy` isRight

      context "when the bool can't be parsed" $
        it "should return False" $
          let varContent = "truex"
              boolean = EnvBool
           in varContent `parseEnvAs` boolean `shouldSatisfy` isLeft