packages feed

password-aeson-0.1.0.0: test/tasty/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Aeson.Types (parseMaybe)
import Data.Text (Text)
import Test.Tasty (TestTree, defaultMain, testGroup)
import Test.Tasty.QuickCheck (testProperty, (===))
import Test.QuickCheck.Instances.Text ()

import Data.Password.Types (Password, unsafeShowPassword)
import Data.Password.Aeson ()


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

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 =
  testProperty "Password (Aeson)" $ \pwd ->
    Just pwd === (unsafeShowPassword . password <$> parseIt pwd)
  where
    parseIt pwd =
      parseMaybe parseJSON $
        object
          [ "name" .= String "testname"
          , "password" .= String pwd
          ]