packages feed

password-instances-3.0.0.0: test/tasty/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Aeson.Types (parseMaybe)
import Data.Text (Text)
import Database.Persist.Class (PersistField(..))
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.QuickCheck.Instances.Text ()
import Web.HttpApiData (FromHttpApiData(..))

import Data.Password.Types (Password, PasswordHash(..), unsafeShowPassword)
import Data.Password.Instances()


main :: IO ()
main = defaultMain $ testGroup "Password Instances"
  [ aesonTest
  , fromHttpApiDataTest
  , persistTest
  ]

data TestUser = TestUser {
  name :: Text,
  password :: Password
} deriving (Show)

instance FromJSON TestUser where
  parseJSON = withObject "TestUser" $ \o ->
    TestUser <$> o .: "name" <*> o .: "password"


aesonTest :: TestTree
aesonTest = testCase "Password (Aeson)" $
    assertEqual "password doesn't match" (Just testPassword) $
      unsafeShowPassword . password <$> parseMaybe parseJSON testUser
  where
    testPassword = "testpass"
    testUser = object
      [ "name" .= String "testname"
      , "password" .= String testPassword
      ]

fromHttpApiDataTest :: TestTree
fromHttpApiDataTest = testCase "Password (FromHttpApiData)" $
    assertEqual "password doesn't match" (Right testPassword) $
      unsafeShowPassword <$> parseUrlPiece testPassword
  where
    testPassword = "passtest"

persistTest :: TestTree
persistTest = testProperty "PasswordHash (PersistField)" $ \pass ->
    let pwd = PasswordHash pass
    in fromPersistValue (toPersistValue pwd) === Right pwd