packages feed

datastar-hs-0.1.0.1: test/Hypermedia/Datastar/ExecuteScriptSpec.hs

module Hypermedia.Datastar.ExecuteScriptSpec (spec) where

import Test.Hspec

import Hypermedia.Datastar.ExecuteScript
import Hypermedia.Datastar.Types

spec :: Spec
spec = describe "Hypermedia.Datastar.ExecuteScript.toDatastarEvent" $ do
  it "minimal: single-line script with auto-remove" $ do
    let event = toDatastarEvent $ executeScript "console.log('Here')"

    eventType event `shouldBe` EventPatchElements
    eventId event `shouldBe` Nothing
    retry event `shouldBe` defaultRetryDuration
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script data-effect=\"el.remove()\">console.log('Here')</script>"
                 ]

  it "full: all options set" $ do
    let pAutoRemove = True
        pAttrs = ["type=\"application/javascript\""]
        pEventId = Just "123"
        pRetryDuration = 2000
        es =
          (executeScript "console.log('Here')")
            { esAutoRemove = pAutoRemove
            , esAttributes = pAttrs
            , esEventId = pEventId
            , esRetryDuration = pRetryDuration
            }
        event = toDatastarEvent es

    eventType event `shouldBe` EventPatchElements
    eventId event `shouldBe` pEventId
    retry event `shouldBe` pRetryDuration
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script data-effect=\"el.remove()\" type=\"application/javascript\">console.log('Here')</script>"
                 ]

  it "auto-remove disabled" $ do
    let es = (executeScript "alert(1)"){esAutoRemove = False}
        event = toDatastarEvent es
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script>alert(1)</script>"
                 ]

  it "multi-line script" $ do
    let es = executeScript "var x = 1;\nconsole.log(x);"
        event = toDatastarEvent es
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script data-effect=\"el.remove()\">"
                 , "elements var x = 1;"
                 , "elements console.log(x);"
                 , "elements </script>"
                 ]

  it "multi-line script with three lines" $ do
    let es = executeScript "var x = 1;\nvar y = 2;\nconsole.log(x + y);"
        event = toDatastarEvent es
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script data-effect=\"el.remove()\">"
                 , "elements var x = 1;"
                 , "elements var y = 2;"
                 , "elements console.log(x + y);"
                 , "elements </script>"
                 ]

  it "empty script" $ do
    let es = executeScript ""
        event = toDatastarEvent es
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script data-effect=\"el.remove()\"></script>"
                 ]

  it "multiple attributes" $ do
    let es =
          (executeScript "go()")
            { esAttributes = ["type=\"module\"", "defer"]
            }
        event = toDatastarEvent es
    dataLines event
      `shouldBe` [ "selector body"
                 , "mode append"
                 , "elements <script data-effect=\"el.remove()\" type=\"module\" defer>go()</script>"
                 ]