const seeded = Fiona(1322672)
Assuming some kind of setup code loading Mock Service Worker
import { setupWorker, rest } from 'msw'
You can define a mock server like this...
const worker = setupWorker(
rest.get('/fake/user/:id', (request, response, ctx) => {
return response(
ctx.status(202, 'Mocked status'),
ctx.json(modelMock(request.params.id)),
)
}),
)
worker.start()
Specified routes will now be handled by the mock service worker with results generated by Fiona.
// input
fetch('/fake/user/1322672').then(r => r.json()).then(console.log)
// output
{"fullname":"Ms Eilidh Brown","color":"blue","age":98}
Assuming some kind of setup code loading Fetch Pretender
<script src="https://cdn.rawgit.com/billymoon/fetch-pretender/master/dist/pretender.js"></script>
You can define a mock server like this...
const pretender = new Pretender()
const modelMock = seed => Fiona(seed).object({
fullname: seeded => seeded.fullname(),
color: seeded => seeded.oneOf(['red', 'yellow', 'blue']),
age: seeded => seeded.number({ max: 100 })
})
pretender.get('/pretend/user/:id', request => [
200,
{ 'Content-Type': 'application/json' },
JSON.stringify(modelMock(request.params.id))
])
Calls to fetch on specified routes will now be patched to return mock results generated by Fiona.
// input
fetch('/pretend/user/1322672').then(r => r.json()).then(console.log)
// output
{"fullname":"Ms Eilidh Brown","color":"blue","age":98}
import JsonGraphqlServer from 'json-graphql-server'
const pretender = new Pretender()
const data = Fiona().object({
users: Fiona.Array(10, seeded => {
const index = seeded.info().path.slice(-1)[0]
return modelMock(index)
})
})
const server = JsonGraphqlServer({ data })
const handler = server.getHandler()
pretender.post('/graphql', async req => {
const { status, headers, body } = await handler(req)
return [status, headers, body]
})
// input
fetch('/graphql', {
method: 'POST',
body: `{"query": "query users { allUsers { fullname, age } }"}`
}).then(r => r.json()).then(console.log)
// output
{"posts":[{"fullname":"Mr Carter Andrew Campbell","color":"blue","age":83},{"fullname":"Ms Arianna Amy Clark","color":"red","age":0},{"fullname":"Dr Luke Watson Brown","color":"yellow","age":93},{"fullname":"Ms Violet Esme Niamh Smith","color":"red","age":27},{"fullname":"Mr William Mitchell-Ross","color":"yellow","age":37}]}
This example assumes you have a project with dependencies added for Fiona, express and express-http-proxy and that you have a development server running on port 3000 serving your web app.
Define an express proxy server and run with nodejs - e.g. save the snippet as `server.js` and run `node server`
// require dependencies
const Fiona = require('fiona')
const proxy = require('express-http-proxy')
const express = require('express')
// define express server
const app = express()
// define Fiona generated data handler for user api
app.use('/api/user/:id', (req, res) => {
res.end(Fiona(req.params.id).chain({
fullname: Fiona.Fullname,
age: Fiona.Number({ max: 100 })
}).json())
})
// proxy other requests to main server
app.use('/', proxy('http://localhost:3000'))
// listen on an available port
app.listen(3001, () => console.log(`mocking '/api/user/:id' and proxying 3000 to 3001`))
The proxy server (running on http://localhost:3001) will forwarding traffic to your development server (running on http://localhost:3000) except api calls to /api/user/:id
which will return generated data as json.
From the proxied web page, you can now make requests to the user api along the lines of...
// input
fetch('/api/user/1322672').then(r => r.json()).then(console.log)
// output
{"fullname":"Sir Harry Paterson-Anderson","age":5}
$ curl http://localhost:3001/api/user/1322672