Source: main/controllerTest.js


'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