|
1 | 1 | {-# LANGUAGE OverloadedStrings #-} |
| 2 | + |
2 | 3 | module Yesod.Paginator.WidgetsSpec |
3 | 4 | ( spec |
4 | 5 | ) where |
5 | 6 |
|
| 7 | +import Data.Functor ((<&>)) |
6 | 8 | import SpecHelper |
| 9 | +import Test.Hspec.QuickCheck |
| 10 | +import Test.QuickCheck |
7 | 11 |
|
8 | 12 | spec :: Spec |
9 | | -spec = withApp $ do |
| 13 | +spec = integrationSpecs >> setPageParametersSpecs |
| 14 | + |
| 15 | +integrationSpecs :: Spec |
| 16 | +integrationSpecs = withApp $ do |
10 | 17 | describe "simple" $ it "works" $ do |
11 | 18 | get $ SimpleR 10 3 3 |
12 | 19 |
|
@@ -189,22 +196,47 @@ spec = withApp $ do |
189 | 196 | , "</ul>" |
190 | 197 | ] |
191 | 198 |
|
192 | | - describe "buildParams" $ it "works" $ do |
193 | | - let pageParamName = PageParamName "p" |
194 | | - pageNumber :: Int |
195 | | - pageNumber = 3 |
196 | | - params :: [(Text, Text)] |
197 | | - params = |
198 | | - [ ("p", "2") |
199 | | - , ("p", "3") |
200 | | - , ("foo", "bar") |
201 | | - , ("ids[]", "1") |
202 | | - , ("ids[]", "2") |
203 | | - ] |
204 | | - |
205 | | - buildParams pageParamName pageNumber params |
206 | | - `shouldBe` [ ("p", "3") |
207 | | - , ("foo", "bar") |
208 | | - , ("ids[]", "1") |
209 | | - , ("ids[]", "2") |
210 | | - ] |
| 199 | +data Params = Params |
| 200 | + { paramsPageParamName :: PageParamName |
| 201 | + , paramsPageNumber :: Int |
| 202 | + , paramsParams :: [(Text, Text)] |
| 203 | + } |
| 204 | + deriving Show |
| 205 | + |
| 206 | +instance Arbitrary Params where |
| 207 | + arbitrary = do |
| 208 | + params <- listOf $ liftArbitrary2 genText genText |
| 209 | + pageNumber <- getPositive <$> arbitrary |
| 210 | + pageParamName <- PageParamName <$> genText |
| 211 | + pure $ Params pageParamName pageNumber params |
| 212 | + where |
| 213 | + genText :: Gen Text |
| 214 | + genText = listOf (choose ('a', 'z')) <&> pack |
| 215 | + |
| 216 | + |
| 217 | +setPageParametersSpecs :: Spec |
| 218 | +setPageParametersSpecs = describe "setPageParameters" $ do |
| 219 | + it "inserts" $ do |
| 220 | + let paramName = PageParamName "p" |
| 221 | + pageNumber = 1 :: Int |
| 222 | + setPageParameters paramName pageNumber [] `shouldBe` [("p", "1")] |
| 223 | + |
| 224 | + it "updates" $ do |
| 225 | + let paramName = PageParamName "p" |
| 226 | + pageNumber = 1 :: Int |
| 227 | + setPageParameters paramName pageNumber [("p", "foo")] |
| 228 | + `shouldBe` [("p", "1")] |
| 229 | + |
| 230 | + prop "doesn't remove not-ours elements" $ do |
| 231 | + Params paramName pageNumber params <- arbitrary |
| 232 | + let outputKeys = fst <$> setPageParameters paramName pageNumber params |
| 233 | + inputKeys = fst <$> params |
| 234 | + pure $ outputKeys `shouldIncludeAll` inputKeys |
| 235 | + |
| 236 | + prop "doesn't add not-ours elements" $ do |
| 237 | + Params paramName pageNumber params <- arbitrary |
| 238 | + let outputKeys = fst <$> setPageParameters paramName pageNumber params |
| 239 | + inputKeys = fst <$> params |
| 240 | + pure |
| 241 | + $ (unPageParamName paramName : inputKeys) |
| 242 | + `shouldIncludeAll` outputKeys |
0 commit comments