yesod-filter-0.1.0.0: test/Yesod/Filter/THSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Yesod.Filter.THSpec (spec) where
import Data.Text (Text)
import Test.Hspec
import Yesod.Persist (Filter, SelectOpt (Asc, Desc), (!=.), (<.), (<=.), (==.),
(>.), (>=.))
import Yesod.Filter.TH
import Yesod.Filter.TestTypes
$(mkToFilterValueInstances "Foo")
spec :: Spec
spec = do
describe "availableFiltersE" $ do
it "returns [] for defaultFiltering" $ do
let availableFilters = $(availableFiltersE "Foo" defaultFiltering)
buildFilters "foo" availableFilters `shouldSatisfy` null
it "returns [(\"ctxt\", Just $ FooCtxt ==. \"foo\")] for defaultFiltering {filterDefs = [FilterDef \"ctxt\" [AutoParam EqOp]]}" $ do
let availableFilters = $(availableFiltersE "Foo" $ defaultFiltering {filterDefs = [FilterDef "ctxt" [AutoParam EqOp]]})
buildFilters "foo" availableFilters `shouldBe` [("ctxt", Just $ FooCtxt ==. "foo")]
it "returns [(\"ctxt\", Just $ FooCtxt ==. \"foo\")] for SimpleFiltering [FilterDef \"ctxt\" [AutoParam EqOp]" $ do
let availableFilters = $(availableFiltersE "Foo" $ SimpleFiltering [FilterDef "ctxt" [AutoParam EqOp]])
buildFilters "foo" availableFilters `shouldBe` [("ctxt", Just $ FooCtxt ==. "foo")]
it "returns [] for NoFiltering" $ do
let availableFilters = $(availableFiltersE "Foo" NoFiltering)
buildFilters "foo" availableFilters `shouldSatisfy` null
it "returns filters consists of all operators other than IsNullOp for defaultFilterParams" $ do
let availableFilters = $(availableFiltersE "Foo" $ defaultFiltering { filterDefs =
[ FilterDef "ctxt" defaultFilterParams
, FilterDef "mtxt" defaultFilterParams
]})
buildFilters "foo" availableFilters `shouldMatchList`
[ ("ctxt", Just $ FooCtxt ==. "foo")
, ("ctxt__ne", Just $ FooCtxt !=. "foo")
, ("ctxt__gt", Just $ FooCtxt >. "foo")
, ("ctxt__lt", Just $ FooCtxt <. "foo")
, ("ctxt__ge", Just $ FooCtxt >=. "foo")
, ("ctxt__le", Just $ FooCtxt <=. "foo")
, ("mtxt", Just $ FooMtxt ==. Just "foo")
, ("mtxt__ne", Just $ FooMtxt !=. Just "foo")
, ("mtxt__gt", Just $ FooMtxt >. Just "foo")
, ("mtxt__lt", Just $ FooMtxt <. Just "foo")
, ("mtxt__ge", Just $ FooMtxt >=. Just "foo")
, ("mtxt__le", Just $ FooMtxt <=. Just "foo")
]
it "returns filters with the parameter name appended with the default suffix for AutoParam" $ do
let availableFilters = $(availableFiltersE "Foo" $ defaultFiltering { filterDefs =
[ FilterDef "mbol"
[ AutoParam EqOp
, AutoParam NeOp
, AutoParam GtOp
, AutoParam LtOp
, AutoParam GeOp
, AutoParam LeOp
, AutoParam IsNullOp
]]})
buildFilters "True" availableFilters `shouldBe`
[ ("mbol", Just $ FooMbol ==. Just True)
, ("mbol__ne", Just $ FooMbol !=. Just True)
, ("mbol__gt", Just $ FooMbol >. Just True)
, ("mbol__lt", Just $ FooMbol <. Just True)
, ("mbol__ge", Just $ FooMbol >=. Just True)
, ("mbol__le", Just $ FooMbol <=. Just True)
, ("mbol__isnull", Just $ FooMbol ==. Nothing)
]
it "returns filters with the specified parameter name for CustomParam" $ do
let availableFilters = $(availableFiltersE "Foo" $ defaultFiltering { filterDefs =
[ FilterDef "mbol"
[ CustomParam EqOp "foo"
, CustomParam NeOp "bar"
, CustomParam GtOp "baz"
, CustomParam LtOp "qux"
, CustomParam GeOp "quux"
, CustomParam LeOp "corge"
, CustomParam IsNullOp "grault"
]]})
buildFilters "True" availableFilters `shouldBe`
[ ("foo", Just $ FooMbol ==. Just True)
, ("bar", Just $ FooMbol !=. Just True)
, ("baz", Just $ FooMbol >. Just True)
, ("qux", Just $ FooMbol <. Just True)
, ("quux", Just $ FooMbol >=. Just True)
, ("corge", Just $ FooMbol <=. Just True)
, ("grault", Just $ FooMbol ==. Nothing)
]
describe "defaultOrderByE" $ do
it "returns Nothing for defaultSorting" $ do
let defaultOrderBy = $(defaultOrderByE "Foo" defaultSorting)
defaultOrderBy `shouldBe` (Nothing :: Maybe (SelectOpt Foo))
it "returns Just (Asc FooCtxt) for defaultSorting {ORDERBY \"ctxt\" ASC}" $ do
let defaultOrderBy = $(defaultOrderByE "Foo" defaultSorting { defaultOrdering = ORDERBY "ctxt" ASC })
defaultOrderBy `shouldBe` Just (Asc FooCtxt)
it "returns Just (Desc FooCtxt) for AllowSorting \"\" [] $ ORDERBY \"ctxt\" DESC" $ do
let defaultOrderBy = $(defaultOrderByE "Foo" $ AllowSorting "" [] $ ORDERBY "ctxt" DESC)
defaultOrderBy `shouldBe` Just (Desc FooCtxt)
it "returns Nothing for AllowSorting \"\" [] NaturalOrdering" $ do
let defaultOrderBy = $(defaultOrderByE "Foo" $ AllowSorting "" [] NaturalOrdering)
defaultOrderBy `shouldBe` (Nothing :: Maybe (SelectOpt Foo))
it "returns Nothing for DisallowSorting" $ do
let defaultOrderBy = $(defaultOrderByE "Foo" DisallowSorting)
defaultOrderBy `shouldBe` (Nothing :: Maybe (SelectOpt Foo))
describe "availableOrderBysE" $ do
it "returns [] for defaultSorting" $ do
let availableOrderBys = $(availableOrderBysE "Foo" defaultSorting)
availableOrderBys `shouldBe` ([] :: [(Text, SelectOpt Foo)])
it "returns [(\"ctxt\", Asc FooCtxt), (\"-ctxt\", Desc FooCtxt)] for defaultSorting { sortFields = [\"ctxt\"] }" $ do
let availableOrderBys = $(availableOrderBysE "Foo" defaultSorting { sortFields = ["ctxt"] })
availableOrderBys `shouldBe` [("ctxt", Asc FooCtxt), ("-ctxt", Desc FooCtxt)]
it "returns [(\"ctxt\", Asc FooCtxt), (\"-ctxt\", Desc FooCtxt)] for AllowSorting \"\" [\"ctxt\"] NaturalOrdering" $ do
let availableOrderBys = $(availableOrderBysE "Foo" $ AllowSorting "" ["ctxt"] NaturalOrdering)
availableOrderBys `shouldBe` [("ctxt", Asc FooCtxt), ("-ctxt", Desc FooCtxt)]
it "returns [] for sortFields = []" $ do
let availableOrderBys = $(availableOrderBysE "Foo" defaultSorting { sortFields = [] })
availableOrderBys `shouldBe` ([] :: [(Text, SelectOpt Foo)])
it "returns multiple orderBys for multiple sort fields" $ do
let availableOrderBys = $(availableOrderBysE "Foo" defaultSorting { sortFields = ["ctxt", "cint", "mday"] })
availableOrderBys `shouldMatchList`
[ ("ctxt", Asc FooCtxt), ("-ctxt", Desc FooCtxt)
, ("cint", Asc FooCint), ("-cint", Desc FooCint)
, ("mday", Asc FooMday), ("-mday", Desc FooMday)
]
it "returns [] for DisallowSorting" $ do
let availableOrderBys = $(availableOrderBysE "Foo" DisallowSorting)
availableOrderBys `shouldBe` ([] :: [(Text, SelectOpt Foo)])
buildFilters :: Text -> [(Text, Text -> Maybe (Filter Foo))] -> [(Text, Maybe (Filter Foo))]
buildFilters v = map (\(p, f) -> (p, f v))