Rutas en Hapi.Js (III)

Luego de agregar la ruta principal de mi API, necesito una ruta que reciba como parámetro un ID, que será el identificador de un congresista y en base a ese ID se devolverá información relacionada.

Ya que he empezado este proyecto usando lab para testing voy a empezar escribiendo el test y luego ir creando el código.
Primero creo la carpeta representative-details y dentro de ella crearé todos los archivos necesarios como son: test, ruta y handler.

Test

Empiezo creando el archivo representative.details.integration.test.js, dentro hago referencia a lab y al archivo server.js.

var assert = require('assert'),  
        Lab = require('lab'),
        lab = exports.lab = Lab.script(),
        server = require('./../server');

Ahora si el test, lo que voy a probar en este caso es que la ruta me devuelva el status code de 200 que me indica que todo está bien configurada y la ruta realmente existe.

    lab.test('should return 200', function (done) {

        var route = {

            method: 'GET',

            url: '/representatives/1'

        };

        server
            .inject(route, function (response) {

                assert.equal(200, response.statusCode);

                done();

            });

    });

Defino una ruta que hará un request de tipo GET a una url representatives/1, el número 1 representa el ID del congresista.
Ejecuto el comando npm test para correr las pruebas y obtengo lo siguiente:
hapijs fail test with lab Obtengo un fail como esperaba ya que estoy intentando hacer un request a una ruta que no existe porque no la he creado.

Ruta

Para poder hacer pasar esta prueba tengo que definir la ruta y agregarla al servidor. Creo el archivo representative.details.route.js la ruta solo va a tener la definición de una ruta y exportarla para poder ser referenciada en el archivo dónde tengo la configuración del server. Ya he escrito sobre como definir una ruta con parámetros dinámicos así que será sencillo replicarlo

var route = {

    method: 'GET',

    path: '/representative/{id}',

    handler: function (request, reply) {

        reply();

    }

};

module.exports = route;  

Ahora simplemente tengo que referenciarla en el server

var representativeDetailsRoute = require('./representative-details/representative.details.route');

server.route(representativeDetailsRoute);  

He reducido el código del archivo server.js solo para hacer claro que cambios permiten agregar esta ruta en específico.
Ahora vuelvo a ejecutar los tests

hapijs pass test with lab La ruta retorna 200 y entonces el test pasa. Pero aún no tengo la funcionalidad deseada, quiero obtener los datos de un congresista según su id.
Para obtener esta funcionalidad voy a usar un módulo open source llamado congresistas-peru.

npm install congresistas-peru -S  

Ahora en el handler simplemente creo una variable referenciando al módulo y uso el método getById que me da la información de un congresista de acuerdo al id. En este caso debo usar el id que se pasa como parámetro en el url.

        var congress = require('congresistas-peru');
        var response = reply().hold();
        var representativeId = request.params.id;

        congress.getById(representativeId, function (err, representative) {

            response.source = representative;

            response.send();

        });

Hapi.js permite acceder a los parámetros de la url a través del objeto params y usando el nombre de la variable que en este caso es id.
Ya que el método getById es asíncrono debo esperar a que termine para recién enviar la respuesta al cliente, para eso usaremos el método hold. Este método hold lo asignamos a una variable response para luego usarlo cuando deseemos enviar la respuesta al cliente.

Dentro del método getById recibimos los datos del congresista en la variable representative, este dato lo asignamos a la propiedad source del objeto response. Luego de que ya tenemos los datos recién podemos enviar la respuesta al cliente, para poder hacer esto sólo basta con llamar al método send().

Ahora el testing que comprobará si la información del congresista con id 1 está siendo recibida correctamente

    lab.test('should return the information of representative with id 1', function (done) {

        var route = {

            method: 'GET',

            url: '/representatives/1'

        };

        server
            .inject(route, function (response) {

                var representativeDetails = response.result;

                assert.equal('Justiniano Rómulo Apaza Ordóñez', representativeDetails.fullName);

                done();

            });

    }); 

Ejecutamos una vez más las pruebas y obtenemos lo siguiente

hapi test lab Listo, ya configure mi primer endpoint que devuelve información de un congresista según el id.
Como siempre el código en mi cuenta de github

https://github.com/eperedo/congress-api/tree/routes-with-url-params