UNPKG

nolr

Version:

Solr Node Client with ES6 Support

861 lines (794 loc) 24.1 kB
/** * Created by godong on 2016. 3. 9.. */ /* jshint expr: true */ /** * Require modules */ var chai = require('chai'), chaiAsPromised = require("chai-as-promised"), nock = require('nock'), Client = require('../lib/client'); chai.use(chaiAsPromised); var expect = chai.expect; describe('Client', function() { var testClient = new Client({core: 'test'}); before(function() { nock.disableNetConnect(); nock.enableNetConnect(/127.0.0.1/); nock.cleanAll(); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/error\/select.*/g, '/error/select/mock') .get('/error/select/mock') .reply(404); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/error\/update.*/g, '/error/update/mock') .post('/error/update/mock') .reply(404); nock('http://127.0.0.1:8983') .persist() .get('/solr/test/select?q=text:test&facet=true&facet.query=test&wt=json') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 86, params: { q: 'text:test', wt: 'json' } }, response:{ numFound: 10, start: 0, docs: [] }, facet_counts:{ facet_queries: { test: 18 } } })); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/test\/select.*/g, '/test/select/mock') .get('/test/select/mock') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 86, params: { q: 'text:test', wt: 'json' } }, response:{ numFound: 10, start: 0, docs: [] } })); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/test\/terms.*/g, '/test/terms/mock') .get('/test/terms/mock') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 86 }, terms:{ text: [] } })); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/test\/mlt.*/g, '/test/mlt/mock') .get('/test/mlt/mock') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 86 }, response: { numFound: 10, start: 0, docs: [] }, moreLikeThis: { "testId1": { numFound: 10, start: 0, docs: [] }, "testId2": { numFound: 10, start: 0, docs: [] } } })); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/test\/spell.*/g, '/test/spell/mock') .get('/test/spell/mock') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 86 }, response: { numFound: 10, start: 0, docs: [] }, spellcheck:{ suggestions: [], collations: [] } })); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/test\/update.*/g, '/test/update/mock') .post('/test/update/mock') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 86 } })); nock('http://127.0.0.1:8983') .persist() .filteringPath(/\/solr\/test\/admin\/ping.*/g, '/test/admin/ping/mock') .get('/test/admin/ping/mock') .reply(200, JSON.stringify({ responseHeader: { status: 0, QTime: 2 } })); }); after(function() { nock.cleanAll(); }); describe('#constructor', function() { it('should create default client.', function() { //given var options = {}; //when var client = new Client(options); //then expect(client.options).to.eql({ host: '127.0.0.1', port: '8983', core: '', rootPath: 'solr', protocol: 'http' }); }); it('should create client when core:"test".', function() { //given var options = { core: 'test', debugLevel: 'ALL' }; //when var client = new Client(options); //then expect(client.options).to.eql({ host: '127.0.0.1', port: '8983', core: 'test', rootPath: 'solr', protocol: 'http' }); }); }); describe('#_makeHostUrl', function() { it('should get host url.', function() { //given var protocol = 'http'; var host = '127.0.0.1'; var port = '8983'; //when var hostUrl = testClient._makeHostUrl(protocol, host, port); //then expect(hostUrl).to.equal('http://127.0.0.1:8983'); }); it('should get host url when port is empty and protocol is https.', function() { //given var protocol = 'https'; var host = 'test.com'; var port = ''; //when var hostUrl = testClient._makeHostUrl(protocol, host, port); //then expect(hostUrl).to.equal('https://test.com'); }); }); describe('#_requestGet', function() { it('should get search error from server.', function(done) { //given var client = new Client({core: 'error'}); //when client._requestGet(client.SEARCH_PATH, "q=*:*", function(err, result) { //then expect(err).to.equal('Solr server error: 404'); expect(result).to.not.exist; done(); }); }); it('should get notes data from server when query string.', function(done) { //given var client = new Client({core: 'test'}); //when client._requestGet(client.SEARCH_PATH, 'q=text:text&wt=json', function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should get notes data from server when query is query instance.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query().q('text:test'); //when client._requestGet(client.SEARCH_PATH, query, function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should get notes data from server when query is query instance but query is not string.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query().q(null); //when client._requestGet(client.SEARCH_PATH, query, function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should get notes data from server when query is string.', function(done) { //given var client = new Client({core: 'test'}); //when client._requestGet(client.SEARCH_PATH, "q=*:*", function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should get notes data from server when query is null.', function(done) { //given var client = new Client({core: 'test'}); //when client._requestGet(client.SEARCH_PATH, null, function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should return a Promise when no callback is given', function() { //given var client = new Client({core: 'test'}); //when var result = client._requestGet(client.SEARCH_PATH, null); //then return expect(result).to.be.a('promise'); }); it('should not return a Promise when a callback is given', function() { //given var client = new Client({core: 'test'}); //when var result = client._requestGet(client.SEARCH_PATH, null, function(){}); //then return expect(result).to.be.undefined; }); it('should resolve with the data when it returns a Promise', function() { //given var client = new Client({core: 'test'}); //when var result = client._requestGet(client.SEARCH_PATH, null); //then return expect(result).to.eventually.have.property('response'); }); it('should reject with error message when it returns a Promise', function() { //given var client = new Client({core: 'error'}); //when var result = client._requestGet(client.SEARCH_PATH, null); //then return expect(result).to.be.rejectedWith('Solr server error: 404'); }); }); describe('#_requestPost', function() { it('should get post error from server.', function(done) { //given var client = new Client({core: 'error'}); //when client._requestPost(client.UPDATE_PATH, {}, {}, function(err, result) { //then expect(err).to.equal('Solr server error: 404'); expect(result).to.not.exist; done(); }); }); it('should post data to server when options is null.', function(done) { //given var client = new Client({core: 'test'}); var data = { test: 'test', title: 'test' }; var options = null; //when client._requestPost(client.UPDATE_PATH, data, options, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should post data to server when options is object.', function(done) { //given var client = new Client({core: 'test'}); var data = { test: 'test', title: 'test' }; //when client._requestPost(client.UPDATE_PATH, data, {}, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should post data to server when options is string.', function(done) { //given var client = new Client({core: 'test'}); var data = { test: 'test', title: 'test' }; //when client._requestPost(client.UPDATE_PATH, data, 'commit=true', function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); }); describe('#search', function() { it('should search data when not using query.', function(done) { //given var client = new Client({core: 'test'}); //when client.search('q=text:test', function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should search data when query is string.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query().q('text:test'); //when client.search(query, function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should search data when query is object.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query() .q({text:'test', title:'test'}); //when client.search(query, function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should search data with query options.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query() .q({text:'test', title:'test'}) .fl(['text', 'title']) .start(0) .rows(10) .sort({like:'desc'}) .fq({field:'hate', value:0}); //when client.search(query, function(err, result) { //then expect(query.params).to.eql([ 'q=text:test%20AND%20title:test', 'fl=text,title', 'start=0', 'rows=10', 'sort=like%20desc', 'fq=hate%3A0' ]); expect(err).to.not.exist; expect(result.response).to.exist; done(); }); }); it('should search data when query and facet query are exist.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query() .q({text:'test'}) .facetQuery({query:'test'}); //when client.search(query, function(err, result) { //then expect(query.params).to.eql([ 'q=text:test', 'facet=true', 'facet.query=test' ]); expect(err).to.not.exist; expect(result.response).to.exist; expect(result.facet_counts).to.exist; done(); }); }); it('should return a Promise when no callback is given', function() { //given var client = new Client({core: 'test'}); //when var query = client.query() .q({text:'test'}) .facetQuery({query:'test'}); var result = client.search(query); //then return expect(result).to.be.a('promise'); }); it('should not return a Promise when a callback is given', function() { //given var client = new Client({core: 'test'}); //when var query = client.query() .q({text:'test'}) .facetQuery({query:'test'}); var result = client.search(query, function() {}); //then return expect(result).to.be.undefined; }); it('should resolve with the data when it returns a Promise', function() { //given var client = new Client({core: 'test'}); //when var result = client.search('q=text:test'); //then return expect(result).to.eventually.have.property('response'); }); it('should reject with error message when it returns a Promise', function() { //given var client = new Client({core: 'error'}); //when var result = client.search('q=text:test'); //then return expect(result).to.be.rejected; }); }); describe('#terms', function() { it('should get terms data.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query() .termsQuery({ fl: 'text', prefix: 'te' }); //when client.terms(query, function(err, result) { //then expect(err).to.not.exist; expect(result.terms).to.exist; done(); }); }); it('should resolve with the terms data when there is no callback', function() { //given var client = new Client({core: 'test'}); //when var query = client.query() .termsQuery({ fl: 'text', prefix: 'te' }); var result = client.terms(query); //then return expect(result).to.eventually.have.property('terms'); }); }); describe('#mlt', function() { it('should get mlt data.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query() .q({title: 'test'}) .mltQuery({ fl: ['title', 'text'], mindf: 1, mintf: 1 }); //when client.mlt(query, function(err, result) { //then expect(err).to.not.exist; expect(result.response).to.exist; expect(result.moreLikeThis).to.exist; done(); }); }); it('should resolve with the mlt data when there is no callback', function() { //given var client = new Client({core: 'test'}); var query = client.query() .q({title: 'test'}) .mltQuery({ fl: ['title', 'text'], mindf: 1, mintf: 1 }); //when var result = client.mlt(query); //then return expect(result).to.eventually.have.property('moreLikeThis'); }); }); describe('#spell', function() { it('should get spell data.', function(done) { //given var client = new Client({core: 'test'}); var query = client.query() .df('title') .spellcheckQuery({ q: 'tes', build: true, collate: true, maxCollations: 5, maxCollationTries: 3, maxCollationEvaluations: 2, collateExtendedResults: true, collateMaxCollectDocs: 5, dictionary: "defaule", extendedResults: true, onlyMorePopular: true, maxResultsForSuggest: 5, alternativeTermCount: 3, reload: true, accuracy: 1.0 }); //when client.spell(query, function(err, result) { //then expect(err).to.not.exist; expect(result.spellcheck).to.exist; done(); }); }); it('should resolve with the spell data when there is no callback', function() { //given var client = new Client({core: 'test'}); var query = client.query() .df('title') .spellcheckQuery({ q: 'tes', build: true, collate: true, maxCollations: 5, maxCollationTries: 3, maxCollationEvaluations: 2, collateExtendedResults: true, collateMaxCollectDocs: 5, dictionary: "defaule", extendedResults: true, onlyMorePopular: true, maxResultsForSuggest: 5, alternativeTermCount: 3, reload: true, accuracy: 1.0 }); //when var result = client.spell(query); //then return expect(result).to.eventually.have.property('spellcheck'); }); }); describe('#update', function() { it('should post data to server without options.', function(done) { //given var client = new Client({core: 'test'}); var data = { text: 'test', title: 'test' }; //when client.update(data, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should post data to server with options.', function(done) { //given var client = new Client({core: 'test'}); var data = { text: 'test', title: 'test' }; var options = { commit: true }; //when client.update(data, options, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should resolve with the response when there is no callback', function() { //given var client = new Client({core: 'test'}); var data = { text: 'test', title: 'test' }; //when var result = client.update(data); //then return expect(result).to.eventually.have.property('responseHeader'); }); }); describe('#delete', function() { it('should delete data to server without options.', function(done) { //given var client = new Client({core: 'test'}); var query = {id:'testid1'}; //when client.delete(query, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should delete data to server with options when query is object.', function(done) { //given var client = new Client({core: 'test'}); var query = {id:'testid2'}; var options = { commit: true }; //when client.delete(query, options, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should delete data to server with options when query is string.', function(done) { //given var client = new Client({core: 'test'}); var query = "id:testid3"; var options = { commit: true }; //when client.delete(query, options, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should delete data to server with options when query is null.', function(done) { //given var client = new Client({core: 'test'}); var query = null; var options = { commit: true }; //when client.delete(query, options, function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should resolve with the response when there is no callback', function() { //given var client = new Client({core: 'test'}); var query = {id:'testid1'}; //when var result = client.delete(query); //then return expect(result).to.eventually.have.property('responseHeader'); }); }); describe('#ping', function() { it('should request ping.', function(done) { //given var client = new Client({core: 'test'}); //when client.ping(function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should resolve with the response when there is no callback', function() { //given var client = new Client({core: 'test'}); //when var result = client.ping(); //then return expect(result).to.eventually.have.property('responseHeader'); }); }); describe('#commit', function() { it('should request commit.', function(done) { //given var client = new Client({core: 'test'}); //when client.commit(function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should resolve with the response when there is no callback', function() { //given var client = new Client({core: 'test'}); //when var result = client.commit(); //then return expect(result).to.eventually.have.property('responseHeader'); }); }); describe('#softCommit', function() { it('should request softCommit.', function(done) { //given var client = new Client({core: 'test'}); //when client.softCommit(function(err, result) { //then expect(err).to.not.exist; expect(result.responseHeader).to.exist; done(); }); }); it('should resolve with the response when there is no callback', function() { //given var client = new Client({core: 'test'}); //when var result = client.softCommit(); //then return expect(result).to.eventually.have.property('responseHeader'); }); }); });