packages feed

fakedata-1.0: test/OtherSpec.hs

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

module OtherSpec where

import Control.Applicative ((<|>))
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) `shouldBeOneOf` ["Kaido Välbe Mark", "Kardo Salum\228e Levandi"]
    it "name with middle - pak" $ do
      ctries <-
        generateWithSettings
          (setLocale "en-PAK" defaultFakerSettings)
          nameWithMiddle
      (ctries) `shouldBeOneOf` ["Zia Butt Iqbal", "Taj Mughal Hussain"]
    it "name with middle - au" $ do
      ctries <-
        generateWithSettings
          (setLocale "en-AU" defaultFakerSettings)
          nameWithMiddle
      (ctries) `shouldBeOneOf` ["Georgia Sarah Kelly", "Jasmine Alana Bergstrom"]
    it "group A - WC" $ do
      ga <- generate WC.groupsGroupA
      ga `shouldBeOneOf` ["Russia", "Uruguay"]
    it "App author" $ do
      ga <-
        generateWithSettings (setDeterministic defaultFakerSettings) AP.author
      ga `shouldBeOneOf` ["Schmidt, Breitenberg and Lowe", "Goldner, Will and Muller"]
    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 "!")
      let expected = ["Hello Brent Breitenberg!", "Hello Valentine Will V!"]
      phraseL `shouldBeOneOf` expected
      phraseR `shouldBeOneOf` expected
  describe "Monoid instance of Fake" $
    it "mappend mempty doesn't modify the other operand" $ do
      name' <- generate $ name `mappend` mempty
      name' `shouldBeOneOf` ["Brent Breitenberg", "Valentine Will V"]