module Hypermedia.Datastar.PatchElementsSpec where
import Data.Text qualified as T
import Test.Hspec
import Hypermedia.Datastar
import Hypermedia.Datastar.PatchElements
import Hypermedia.Datastar.Types
spec :: Spec
spec = describe "Hypermedia.Datastar.PatchElements.toDatastarEvent" $ do
it "minimal: single-line elements, all defaults" $ do
let event =
toDatastarEvent $
patchElements "
1
"
eventType event `shouldBe` EventPatchElements
eventId event `shouldBe` Nothing
retry event `shouldBe` defaultRetryDuration
dataLines event `shouldBe` ["elements 1
"]
it "full: all options set" $ do
let event =
toDatastarEvent $
(patchElements "\n 1\n
")
{ peSelector = Just "#feed"
, peMode = Inner
, peUseViewTransition = True
, peNamespace = HtmlNs
, peEventId = Just "123"
, peRetryDuration = 2000
}
eventType event `shouldBe` EventPatchElements
eventId event `shouldBe` Just "123"
retry event `shouldBe` 2000
dataLines event
`shouldBe` [ "selector #feed"
, "mode inner"
, "useViewTransition true"
, "elements "
, "elements 1"
, "elements
"
]
it "remove: mode remove with selector, no elements" $ do
let pe = removeElements "#feed, #otherid"
event = toDatastarEvent pe
dataLines event
`shouldBe` [ "selector #feed, #otherid"
, "mode remove"
]
it "append with selector" $ do
let pe =
(patchElements "New content
")
{ peSelector = Just "#mycontainer"
, peMode = Append
}
event = toDatastarEvent pe
dataLines event
`shouldBe` [ "selector #mycontainer"
, "mode append"
, "elements New content
"
]
it "SVG namespace" $ do
let pe =
(patchElements "\n\n")
{ peSelector = Just "#vis"
, peMode = Append
, peNamespace = SvgNs
}
event = toDatastarEvent pe
dataLines event
`shouldBe` [ "selector #vis"
, "mode append"
, "namespace svg"
, "elements "
, "elements "
, "elements "
]
it "omits namespace when html (default)" $ do
let lines =
dataLines $
toDatastarEvent $
patchElements "hello
"
any (T.isPrefixOf "namespace") lines `shouldBe` False
it "omits mode when Outer (default)" $ do
let pe = patchElements "hello
"
event = toDatastarEvent pe
lines = dataLines event
any (T.isPrefixOf "mode") lines `shouldBe` False
it "politely ignores empty element strings" $ do
let lines =
dataLines $
toDatastarEvent $
patchElements ""
lines `shouldBe` []