packages feed

network-uri-template-0.1.0.0: test/Network/URI/Template/Internal/TemplatePartSpec.hs

-- |
--
-- Module      : Network.URI.Template.Internal.TemplatePartSpec
-- Copyright   : (c) 2025 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Network.URI.Template.Internal.TemplatePartSpec
  ( spec
  ) where

import Prelude

import Network.URI.Template.Internal.Expression
import Network.URI.Template.Internal.Operator
import Network.URI.Template.Internal.Parse
import Network.URI.Template.Internal.TemplatePart
import Network.URI.Template.Internal.VarSpec
import Network.URI.Template.Test
import Test.Hspec

spec :: Spec
spec = do
  describe "templatePartP" $ do
    it "parses a URI with query variable"
      $ assertParse
        (some templatePartP)
        "foo/{?var}&bat"
        [ Lit "foo/"
        , Exp
            $ Expression
              { operator = Just Query
              , variableList = [VarSpec {name = "var", modifier = Nothing}]
              }
        , Lit "&bat"
        ]

    it "parses a template with literal at end of input" $ do
      assertParse
        (some templatePartP <* eof)
        "{&who}X"
        [ Exp
            $ Expression
              { operator = Just QueryContinuation
              , variableList = [VarSpec {name = "who", modifier = Nothing}]
              }
        , Lit "X"
        ]

    it "parses a template at end of line" $ do
      assertParse
        (sepEndBy (some templatePartP) eol <* eof)
        "{&who}X\n"
        [
          [ Exp
              $ Expression
                { operator = Just QueryContinuation
                , variableList = [VarSpec {name = "who", modifier = Nothing}]
                }
          , Lit "X"
          ]
        ]

    it "parses a template within RFC examples" $ do
      let
        p =
          (,)
            <$> (hspace1 *> some templatePartP)
            <*> (hspace1 *> manyTill anySingle eof)

        input = "  {&who}  &who=fred"
        expected =
          (
            [ Exp
                $ Expression
                  { operator = Just QueryContinuation
                  , variableList = [VarSpec {name = "who", modifier = Nothing}]
                  }
            ]
          , "&who=fred"
          )

      assertParse p input expected