packages feed

yesod-paginator-1.1.2.2: test/Yesod/Paginator/WidgetsSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Yesod.Paginator.WidgetsSpec
    ( spec
    ) where

import Data.Functor ((<&>))
import SpecHelper
import Test.QuickCheck

spec :: Spec
spec = do
  withApp $ do
    describe "simple" $ it "works" $ do
        get $ SimpleR 10 3 3

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev disabled\"><a>«</a></li>"
            , "<li class=\"active disabled\"><a>1</a></li>"
            , "<li class=\"next\"><a href=\"?p=2\">2</a></li>"
            , "<li class=\"next\"><a href=\"?p=3\">3</a></li>"
            , "<li class=\"next\"><a href=\"?p=2\">»</a></li>"
            , "</ul>"
            ]

        request $ do
            addGetParam "p" "3"
            setUrl $ SimpleR 10 3 3

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev\"><a href=\"?p=2\">«</a></li>"
            , "<li class=\"prev\"><a href=\"?p=2\">2</a></li>"
            , "<li class=\"active disabled\"><a>3</a></li>"
            , "<li class=\"next\"><a href=\"?p=4\">4</a></li>"
            , "<li class=\"next\"><a href=\"?p=4\">»</a></li>"
            , "</ul>"
            ]

        request $ do
            addGetParam "p" "4"
            setUrl $ SimpleR 10 3 3

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev\"><a href=\"?p=3\">«</a></li>"
            , "<li class=\"prev\"><a href=\"?p=2\">2</a></li>"
            , "<li class=\"prev\"><a href=\"?p=3\">3</a></li>"
            , "<li class=\"active disabled\"><a>4</a></li>"
            , "<li class=\"next disabled\"><a>»</a></li>"
            , "</ul>"
            ]

    describe "ellipsed" $ it "works" $ do
        get $ EllipsedR 10 3 3

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev disabled\"><a>«</a></li>"
            , "<li class=\"active disabled\"><a>1</a></li>"
            , "<li class=\"next\"><a href=\"?p=2\">2</a></li>"
            , "<li class=\"next\"><a href=\"?p=3\">3</a></li>"
            , "<li class=\"next\"><a href=\"?p=4\">4</a></li>"
            , "<li class=\"next\"><a href=\"?p=2\">»</a></li>"
            , "</ul>"
            ]

        get $ EllipsedR 15 3 3

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev disabled\"><a>«</a></li>"
            , "<li class=\"active disabled\"><a>1</a></li>"
            , "<li class=\"next\"><a href=\"?p=2\">2</a></li>"
            , "<li class=\"next\"><a href=\"?p=3\">3</a></li>"
            , "<li class=\"next disabled\"><a>…</a></li>"
            , "<li class=\"next\"><a href=\"?p=5\">5</a></li>"
            , "<li class=\"next\"><a href=\"?p=2\">»</a></li>"
            , "</ul>"
            ]

        request $ do
            addGetParam "p" "5"
            setUrl $ EllipsedR 15 3 3

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev\"><a href=\"?p=4\">«</a></li>"
            , "<li class=\"prev\"><a href=\"?p=1\">1</a></li>"
            , "<li class=\"prev disabled\"><a>…</a></li>"
            , "<li class=\"prev\"><a href=\"?p=3\">3</a></li>"
            , "<li class=\"prev\"><a href=\"?p=4\">4</a></li>"
            , "<li class=\"active disabled\"><a>5</a></li>"
            , "<li class=\"next disabled\"><a>»</a></li>"
            , "</ul>"
            ]

    describe "simple with page param" $ it "works" $ do
        get $ SimpleParamNameR 10 3 3 (PageParamName "page")

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev disabled\"><a>«</a></li>"
            , "<li class=\"active disabled\"><a>1</a></li>"
            , "<li class=\"next\"><a href=\"?page=2\">2</a></li>"
            , "<li class=\"next\"><a href=\"?page=3\">3</a></li>"
            , "<li class=\"next\"><a href=\"?page=2\">»</a></li>"
            , "</ul>"
            ]

        request $ do
            addGetParam "page" "3"
            setUrl $ SimpleParamNameR 10 3 3 (PageParamName "page")

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev\"><a href=\"?page=2\">«</a></li>"
            , "<li class=\"prev\"><a href=\"?page=2\">2</a></li>"
            , "<li class=\"active disabled\"><a>3</a></li>"
            , "<li class=\"next\"><a href=\"?page=4\">4</a></li>"
            , "<li class=\"next\"><a href=\"?page=4\">»</a></li>"
            , "</ul>"
            ]

        request $ do
            addGetParam "page" "4"
            setUrl $ SimpleParamNameR 10 3 3 (PageParamName "page")

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev\"><a href=\"?page=3\">«</a></li>"
            , "<li class=\"prev\"><a href=\"?page=2\">2</a></li>"
            , "<li class=\"prev\"><a href=\"?page=3\">3</a></li>"
            , "<li class=\"active disabled\"><a>4</a></li>"
            , "<li class=\"next disabled\"><a>»</a></li>"
            , "</ul>"
            ]

    describe "ellipsed with page param" $ it "works" $ do
        get $ EllipsedParamNameR 10 3 3 (PageParamName "page")

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev disabled\"><a>«</a></li>"
            , "<li class=\"active disabled\"><a>1</a></li>"
            , "<li class=\"next\"><a href=\"?page=2\">2</a></li>"
            , "<li class=\"next\"><a href=\"?page=3\">3</a></li>"
            , "<li class=\"next\"><a href=\"?page=4\">4</a></li>"
            , "<li class=\"next\"><a href=\"?page=2\">»</a></li>"
            , "</ul>"
            ]

        get $ EllipsedParamNameR 15 3 3 (PageParamName "page")

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev disabled\"><a>«</a></li>"
            , "<li class=\"active disabled\"><a>1</a></li>"
            , "<li class=\"next\"><a href=\"?page=2\">2</a></li>"
            , "<li class=\"next\"><a href=\"?page=3\">3</a></li>"
            , "<li class=\"next disabled\"><a>…</a></li>"
            , "<li class=\"next\"><a href=\"?page=5\">5</a></li>"
            , "<li class=\"next\"><a href=\"?page=2\">»</a></li>"
            , "</ul>"
            ]

        request $ do
            addGetParam "page" "5"
            setUrl $ EllipsedParamNameR 15 3 3 (PageParamName "page")

        statusIs 200
        bodyContains $ concat
            [ "<ul class=\"pagination\">"
            , "<li class=\"prev\"><a href=\"?page=4\">«</a></li>"
            , "<li class=\"prev\"><a href=\"?page=1\">1</a></li>"
            , "<li class=\"prev disabled\"><a>…</a></li>"
            , "<li class=\"prev\"><a href=\"?page=3\">3</a></li>"
            , "<li class=\"prev\"><a href=\"?page=4\">4</a></li>"
            , "<li class=\"active disabled\"><a>5</a></li>"
            , "<li class=\"next disabled\"><a>»</a></li>"
            , "</ul>"
            ]

  it "inserts" $ do
      let paramName = PageParamName "p"
          pageNumber = 1 :: Int
      setPageParameters paramName pageNumber [] `shouldBe` [("p", "1")]

  it "updates" $ do
      let paramName = PageParamName "p"
          pageNumber = 1 :: Int
      setPageParameters paramName pageNumber [("p", "foo")]
          `shouldBe` [("p", "1")]

  it "doesn't remove not-ours elements" $ property $ \(Params paramName pageNumber params) -> do
    let outputKeys =
            fst <$> setPageParameters paramName pageNumber params
        inputKeys = fst <$> params
     in all (`elem` outputKeys) inputKeys

  it "doesn't add not-ours elements" $ property $ \(Params paramName pageNumber params) -> do
      let outputKeys = fst <$> setPageParameters paramName pageNumber params
          inputKeys = fst <$> params
       in all (`elem` (unPageParamName paramName : inputKeys)) outputKeys

data Params = Params
    { paramsPageParamName :: PageParamName
    , paramsPageNumber :: Int
    , paramsParams :: [(Text, Text)]
    }
    deriving Show

instance Arbitrary Params where
    arbitrary = do
        params <- listOf $ liftArbitrary2 genText genText
        pageNumber <- getPositive <$> arbitrary
        pageParamName <- PageParamName <$> genText
        pure $ Params pageParamName pageNumber params
      where
        genText :: Gen Text
        genText = listOf (choose ('a', 'z')) <&> pack