'use strict'
const flow = require('an-flow')
// Des retours d'erreur, pour tester la gestion d'erreur de nos clients
// Attention, nos tests s'attendent à trouver ça, mais ils récupèrent ce que renvoit le module http-errors !
// (pas trouvé pourquoi…)
const errors = {
400: 'Bad Request',
401: 'Unauthorized',
403: 'Forbidden',
404: 'Not Found',
418: 'I\'m a Teapot',
500: 'Internal Server Error',
503: 'Service Unavailable'
}
function controllerTestFactory (component) {
// Les routes suivantes n'existent que pour les tests, cf index.js, pour répondre à des test client par mocha
component.controller('test', function ($session, $json) {
const controller = this
// les routes d'erreurs
Object.entries(errors).forEach(([code, message]) => {
controller.all(`text/${code}`, function (context) {
context.status = Number(code)
context.plain(message)
})
controller.all(`json/${code}`, function (context) {
context.status = Number(code)
context.json({ message })
})
})
// 2 routes ok
controller.all('text/200', function (context) {
context.status = 200
context.plain('OK')
})
controller.all('json/200', function (context) {
context.status = 200
context.json({ message: 'OK' })
})
// réponse ok avec {foo:bar} en réponse
controller.all('api/foo/bar', function (context) {
$json.sendOk(context, { foo: 'bar' })
})
// réponse ok avec retard
controller.all('api/delay/:sToWait', function (context) {
const respond = () => {
$json.sendOk(context, context.post)
}
setTimeout(respond, context.arguments.sToWait * 1000)
})
// réponse KO avec le code et le message demandé
controller.all('api/error/:status/:message', function (context) {
const { status, message } = context.arguments
context.status = status
context.json({ message })
})
// une route où on throw, pour vérifier que beforeTransport fait le taf
controller.all('throw/:error', function (context) {
throw Error(context.arguments.error)
})
})
// faut aussi mettre des routes sur le préfixe /api si on veut tester des requêtes avec body
// car le body-parser json n'agit que sur ces routes
component.controller('api/test', function ($session, $json) {
let EntityPersonne
// réponse ok avec le contenu qu'on nous envoie
this.all('echo', function (context) {
const data = Object.keys(context.post).length ? context.post : undefined
$json.sendOk(context, data)
})
/**
* Connecte un utilisateur à son compte
* ATTENTION : Cette route doit exister seulement pour les tests
* @route POST /test/api/login
*/
this.post('login', function (context) {
if (!EntityPersonne) EntityPersonne = lassi.service('EntityPersonne')
const { personne: { oid, pid } } = context.post
flow().seq(function () {
if (oid) EntityPersonne.match('oid').equals(oid).grabOne(this)
else if (pid) EntityPersonne.match('pid').equals(pid).grabOne(this)
else context.restKo('personne sans oid ni pid, login impossible')
}).seq(function (personne) {
if (!personne) return context.restKo(`La personne ${oid || pid} n’existe pas`)
$session.login(context, personne)
context.rest({ message: 'Utilisateur login', personne })
}).catch(function (error) {
context.restKo(error)
})
})
/**
* Déconnecte un utilisateur
* @route GET /test/api/logout
*/
this.get('logout', function (context) {
$session.logout(context)
context.rest({ message: 'Utilisateur logout' })
})
})
}
// on ajoute ça pour les tests
controllerTestFactory.errors = errors
// et on exporte
module.exports = controllerTestFactory