File: BaseUrlSpec.hs

package info (click to toggle)
haskell-servant-client-core 0.20.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 188 kB
  • sloc: haskell: 1,214; makefile: 6
file content (81 lines) | stat: -rw-r--r-- 2,848 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Servant.Client.Core.Internal.BaseUrlSpec (spec) where


import           Control.DeepSeq
import           Prelude ()
import           Prelude.Compat
import           Test.Hspec
import           Test.QuickCheck

import           Servant.Client.Core.BaseUrl

spec :: Spec
spec = do
  let parse = parseBaseUrl :: String -> Maybe BaseUrl
  describe "showBaseUrl" $ do
    it "shows a BaseUrl" $ do
      showBaseUrl (BaseUrl Http "foo.com" 80 "") `shouldBe` "http://foo.com"
    it "shows a https BaseUrl" $ do
      showBaseUrl (BaseUrl Https "foo.com" 443 "") `shouldBe` "https://foo.com"
    it "shows the path of a BaseUrl" $ do
      showBaseUrl (BaseUrl Http "foo.com" 80 "api") `shouldBe` "http://foo.com/api"
    it "shows the path of an https BaseUrl" $ do
      showBaseUrl (BaseUrl Https "foo.com" 443 "api") `shouldBe` "https://foo.com/api"
    it "handles leading slashes in path" $ do
      showBaseUrl (BaseUrl Https "foo.com" 443 "/api") `shouldBe` "https://foo.com/api"

  describe "httpBaseUrl" $ do
    it "allows to construct default http BaseUrls" $ do
      BaseUrl Http "bar" 80 "" `shouldBe` BaseUrl Http "bar" 80 ""

  describe "parseBaseUrl" $ do
    it "is total" $ do
      property $ \ string ->
        deepseq (fmap show (parse string )) True

    it "is the inverse of showBaseUrl" $ do
      property $ \ baseUrl -> counterexample (showBaseUrl baseUrl) $
        parse (showBaseUrl baseUrl) === Just baseUrl

    context "trailing slashes" $ do
      it "allows trailing slashes" $ do
        parse "foo.com/" `shouldBe` Just (BaseUrl Http "foo.com" 80 "")

      it "allows trailing slashes in paths" $ do
        parse "foo.com/api/" `shouldBe` Just (BaseUrl Http "foo.com" 80 "api")

    context "urls without scheme" $ do
      it "assumes http" $ do
        parse "foo.com" `shouldBe` Just (BaseUrl Http "foo.com" 80 "")

      it "allows port numbers" $ do
        parse "foo.com:8080" `shouldBe` Just (BaseUrl Http "foo.com" 8080 "")

    it "can parse paths" $ do
      parse "http://foo.com/api" `shouldBe` Just (BaseUrl Http "foo.com" 80 "api")

    it "rejects ftp urls" $ do
      parse "ftp://foo.com" `shouldBe` Nothing

instance Arbitrary BaseUrl where
  arbitrary = BaseUrl <$>
    elements [Http, Https] <*>
    hostNameGen <*>
    portGen <*>
    pathGen
   where
    letters = ['a' .. 'z'] ++ ['A' .. 'Z']
    -- this does not perfectly mirror the url standard, but I hope it's good
    -- enough.
    hostNameGen = do
      first <- elements letters
      middle <- listOf1 $ elements (letters ++ ['0' .. '9'] ++ ['.', '-'])
      last' <- elements letters
      return (first : middle ++ [last'])
    portGen = frequency $
      (1, return 80) :
      (1, return 443) :
      (1, choose (1, 20000)) :
      []
    pathGen = listOf1 . elements $ letters