const proxyquire = require('proxyquire').noCallThru(); const libpostal = require('../../../controller/structured_libpostal'); const _ = require('lodash'); const mock_logger = require('pelias-mock-logger'); module.exports.tests = {}; module.exports.tests.interface = (test, common) => { test('valid interface', (t) => { t.equal(typeof libpostal, 'function', 'libpostal is a function'); t.equal(typeof libpostal(), 'function', 'libpostal returns a controller'); t.end(); }); }; module.exports.tests.early_exit_conditions = (test, common) => { test('should_execute returning false should not call service', t => { const service = () => { t.fail('service should not have been called'); }; const should_execute = (req) => { // req and res should be passed to should_execute t.deepEquals(req, { clean: { text: 'original query' } }); return false; }; const controller = libpostal(service, should_execute); const req = { clean: { text: 'original query' } }; controller(req, undefined, () => { t.deepEquals(req, { clean: { text: 'original query' } }, 'req should not have been modified'); t.end(); }); }); }; module.exports.tests.error_conditions = (test, common) => { test('service returning error should append and not modify req.clean', t => { const service = (req, callback) => { callback('libpostal service error', []); }; const controller = libpostal(service, () => true); const req = { clean: { text: 'original query' }, errors: [] }; controller(req, undefined, () => { t.deepEquals(req, { clean: { text: 'original query' }, errors: ['libpostal service error'] }, 'req should not have been modified'); t.end(); }); }); }; // module.exports.tests.failure_conditions = (test, common) => { // test('service returning 2 or more of a label should return undefined and log message', t => { // const logger = mock_logger(); // // const service = (req, callback) => { // const response = [ // { // label: 'road', // value: 'road value 1' // }, // { // label: 'city', // value: 'city value' // }, // { // label: 'road', // value: 'road value 2' // } // ]; // // callback(null, response); // }; // // const controller = proxyquire('../../../controller/libpostal', { // 'pelias-logger': logger // })(service, () => true); // // const req = { // clean: { // text: 'query value' // }, // errors: [] // }; // // controller(req, undefined, () => { // t.ok(logger.isWarnMessage('discarding libpostal parse of \'query value\' due to duplicate field assignments')); // // t.deepEquals(req, { // clean: { // text: 'query value' // }, // errors: [] // }, 'req should not have been modified'); // // t.end(); // // }); // // }); // // test('service returning empty array should not set parsed_text or parser', t => { // const logger = mock_logger(); // // const service = (req, callback) => { // callback(null, []); // }; // // const controller = proxyquire('../../../controller/libpostal', { // 'pelias-logger': logger // })(service, () => true); // // const req = { // clean: { // text: 'query value' // }, // errors: [] // }; // // controller(req, undefined, () => { // t.deepEquals(req, { // clean: { // text: 'query value' // }, // errors: [] // }, 'req should not have been modified'); // // t.end(); // // }); // // }); // // }; // module.exports.tests.success_conditions = (test, common) => { test('service returning house_number should set req.clean.parsed_text.', t => { const service = (req, callback) => { const response = [ { label: 'house_number', value: 'house_number value' }, { label: 'postcode', value: 'postcode value' } ]; callback(null, response); }; const controller = libpostal(service, () => true); const req = { clean: { parsed_text: { address: 'other value house_number value street value' } }, errors: [] }; controller(req, undefined, () => { t.deepEquals(req, { clean: { parsed_text: { number: 'house_number value', street: 'other value street value' } }, errors: [] }, 'req should not have been modified'); t.end(); }); }); test('service returning postcode should set req.clean.parsed_text.', t => { const service = (req, callback) => { const response = [ { label: 'postcode', value: 'postcode value' } ]; callback(null, response); }; const controller = libpostal(service, () => true); const req = { clean: { parsed_text: { address: 'other value postcode value street value' } }, errors: [] }; controller(req, undefined, () => { t.deepEquals(req, { clean: { parsed_text: { number: 'postcode value', street: 'other value street value' } }, errors: [] }, 'req should not have been modified'); t.end(); }); }); test('service returning neither house_number nor postcode should not set req.clean.parsed_text.number', t => { const service = (req, callback) => { const response = [ { label: 'city', value: 'city value' } ]; callback(null, response); }; const controller = libpostal(service, () => true); const req = { clean: { parsed_text: { address: 'street value' } }, errors: [] }; controller(req, undefined, () => { t.deepEquals(req, { clean: { parsed_text: { street: 'street value' } }, errors: [] }, 'req should not have been modified'); t.end(); }); }); test('service returning house_number and unit should set req.clean.parsed_text.unit', t => { const service = (req, callback) => { const response = [ { label: 'road', value: 'the street' }, { label: 'house_number', value: '22' }, { label: 'unit', value: '1 th' } ]; callback(null, response); }; const controller = libpostal(service, () => true); const req = { clean: { parsed_text: { address: 'the street 22 1 th' } }, errors: [] }; controller(req, undefined, () => { t.deepEquals(req, { clean: { parsed_text: { street: 'the street', number: '22', unit: '1 th' } }, errors: [] }, 'req should have been modified'); t.end(); }); }); // test('service returning valid response should convert and append', t => { // const service = (req, callback) => { // const response = [ // { // label: 'island', // value: 'island value' // }, // { // label: 'category', // value: 'category value' // }, // { // label: 'house', // value: 'house value' // }, // { // label: 'house_number', // value: 'house_number value' // }, // { // label: 'road', // value: 'road value' // }, // { // label: 'suburb', // value: 'suburb value' // }, // { // label: 'city_district', // value: 'city_district value' // }, // { // label: 'city', // value: 'city value' // }, // { // label: 'state_district', // value: 'state_district value' // }, // { // label: 'state', // value: 'state value' // }, // { // label: 'postcode', // value: 'postcode value' // }, // { // label: 'country', // value: 'country value' // } // ]; // // callback(null, response); // }; // // const controller = libpostal(service, () => true); // // const req = { // clean: { // text: 'original query' // }, // errors: [] // }; // // controller(req, undefined, () => { // t.deepEquals(req, { // clean: { // text: 'original query', // parser: 'libpostal', // parsed_text: { // island: 'island value', // category: 'category value', // query: 'house value', // number: 'house_number value', // street: 'road value', // neighbourhood: 'suburb value', // borough: 'city_district value', // city: 'city value', // county: 'state_district value', // state: 'state value', // postalcode: 'postcode value', // country: 'country value' // } // }, // errors: [] // }, 'req should not have been modified'); // // t.end(); // // }); // // }); // // test('ISO-2 country should be converted to ISO-3', t => { // const service = (req, callback) => { // const response = [ // { // label: 'country', // value: 'ca' // } // ]; // // callback(null, response); // }; // // const controller = libpostal(service, () => true); // // const req = { // clean: { // text: 'original query' // }, // errors: [] // }; // // controller(req, undefined, () => { // t.deepEquals(req, { // clean: { // text: 'original query', // parser: 'libpostal', // parsed_text: { // country: 'CAN' // } // }, // errors: [] // }, 'req should not have been modified'); // // t.end(); // // }); // // }); // }; module.exports.all = (tape, common) => { function test(name, testFunction) { return tape(`GET /libpostal ${name}`, testFunction); } for( const testCase in module.exports.tests ){ module.exports.tests[testCase](test, common); } };