packages feed

follow-0.1.0.0: test/Follow/Middlewares/Filter/InternalSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Follow.Middlewares.Filter.InternalSpec where

import           Follow.Middlewares.Filter.Internal
import           Follow.Types                       (Entry (..))
import           Helpers.Factories
import           Test.Hspec

spec :: Spec
spec = do
  describe ".equalP" $ do
    it "returns true on equality" $ do
      let entry = _entry {eURI = Just "http://url.com"}
      (eURI `equalP` "http://url.com") entry `shouldBe` True
    it "returns false on inequality" $ do
      let entry = _entry {eGUID = Just "GUID1"}
      (eGUID `equalP` "GUID2") entry `shouldBe` False
    it "returns false when field is Nothing" $ do
      let entry = _entry {eTitle = Nothing}
      (eTitle `equalP` "Title") entry `shouldBe` False
  describe ".infixP" $ do
    it "returns true when needle is contained" $ do
      let entry = _entry {eURI = Just "http://this_is_a_url.com"}
      ("url" `infixP` eURI) entry `shouldBe` True
    it "returns false when needle is not contained" $ do
      let entry = _entry {eGUID = Just "GUID1"}
      ("NO" `infixP` eGUID) entry `shouldBe` False
    it "returns false when field is Nothing" $ do
      let entry = _entry {eTitle = Nothing}
      ("Title" `infixP` eTitle) entry `shouldBe` False
  describe ".prefixP" $ do
    it "returns true when needle is prefix" $ do
      let entry = _entry {eURI = Just "http://url.com"}
      ("http://" `prefixP` eURI) entry `shouldBe` True
    it "returns false when needle is not prefix" $ do
      let entry = _entry {eGUID = Just "GUID1"}
      ("NO" `prefixP` eGUID) entry `shouldBe` False
    it "returns false when field is Nothing" $ do
      let entry = _entry {eTitle = Nothing}
      ("Title" `prefixP` eTitle) entry `shouldBe` False
  describe ".suffixP" $ do
    it "returns true when needle is suffix" $ do
      let entry = _entry {eURI = Just "http://url.com"}
      (".com" `suffixP` eURI) entry `shouldBe` True
    it "returns false when needle is not suffix" $ do
      let entry = _entry {eGUID = Just "GUID1"}
      ("NO" `suffixP` eGUID) entry `shouldBe` False
    it "returns false when field is Nothing" $ do
      let entry = _entry {eTitle = Nothing}
      ("Title" `suffixP` eTitle) entry `shouldBe` False
  describe ".lessP" $ do
    it "returns true when item is lesser" $ do
      let entry = _entry {eTitle = Just "A"}
      (eTitle `lessP` "B") entry `shouldBe` True
    it "returns false when item is not lesser" $ do
      let entry = _entry {eTitle = Just "C"}
      (eTitle `lessP` "B") entry `shouldBe` False
    it "returns false when item is equal" $ do
      let entry = _entry {eTitle = Just "A"}
      (eTitle `lessP` "A") entry `shouldBe` False
    it "returns false when item is Nothing" $ do
      let entry = _entry {eTitle = Nothing}
      (eTitle `lessP` "A") entry `shouldBe` False
  describe ".greaterP" $ do
    it "returns true when item is greater" $ do
      let entry = _entry {eTitle = Just "C"}
      (eTitle `greaterP` "A") entry `shouldBe` True
    it "returns false when item is not greater" $ do
      let entry = _entry {eTitle = Just "A"}
      (eTitle `greaterP` "B") entry `shouldBe` False
    it "returns false when item is equal" $ do
      let entry = _entry {eTitle = Just "A"}
      (eTitle `greaterP` "A") entry `shouldBe` False
    it "returns false when item is Nothing" $ do
      let entry = _entry {eTitle = Nothing}
      (eTitle `greaterP` "A") entry `shouldBe` False
  describe ".andP" $ do
    let entry = _entry {eTitle = Just "The Title"}
    it "returns true when both predicates apply" $ do
      (("The" `prefixP` eTitle) `andP` ("Title" `suffixP` eTitle)) entry `shouldBe`
        True
    it "returns false when first predicates fails" $ do
      (("NO" `prefixP` eTitle) `andP` ("Title" `suffixP` eTitle)) entry `shouldBe`
        False
    it "returns false when second predicates fails" $ do
      (("The" `prefixP` eTitle) `andP` ("NO" `suffixP` eTitle)) entry `shouldBe`
        False
    it "returns false when both predicates fail" $ do
      (("NO" `prefixP` eTitle) `andP` ("NEITHER" `suffixP` eTitle)) entry `shouldBe`
        False
  describe ".orP" $ do
    let entry = _entry {eTitle = Just "The Title"}
    it "returns true when both predicates apply" $ do
      (("The" `prefixP` eTitle) `orP` ("Title" `suffixP` eTitle)) entry `shouldBe`
        True
    it "returns true when first predicates applies" $ do
      (("The" `prefixP` eTitle) `orP` ("NO" `suffixP` eTitle)) entry `shouldBe`
        True
    it "returns true when second predicates applies" $ do
      (("NO" `prefixP` eTitle) `orP` ("Title" `suffixP` eTitle)) entry `shouldBe`
        True
    it "returns false when both predicates fail" $ do
      (("NO" `prefixP` eTitle) `orP` ("NEITHER" `suffixP` eTitle)) entry `shouldBe`
        False
  describe ".notP" $ do
    let entry = _entry {eTitle = Just "The Title"}
    it "returns true when predicate does not apply" $ do
      notP ("NO" `prefixP` eTitle) entry `shouldBe` True
    it "returns false when predicate applies" $ do
      notP ("The" `prefixP` eTitle) entry `shouldBe` False