module Test.Axon.Request.Handler where import Axon.Request.Parts.Class 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.Body as Response.Body import Control.Monad.Error.Class (liftEither) import Data.Bifunctor (lmap) import Data.Either (Either(..)) import Data.Map (Map) import Data.Map as Map import Data.Maybe (fromJust) import Data.URL (URL) import Data.URL as URL import Effect.Aff (Aff, error) import Effect.Class (liftEffect) import Effect.Unsafe (unsafePerformEffect) import Node.Net.SocketAddress as SocketAddress import Node.Net.Types (IPv4, IPv6, SocketAddress) import Partial.Unsafe (unsafePartial) import Test.Spec (Spec, describe, it) import Test.Spec.Assertions (shouldEqual) defaultRequest :: { headers :: Map String String , address :: Either (SocketAddress IPv4) (SocketAddress IPv6) , 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: Left $ unsafePerformEffect $ SocketAddress.newIpv4 { address: "127.0.0.1", port: 81 } , method: GET } getPerson :: Get -> Path ("people" / Int) Int -> Aff Response getPerson _ (Path id) = if id == 1 then pure $ Response.response 200 (Response.Body.stringBody "{\"name\": \"Henry\"}") Map.empty else pure $ Response.fromStatus 404 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` 200 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` 404