module Main where import Network.Wai.Handler.Warp (run) import Servant import Servant.API.Cookies (SessionMap) import Test.Tasty import TestCookies (CookieAPI, cookieProps, cookieServer) import TestHeaders (HeaderAPI, headerProps, headerServer) import TestLib (testFunctionGeneric) import TestPathInfo (PathInfoAPI, pathInfoProps, pathInfoServer) import TestQueryString (QueryStrAPI, queryStrProps, queryStrServer) import TestRawPathInfo (RawPathInfoAPI, rawPathInfoProps, rawPathInfoServer) import TestRawQueryString (RawQueryStrAPI, rawQueryStrProps, rawQueryStrServer) import TestRawRequest (RawRequestAPI, rawRequestProps, rawRequestServer) import Web.ClientSession import qualified Data.Vault.Lazy as Vault type TopLevelAPI = CookieAPI :<|> HeaderAPI :<|> QueryStrAPI :<|> RawQueryStrAPI :<|> RawRequestAPI :<|> PathInfoAPI :<|> RawPathInfoAPI topLevelServer :: Key -> Server TopLevelAPI topLevelServer encKey = cookieServer encKey :<|> headerServer :<|> queryStrServer :<|> rawQueryStrServer :<|> rawRequestServer :<|> pathInfoServer :<|> rawPathInfoServer topLevelProps :: Key -> Int -> TestTree topLevelProps key port = testGroup "Main tests" [ cookieProps key port , headerProps port , queryStrProps port , rawQueryStrProps port , rawRequestProps port , pathInfoProps port , rawPathInfoProps port ] mkTestApplication :: Key -> IO Application mkTestApplication encKey = do key <- Vault.newKey :: IO (Vault.Key SessionMap) pure $ serveWithContext (Proxy @TopLevelAPI) (encKey :. key :. EmptyContext) (topLevelServer encKey) runTopLevelServer :: Key -> Int -> IO () runTopLevelServer key port = do app <- mkTestApplication key run port app main :: IO () main = do (_initKeyBS, encKey) <- randomKey testFunctionGeneric (runTopLevelServer encKey) (topLevelProps encKey) 8080