packages feed

fakedata-0.8.0: test/OtherSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module OtherSpec where

import Control.Monad.Catch
import Control.Monad.IO.Class
import qualified Data.Map as M
import Data.Semigroup ((<>))
import Data.Text hiding (all, map)
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Data.Vector (Vector)
import qualified Data.Vector as V
import Faker hiding (defaultFakerSettings)
import qualified Faker.App as AP
import qualified Faker.Educator as ED
import Faker.Name
import qualified Faker.Address as AD
import Faker.Source
import qualified Faker.WorldCup as WC
import Test.Hspec
import TestImport

isText :: Text -> Bool
isText x = T.length x >= 1

data Person = Person {
    personName :: Text,
    personAddress :: Text
} deriving (Show, Eq)

fakePerson :: Fake Person
fakePerson = do
    personName <- name
    personAddress <- AD.fullAddress
    pure $ Person{..}

spec :: Spec
spec = do
  describe "Faker Generate" $ do
    it "ruby code" $ do
      hworld <- generate helloWorldRuby
      hworld `shouldSatisfy` isText
    it "name with middle - ee" $ do
      ctries <-
        generateWithSettings
          (setLocale "ee" defaultFakerSettings)
          nameWithMiddle
      (ctries) `shouldBe` "Kaido Välbe Mark"
    it "name with middle - pak" $ do
      ctries <-
        generateWithSettings
          (setLocale "en-PAK" defaultFakerSettings)
          nameWithMiddle
      (ctries) `shouldBe` "Zia Butt Iqbal"
    it "name with middle - au" $ do
      ctries <-
        generateWithSettings
          (setLocale "en-AU" defaultFakerSettings)
          nameWithMiddle
      (ctries) `shouldBe` "Georgia Sarah Kelly"
    it "group A - WC" $ do
      ga <- generate WC.groupsGroupA
      ga `shouldBe` "Russia"
    it "App author" $ do
      ga <-
        generateWithSettings (setDeterministic defaultFakerSettings) AP.author
      ga `shouldBe` "Schmidt, Breitenberg and Lowe"
    it "Same Person generated" $ do
      p1 <- generate fakePerson
      p2 <- generate fakePerson 
      p1 `shouldBe` p2
    it "Different Person generated" $ do
      p1 <- generate fakePerson
      p2 <- generateNonDeterministic fakePerson 
      p1 `shouldNotBe` p2
  describe "Semigroup instance of Fake" $
    it "can be appended and it is associative" $ do
      phraseL <- generate $ (pure "Hello " <> name) <> pure "!"
      phraseR <- generate $ pure "Hello " <> (name <> pure "!")
      phraseL `shouldBe` "Hello Brent Breitenberg!"
      phraseR `shouldBe` "Hello Brent Breitenberg!"
  describe "Monoid instance of Fake" $
    it "mappend mempty doesn't modify the other operand" $ do
      name' <- generate $ name `mappend` mempty
      name' `shouldBe` "Brent Breitenberg"