follow-0.1.0.0: test/FollowSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module FollowSpec where
import Data.Text (Text)
import qualified Data.Text as T (concat)
import Follow
import Follow.Types (Digester, Directory (..), Entry (..),
Middleware, Recipe (..), Subject (..))
import Helpers.Factories
import Test.Hspec
removeEntriesMiddleware = (\d -> Directory (dSubject d) []) :: Middleware
addEntryMiddleware entry =
(\directory -> Directory (dSubject directory) $ entry : (dEntries directory)) :: Middleware
spec :: Spec
spec = do
describe ".directoryFromFetched" $ do
it "populates Directory Entries out of given fetcher" $ do
let entry = _entry {eTitle = Just "Fetched"}
directory <- directoryFromFetched (e2F entry) _subject
dEntries directory `shouldBe` [entry]
it "associates given subject with the Directory" $ do
let subject = _subject {sTitle = "DirectoryFromFetched"}
directory <- directoryFromFetched (e2F _entry) subject
dSubject directory `shouldBe` subject
describe ".applyMiddlewares" $ do
it "applies in order given middlewares" $ do
let directory = emptyDirectory _subject
let middleware1 = addEntryMiddleware $ _entry {eTitle = Just "1"}
let middleware2 = addEntryMiddleware $ _entry {eTitle = Just "2"}
let result = applyMiddlewares [middleware1, middleware2] directory
let resultEntries = dEntries result
eTitle <$> resultEntries `shouldBe` [Just "2", Just "1"]
describe ".directoryFromRecipe" $ do
it "associates given subject to the created directory" $ do
let recipe = Recipe _subject [] []
directory <- directoryFromRecipe recipe
dSubject directory `shouldBe` _subject
it "concatenates given fetched entries" $ do
let entry1 = _entry {eTitle = Just "Title 1"}
let entry2 = _entry {eTitle = Just "Title 2"}
let recipe = Recipe _subject [((e2F entry1), []), (e2F entry2, [])] []
directory <- directoryFromRecipe recipe
dEntries directory `shouldBe` [entry1, entry2]
it "applies middlewares at each step" $ do
let entry1 = _entry {eTitle = Just "Title 1"}
let entry2 = _entry {eTitle = Just "Title 2"}
let recipe =
Recipe
_subject
[((e2F entry1), [removeEntriesMiddleware]), (e2F entry2, [])]
[]
directory <- directoryFromRecipe recipe
dEntries directory `shouldBe` [entry2]
it "applies middlewares to fetched entries as a whole" $ do
let entry1 = _entry {eTitle = Just "Title 1"}
let recipe = Recipe _subject [(e2F entry1, [])] [removeEntriesMiddleware]
directory <- directoryFromRecipe recipe
dEntries directory `shouldBe` []
describe ".applySteps" $ do
let directory = emptyDirectory _subject
it "concatenates given fetched entries" $ do
let entry1 = _entry {eTitle = Just "Title 1"}
let entry2 = _entry {eTitle = Just "Title 2"}
directory <- applySteps directory [(e2F entry1, []), (e2F entry2, [])]
dEntries directory `shouldBe` [entry1, entry2]
it "applies middlewares at each step" $ do
let entry1 = _entry {eTitle = Just "Title 1"}
let entry2 = _entry {eTitle = Just "Title 2"}
directory <-
applySteps
directory
[(e2F entry1, [removeEntriesMiddleware]), (e2F entry2, [])]
dEntries directory `shouldBe` [entry2]
describe ".emptyDirectory" $ do
let directory = emptyDirectory _subject
it "assigns given subject" $ do dSubject directory `shouldBe` _subject
it "assigns empty list as entries" $ do dEntries directory `shouldBe` []
describe ".mergeEntries" $ do
let entry1 = _entry {eTitle = Just "1"}
let entry2 = _entry {eTitle = Just "2"}
let directory = Directory _subject [entry1]
it "concatenate entries" $ do
let directory' = mergeEntries directory [entry2]
dEntries directory' `shouldBe` [entry1, entry2]
it "keeps first appearance of duplicates" $ do
let directory' = mergeEntries directory [entry2, entry1]
dEntries directory' `shouldBe` [entry1, entry2]