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` []