@ -1,16 +1,10 @@
var service = require ( '../../../service/search' ) ,
mockBackend = require ( '../mock/backend' ) ;
const proxyquire = require ( 'proxyquire' ) . noCallThru ( ) ;
var example _valid _es _query = { body : { a : 'b' } , index : 'pelias' } ;
module . exports . tests = { } ;
module . exports . tests . interface = function ( test , common ) {
test ( 'valid interface' , function ( t ) {
var service = proxyquire ( '../../../service/mget ' , {
module . exports . tests . interface = ( test , common ) => {
test ( 'valid interface' , ( t ) => {
var service = proxyquire ( '../../../service/search ' , {
'pelias-logger' : {
get : ( section ) => {
t . equal ( section , 'api' ) ;
@ -24,89 +18,344 @@ module.exports.tests.interface = function(test, common) {
} ) ;
} ;
// functionally test service
module . exports . tests . functional _success = function ( test , common ) {
var expected = [
{
_id : 'myid1' , _type : 'mytype1' ,
_score : 10 ,
_matched _queries : [ 'query 1' , 'query 2' ] ,
value : 1 ,
center _point : { lat : 100.1 , lon : - 50.5 } ,
name : { default : 'test name1' } ,
parent : { country : [ 'country1' ] , region : [ 'state1' ] , county : [ 'city1' ] }
} ,
{
_id : 'myid2' , _type : 'mytype2' ,
_score : 20 ,
_matched _queries : [ 'query 3' ] ,
value : 2 ,
center _point : { lat : 100.2 , lon : - 51.5 } ,
name : { default : 'test name2' } ,
parent : { country : [ 'country2' ] , region : [ 'state2' ] , county : [ 'city2' ] }
}
] ;
var expectedMeta = {
scores : [ 10 , 20 ]
} ;
test ( 'valid ES query' , function ( t ) {
var backend = mockBackend ( 'client/search/ok/1' , function ( cmd ) {
t . deepEqual ( cmd , example _valid _es _query , 'no change to the command' ) ;
module . exports . tests . error _conditions = ( test , common ) => {
test ( 'esclient.search returning error should log and pass it on' , ( t ) => {
const errorMessages = [ ] ;
const service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
errorMessages . push ( msg ) ;
}
} ;
}
}
} ) ;
service ( backend , example _valid _es _query , function ( err , data , meta ) {
t . true ( Array . isArray ( data ) , 'returns an array' ) ;
data . forEach ( function ( d ) {
t . true ( typeof d === 'object' , 'valid object' ) ;
} ) ;
t . deepEqual ( data , expected , 'values correctly mapped' ) ;
t . deepEqual ( meta , expectedMeta , 'meta data correctly mapped' ) ;
const esclient = {
search : ( cmd , callback ) => {
t . deepEquals ( cmd , 'this is the query' ) ;
const err = 'this is an error' ;
const data = {
docs : [
{
found : true ,
_id : 'doc id' ,
_type : 'doc type' ,
_source : { }
}
]
} ;
callback ( 'this is an error' , data ) ;
}
} ;
const next = ( err , docs ) => {
t . equals ( err , 'this is an error' , 'err should have been passed on' ) ;
t . equals ( docs , undefined ) ;
t . ok ( errorMessages . find ( ( msg ) => {
return msg === ` elasticsearch error ${ err } ` ;
} ) ) ;
t . end ( ) ;
} ) ;
} ) ;
} ;
service ( esclient , 'this is the query' , next ) ;
} ) ;
} ;
// functionally test service
module . exports . tests . functional _failure = function ( test , common ) {
module . exports . tests . success _conditions = ( test , common ) => {
test ( 'esclient.search returning data.docs should filter and map' , ( t ) => {
const errorMessages = [ ] ;
const service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
errorMessages . push ( msg ) ;
}
} ;
}
}
} ) ;
const esclient = {
search : ( cmd , callback ) => {
t . deepEquals ( cmd , 'this is the query' ) ;
const data = {
hits : {
total : 17 ,
hits : [
{
_score : 'score 1' ,
_id : 'doc id 1' ,
_type : 'doc type 1' ,
matched _queries : 'matched_queries 1' ,
_source : {
random _key : 'value 1'
}
} ,
{
_score : 'score 2' ,
_id : 'doc id 2' ,
_type : 'doc type 2' ,
matched _queries : 'matched_queries 2' ,
_source : {
random _key : 'value 2'
}
}
]
}
} ;
callback ( undefined , data ) ;
}
} ;
test ( 'invalid ES query' , function ( t ) {
var invalid _queries = [
{ } ,
{ foo : 'bar' }
const expectedDocs = [
{
_score : 'score 1' ,
_id : 'doc id 1' ,
_type : 'doc type 1' ,
random _key : 'value 1' ,
_matched _queries : 'matched_queries 1'
} ,
{
_score : 'score 2' ,
_id : 'doc id 2' ,
_type : 'doc type 2' ,
random _key : 'value 2' ,
_matched _queries : 'matched_queries 2'
}
] ;
var backend = mockBackend ( 'client/search/fail/1' , function ( cmd ) {
t . notDeepEqual ( cmd , example _valid _es _query , 'incorrect backend command' ) ;
const expectedMeta = {
scores : [ 'score 1' , 'score 2' ]
} ;
const next = ( err , docs , meta ) => {
t . equals ( err , null ) ;
t . deepEquals ( docs , expectedDocs ) ;
t . deepEquals ( meta , expectedMeta ) ;
t . equals ( errorMessages . length , 0 , 'no errors should have been logged' ) ;
t . end ( ) ;
} ;
service ( esclient , 'this is the query' , next ) ;
} ) ;
test ( 'esclient.search returning falsy data should return empty docs and meta' , ( t ) => {
const errorMessages = [ ] ;
const service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
errorMessages . push ( msg ) ;
}
} ;
}
}
} ) ;
invalid _queries . forEach ( function ( query ) {
// mock out pelias-logger so we can assert what's being logged
var service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
t . equal ( msg , 'elasticsearch error an elasticsearch error occurred' ) ;
}
} ;
const esclient = {
search : ( cmd , callback ) => {
t . deepEquals ( cmd , 'this is the query' ) ;
callback ( undefined , undefined ) ;
}
} ;
const expectedDocs = [ ] ;
const expectedMeta = { scores : [ ] } ;
const next = ( err , docs , meta ) => {
t . equals ( err , null ) ;
t . deepEquals ( docs , expectedDocs ) ;
t . deepEquals ( meta , expectedMeta ) ;
t . equals ( errorMessages . length , 0 , 'no errors should have been logged' ) ;
t . end ( ) ;
} ;
service ( esclient , 'this is the query' , next ) ;
} ) ;
test ( 'esclient.search returning falsy data.hits should return empty docs and meta' , ( t ) => {
const errorMessages = [ ] ;
const service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
errorMessages . push ( msg ) ;
}
} ;
}
}
} ) ;
const esclient = {
search : ( cmd , callback ) => {
t . deepEquals ( cmd , 'this is the query' ) ;
const data = {
hits : {
total : 17
}
} ;
callback ( undefined , data ) ;
}
} ;
const expectedDocs = [ ] ;
const expectedMeta = { scores : [ ] } ;
const next = ( err , docs , meta ) => {
t . equals ( err , null ) ;
t . deepEquals ( docs , expectedDocs ) ;
t . deepEquals ( meta , expectedMeta ) ;
t . equals ( errorMessages . length , 0 , 'no errors should have been logged' ) ;
t . end ( ) ;
} ;
service ( esclient , 'this is the query' , next ) ;
} ) ;
test ( 'esclient.search returning falsy data.hits.total should return empty docs and meta' , ( t ) => {
const errorMessages = [ ] ;
const service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
errorMessages . push ( msg ) ;
}
} ;
}
}
} ) ;
const esclient = {
search : ( cmd , callback ) => {
t . deepEquals ( cmd , 'this is the query' ) ;
const data = {
hits : {
hits : [
{
_score : 'score 1' ,
_id : 'doc id 1' ,
_type : 'doc type 1' ,
matched _queries : 'matched_queries 1' ,
_source : {
random _key : 'value 1'
}
} ,
{
_score : 'score 2' ,
_id : 'doc id 2' ,
_type : 'doc type 2' ,
matched _queries : 'matched_queries 2' ,
_source : {
random _key : 'value 2'
}
}
]
}
} ;
} ) ;
callback ( undefined , data ) ;
service ( backend , [ query ] , function ( err , data ) {
t . equal ( err , 'an elasticsearch error occurred' , 'error passed to errorHandler' ) ;
t . equal ( data , undefined , 'data is undefined' ) ;
} ) ;
}
} ;
const expectedDocs = [ ] ;
const expectedMeta = { scores : [ ] } ;
const next = ( err , docs , meta ) => {
t . equals ( err , null ) ;
t . deepEquals ( docs , expectedDocs ) ;
t . deepEquals ( meta , expectedMeta ) ;
t . equals ( errorMessages . length , 0 , 'no errors should have been logged' ) ;
t . end ( ) ;
} ;
service ( esclient , 'this is the query' , next ) ;
} ) ;
test ( 'esclient.search returning non-array data.hits.hits should return empty docs and meta' , ( t ) => {
const errorMessages = [ ] ;
const service = proxyquire ( '../../../service/search' , {
'pelias-logger' : {
get : ( ) => {
return {
error : ( msg ) => {
errorMessages . push ( msg ) ;
}
} ;
}
}
} ) ;
t . end ( ) ;
const esclient = {
search : ( cmd , callback ) => {
t . deepEquals ( cmd , 'this is the query' ) ;
const data = {
hits : {
total : 17 ,
hits : 'this isn\'t an array'
}
} ;
callback ( undefined , data ) ;
}
} ;
const expectedDocs = [ ] ;
const expectedMeta = { scores : [ ] } ;
const next = ( err , docs , meta ) => {
t . equals ( err , null ) ;
t . deepEquals ( docs , expectedDocs ) ;
t . deepEquals ( meta , expectedMeta ) ;
t . equals ( errorMessages . length , 0 , 'no errors should have been logged' ) ;
t . end ( ) ;
} ;
service ( esclient , 'this is the query' , next ) ;
} ) ;
} ;
module . exports . all = function ( tape , common ) {
module . exports . all = ( tape , common ) => {
function test ( name , testFunction ) {
return tape ( 'SERVICE /search ' + name , testFunction ) ;