msw bindings for ReScript (formerly known as BuckleScript in Reason)
Prerequisite: you have installed msw.
npm install -D res-msw
Or if you are using yarn:
yarn add -D res-msw
Add res-msw
to your bsconfig.json
:
...
"bs-dependencies": [
+ "res-msw"
]
...
ResMsW.MSW
is the root namespace, includes following namespaces and modules:
rest
graphql
Node
moduleServiceWorker
moduleRest
moduleGraphQL
module
setup(array(requestHandler))
server |> listen()
server |> close()
server |> resetHandlers()
server |> restoreHandlers()
server |> user(requestHandler)
rest |> get(string, (req, res, ctx) => { });
rest |> post(string, (req, res, ctx) => { });
rest |> put(string, (req, res, ctx) => { });
rest |> patch(string, (req, res, ctx) => { });
rest |> delete(string, (req, res, ctx) => { });
rest |> options(string, (req, res, ctx) => { });
setup(array(requestHandler))
worker |> start()
worker |> stop()
worker |> resetHandlers()
worker |> restoreHandlers()
worker |> user(requestHandler)
graphql |> query(string, (req, res, ctx) => { });
graphql |> mutation(string, (req, res, ctx) => { });
res |> mock(array(responseTransformer))
res |> mockOnce(array(responseTransformer))
ctx |> status(int)
ctx |> set(string, string)
ctx |> delay(int)
ctx |> fetch(req)
ctx |> text(string)
ctx |> json(Js.Json.t)
ctx |> xml(string)
res |> mock(array(responseTransformer))
res |> mockOnce(array(responseTransformer))
ctx |> status(int)
ctx |> set(string, string)
ctx |> delay(int)
ctx |> fetch(req)
ctx |> data(Js.Json.t)
ctx |> errors(array(Js.Json.t))
For more example, please refer to
MSW_node_test.re
andmocks.re
.
open ResMsw.MSW
let getRepoInfo = rest |> get("https://api.github.com/repos/:owner/:repo", (
req,
res,
ctx,
) => {
let {params} = req
let owner = params->Js.Dict.get("owner")->Belt.Option.getWithDefault("N/A")
let repo = params->Js.Dict.get("repo")->Belt.Option.getWithDefault("N/A")
res |> Rest.mock([
ctx |> Rest.status(200),
ctx |> Rest.text(`owner: ${owner}, repo: ${repo}`),
])
})
let getRepoInfoError =
rest |> get("https://api.github.com/repos/:owner/:repo", (req, res, ctx) =>
res |> Rest.mock([ctx |> Rest.status(500), ctx |> Rest.text("Oops")])
)
let server = Node.setup([getRepoInfo])
server->listen()
server->use(getRepoInfoError)
server->restoreHandlers()
server->resetHandlers()
server->close()
For more example, please refer to MSW_browser.re
and mocks.re
.
open ResMsw.MSW
let queryUserDetail = graphql |> query("GetUserDetail", (req, res, ctx) => {
let name = ("name", req.variables["name"])
let data = Js.Dict.fromList(list{name}) |> Js.Json.object_
res |> GraphQL.mock([ctx |> GraphQL.status(200), ctx |> GraphQL.data(data)])
})
let queryUserDetailError = graphql |> query("GetUserDetail", (
req,
res,
ctx,
) => {
let message = (
"message",
Js.Json.string(`This is a mocked error: ${req.variables["name"]}`),
)
let location = Js.Dict.fromList(list{
("line", Js.Json.number(1.0)),
("column", Js.Json.number(2.0)),
})
let locations = ("locations", Js.Json.objectArray([location]))
let error = Js.Dict.fromList(list{message, locations}) |> Js.Json.object_
res |> GraphQL.mock([
ctx |> GraphQL.status(200),
ctx |> GraphQL.errors([error]),
])
})
let worker = ServiceWorker.setup([queryUserDetail])
worker->start()
worker->use(GetUserDetailError)
worker->restoreHandlers()
worker->resetHandlers()
worker->stop()
npm test
this will compile and execute tests with bs-jest
Don't hesitate to open a PR with a new binding - while bumping up the amount of covered bindings in the README. There are tests, use them and write the most simple test you can think of to make sure that the bindings work correctly.