@@ -8,6 +8,7 @@
88{-# LANGUAGE RankNTypes #-}
99{-# LANGUAGE RecordWildCards #-}
1010{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE TypeApplications #-}
1112{-# LANGUAGE NoMonomorphismRestriction #-}
1213{-# OPTIONS_GHC -fno-warn-orphans #-}
1314
@@ -26,13 +27,16 @@ import qualified Data.ByteString.Lazy as BL
2627import qualified Data.CaseInsensitive as CI
2728import Data.Either (isRight)
2829import qualified Data.List.NonEmpty as NE
29−import Data.Maybe (fromJust, fromMaybe, isNothing)
30+import Data.Maybe (fromJust, fromMaybe, isJust, isNothing)
3031import Data.Proxy
3132import Data.Text (Text)
3233import qualified Data.Text as T
3334import qualified Data.Text.Encoding as T
3435import Data.Time
36+import Data.Typeable (Typeable, eqT)
3537import GHC.Generics
38+import qualified Language.Haskell.TH as TH
39+import qualified Language.Haskell.TH.Quote as TH
3640import qualified Network.HTTP.Client as L
3741import Network.HTTP.Req
3842import qualified Network.HTTP.Types as Y
@@ -409,6 +413,19 @@ spec = do
409413 request <- req_ GET url NoReqBody (httpVersion major minor)
410414 L.requestVersion request `shouldBe` Y.HttpVersion major minor
411415
416+ describe "quasiquoter" $ do
417+ it "works for valid urls" $
418+ -- Doing it this way instead of just checking if [urlQ|...|] :: (Url
419+ -- 'Https, Option _) type checks, so we can catch if the type of scheme
420+ -- is unspecified.
421+ let testTypeOfQuoterResult ::
422+ forall a s. Typeable a => (a, Option s) -> Bool
423+ testTypeOfQuoterResult _ = isJust $ eqT @a @(Url 'Https)
424+ in property $ testTypeOfQuoterResult [urlQ|https://example.org/|]
425+ it "doesn't work for invalid urls"
426+ $ property
427+ $ TH.runQ (TH.quoteExp urlQ "not a url") `shouldThrow` anyIOException
428+
412429----------------------------------------------------------------------------
413430-- Instances
414431