Files
purescript-axon/test/Test/Axon.Request.Handler.purs
2025-03-01 15:50:41 -06:00

72 lines
2.3 KiB
Plaintext

module Test.Axon.Request.Handler where
import Axon.Request.Parts.Class (Get, Path(..))
import Prelude
import Axon.Request (Body)
import Axon.Request as Request
import Axon.Request.Handler as Handle
import Axon.Request.Handler.Default (notFound)
import Axon.Request.Method (Method(..))
import Axon.Request.Parts.Path (type (/))
import Axon.Response (Response)
import Axon.Response as Response
import Axon.Response.Construct (toResponse)
import Axon.Response.Construct as Response.Construct
import Axon.Response.Status as Status
import Control.Monad.Error.Class (liftEither)
import Data.Bifunctor (lmap)
import Data.Map (Map)
import Data.Map as Map
import Data.Maybe (fromJust)
import Data.Net.SocketAddress (SocketAddress)
import Data.Net.SocketAddress (SocketAddress(..)) as SocketAddress
import Data.URL (URL)
import Data.URL as URL
import Effect.Aff (Aff, error)
import Effect.Class (liftEffect)
import Partial.Unsafe (unsafePartial)
import Test.Spec (Spec, describe, it)
import Test.Spec.Assertions (shouldEqual)
defaultRequest ::
{ headers :: Map String String
, address :: SocketAddress
, url :: URL
, method :: Method
, body :: Body
}
defaultRequest =
{ body: Request.BodyEmpty
, url: URL.fromString "http://localhost:80/" # unsafePartial fromJust
, headers: Map.singleton "content-type" "application/json"
, address: SocketAddress.IPv4 "127.0.0.1" 81
, method: GET
}
getPerson :: Get -> Path ("people" / Int) Int -> Aff Response
getPerson _ (Path id) =
if id == 1 then
liftEffect $ toResponse $ Response.Construct.Json { name: "Henry" }
else
liftEffect $ toResponse $ Status.notFound
spec :: Spec Unit
spec = describe "Handler" do
it "responds ok" do
req <- liftEffect $ Request.make $ defaultRequest
{ url = defaultRequest.url `URL.(/)` "people" `URL.(/)` "1" }
rep <- Handle.invokeHandler (getPerson `Handle.or` notFound) req
<#> lmap (error <<< show)
>>= liftEither
Response.status rep `shouldEqual` Status.ok
it "responds not found" do
req <- liftEffect $ Request.make $ defaultRequest
{ url = defaultRequest.url `URL.(/)` "people" `URL.(/)` "1"
, method = PUT
}
rep <- Handle.invokeHandler (getPerson `Handle.or` notFound) req
<#> lmap (error <<< show)
>>= liftEither
Response.status rep `shouldEqual` Status.notFound