packages feed

it-has-0.1.0.0: test/Spec.hs

{-# LANGUAGE DeriveAnyClass     #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia        #-}
{-# LANGUAGE TemplateHaskell    #-}

import           Control.Monad (void)
import           Data.Has
import           GHC.Generics    (Generic)
import           Test.QuickCheck (Arbitrary, quickCheckAll)

newtype LogConfig =
  LogConfig String
  deriving (Show, Eq)
  deriving (Arbitrary) via (String)

newtype SomeUrl =
  SomeUrl String
  deriving (Show, Eq)
  deriving (Arbitrary) via (String)

newtype ConnectionString =
  ConnectionString String
  deriving (Show, Eq)
  deriving (Arbitrary) via (String)

newtype DatabaseConfig =
  DatabaseConfig String
  deriving (Show, Eq)
  deriving (Arbitrary) via (String)

data SomeConfig =
  SomeConfig
    { someConfigLogConfig      :: LogConfig
    , someConfigDatabaseConfig :: DatabaseConfig
    , someConfigSomeUrl        :: SomeUrl
    } deriving
      ( Eq
      , Generic
      , Has LogConfig
      , Has DatabaseConfig
      , Has SomeUrl )

newtype ErrorText =
  ErrorText String
  deriving (Show, Eq)
  deriving (Arbitrary) via (String)

data Error =
  ValidationError ErrorText |
  Unauthorized ErrorText
  deriving (Generic, Has ErrorText)

prop_returnsSetValuesForRecord :: LogConfig -> DatabaseConfig -> SomeUrl -> Bool
prop_returnsSetValuesForRecord logConfig dbConfig someUrl =
  let config = SomeConfig logConfig dbConfig someUrl
  in getter config == logConfig &&
     getter config == dbConfig &&
     getter config == someUrl

prop_setsCorrectValues :: (LogConfig, DatabaseConfig, SomeUrl) -> (LogConfig, DatabaseConfig, SomeUrl) -> Bool
prop_setsCorrectValues (logConfig, dbConfig, someUrl) (newLogConfig, newDbConfig, newSomeUrl) =
  let config = SomeConfig logConfig dbConfig someUrl
      expectedConfig = SomeConfig newLogConfig newDbConfig newSomeUrl
      updatedConfig = modifier (const newLogConfig) . modifier (const newDbConfig) . modifier (const newSomeUrl) $ config
  in updatedConfig == expectedConfig

prop_returnsForcedFieldsForSumType :: ErrorText -> ErrorText -> Bool
prop_returnsForcedFieldsForSumType firstErrorText secondErrorText =
  let firstError = ValidationError firstErrorText
      secondError = Unauthorized secondErrorText
  in getter firstError == firstErrorText &&
     getter secondError == secondErrorText

return []

main :: IO ()
main = void runTests

runTests :: IO Bool
runTests = $quickCheckAll