packages feed

webby-1.2.0: test/Spec.hs

import AppTests (appTests)
import qualified Data.HashMap.Strict as H
import ErrorTests (errorTests)
import Network.Wai.Internal
import Test.Tasty (TestTree, defaultMain, testGroup)
import Test.Tasty.HUnit ((@?=))
import qualified Test.Tasty.HUnit as HUnit
import Webby.Server
import Webby.Types
import Prelude

main :: IO ()
main = defaultMain tests

tests :: TestTree
tests = testGroup "Webby Tests" [matchRequestTests, errorTests, appTests]

matchRequestTests :: TestTree
matchRequestTests = testGroup "matchRequest" [unitTests]
  where
    routes1 = []
    routes2 =
      [ (RoutePattern methodGet ["api"], 1 :: Int),
        (RoutePattern methodPut ["api"], 2),
        (RoutePattern methodGet ["api", "v1"], 3)
      ]
    routes3 =
      [ (RoutePattern methodGet ["api", "vX"], 1),
        (RoutePattern methodGet ["api", ":version"], 2),
        (RoutePattern methodGet ["api", "vX", "aaa"], 3)
      ]
    routes4 =
      [ (RoutePattern methodGet ["api", ":version"], 1),
        (RoutePattern methodGet [":api", "version"], 2)
      ]
    r mthd path =
      defaultRequest
        { pathInfo = path,
          requestMethod = mthd
        }
    unitTests :: TestTree
    unitTests = HUnit.testCase "Unit tests" $ do
      let cases =
            [ (methodGet, ["api"], routes1, Nothing),
              (methodGet, ["api"], routes2, Just (H.empty, 1)),
              (methodPut, ["api"], routes2, Just (H.empty, 2)),
              (methodPost, ["api"], routes2, Nothing),
              (methodGet, ["api", "v1"], routes2, Just (H.empty, 3)),
              (methodPut, ["api", "ab"], routes2, Nothing),
              (methodPut, ["api", ""], routes2, Just (H.empty, 2)),
              (methodGet, ["api"], routes3, Nothing),
              (methodGet, ["api", "vX"], routes3, Just (H.empty, 1)),
              (methodGet, ["api", "v1"], routes3, Just (H.fromList [("version", "v1")], 2)),
              (methodGet, ["api", "vX", "aaa"], routes3, Just (H.empty, 3)),
              (methodGet, ["api", "vX", "aaa1"], routes3, Nothing),
              (methodGet, ["api", "vX", "aaa", "b"], routes3, Nothing),
              (methodGet, ["api", "version"], routes4, Just (H.fromList [("version", "version")], 1)),
              (methodGet, ["api1", "version"], routes4, Just (H.fromList [("api", "api1")], 2))
            ]
       in mapM_ (\(m, path, rs, res) -> matchRequest (r m path) rs @?= res) cases