{-# 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 [ "" ] request $ do addGetParam "p" "3" setUrl $ SimpleR 10 3 3 statusIs 200 bodyContains $ concat [ "" ] request $ do addGetParam "p" "4" setUrl $ SimpleR 10 3 3 statusIs 200 bodyContains $ concat [ "" ] describe "ellipsed" $ it "works" $ do get $ EllipsedR 10 3 3 statusIs 200 bodyContains $ concat [ "" ] get $ EllipsedR 15 3 3 statusIs 200 bodyContains $ concat [ "" ] request $ do addGetParam "p" "5" setUrl $ EllipsedR 15 3 3 statusIs 200 bodyContains $ concat [ "" ] describe "simple with page param" $ it "works" $ do get $ SimpleParamNameR 10 3 3 (PageParamName "page") statusIs 200 bodyContains $ concat [ "" ] request $ do addGetParam "page" "3" setUrl $ SimpleParamNameR 10 3 3 (PageParamName "page") statusIs 200 bodyContains $ concat [ "" ] request $ do addGetParam "page" "4" setUrl $ SimpleParamNameR 10 3 3 (PageParamName "page") statusIs 200 bodyContains $ concat [ "" ] describe "ellipsed with page param" $ it "works" $ do get $ EllipsedParamNameR 10 3 3 (PageParamName "page") statusIs 200 bodyContains $ concat [ "" ] get $ EllipsedParamNameR 15 3 3 (PageParamName "page") statusIs 200 bodyContains $ concat [ "" ] request $ do addGetParam "page" "5" setUrl $ EllipsedParamNameR 15 3 3 (PageParamName "page") statusIs 200 bodyContains $ concat [ "" ] 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