packages feed

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]