(function ($) { module("Backend ElasticSearch - Wrapper"); test("queryNormalize", function() { var backend = new recline.Backend.ElasticSearch.Wrapper(); var in_ = new recline.Model.Query(); var out = backend._normalizeQuery(in_); var exp = { constant_score: { query: { match_all: {} } } }; deepEqual(out, exp); var in_ = new recline.Model.Query(); in_.set({q: ''}); var out = backend._normalizeQuery(in_); deepEqual(out, exp); var in_ = new recline.Model.Query(); in_.attributes.q = 'abc'; var out = backend._normalizeQuery(in_); equal(out.constant_score.query.query_string.query, 'abc'); var in_ = new recline.Model.Query(); in_.addFilter({ type: 'term', field: 'xyz', term: 'XXX' }); var out = backend._normalizeQuery(in_); var exp = { constant_score: { query: { match_all: {} }, filter: { and: [ { term: { xyz: 'xxx' } } ] } } }; deepEqual(out, exp); var in_ = new recline.Model.Query(); in_.addFilter({ type: 'geo_distance', field: 'xyz' }); var out = backend._normalizeQuery(in_); var exp = { constant_score: { query: { match_all: {} }, filter: { and: [ { geo_distance: { distance: 10, unit: 'km', 'xyz': { lon: 0, lat: 0 } } } ] } } }; deepEqual(out, exp); }); var mapping_data = { "note": { "properties": { "_created": { "format": "dateOptionalTime", "type": "date" }, "_last_modified": { "format": "dateOptionalTime", "type": "date" }, "end": { "type": "string" }, "owner": { "type": "string" }, "start": { "type": "string" }, "title": { "type": "string" } } } }; var sample_data = { "_shards": { "failed": 0, "successful": 5, "total": 5 }, "hits": { "hits": [ { "_id": "u3rpLyuFS3yLNXrtxWkMwg", "_index": "hypernotes", "_score": 1.0, "_source": { "_created": "2012-02-24T17:53:57.286Z", "_last_modified": "2012-02-24T17:53:57.286Z", "owner": "tester", "title": "Note 1" }, "_type": "note" }, { "_id": "n7JMkFOHSASJCVTXgcpqkA", "_index": "hypernotes", "_score": 1.0, "_source": { "_created": "2012-02-24T17:53:57.290Z", "_last_modified": "2012-02-24T17:53:57.290Z", "owner": "tester", "title": "Note 3" }, "_type": "note" }, { "_id": "g7UMA55gTJijvsB3dFitzw", "_index": "hypernotes", "_score": 1.0, "_source": { "_created": "2012-02-24T17:53:57.289Z", "_last_modified": "2012-02-24T17:53:57.289Z", "owner": "tester", "title": "Note 2" }, "_type": "note" } ], "max_score": 1.0, "total": 3 }, "timed_out": false, "took": 2 }; test("query", function() { var backend = new recline.Backend.ElasticSearch.Wrapper('https://localhost:9200/my-es-db/my-es-type'); var stub = sinon.stub($, 'ajax', function(options) { if (options.url.indexOf('_mapping') != -1) { return { done: function(callback) { callback(mapping_data); return this; }, fail: function() { return this; } } } else { return { done: function(callback) { callback(sample_data); return this; }, fail: function() { } } } }); backend.mapping().done(function(data) { var fields = _.keys(data.note.properties); deepEqual(['_created', '_last_modified', 'end', 'owner', 'start', 'title'], fields); }); backend.query().done(function(queryResult) { equal(3, queryResult.hits.total); equal(3, queryResult.hits.hits.length); equal('Note 1', queryResult.hits.hits[0]._source['title']); start(); }); $.ajax.restore(); }); // DISABLED - this test requires ElasticSearch to be running locally // test("write", function() { // var url = 'http://localhost:9200/recline-test/es-write'; // var backend = new recline.Backend.ElasticSearch.Wrapper(url); // stop(); // // var id = parseInt(Math.random()*100000000).toString(); // var rec = { // id: id, // title: 'my title' // }; // var jqxhr = backend.upsert(rec); // jqxhr.done(function(data) { // ok(data.ok); // equal(data._id, id); // equal(data._type, 'es-write'); // equal(data._version, 1); // // // update // rec.title = 'new title'; // var jqxhr = backend.upsert(rec); // jqxhr.done(function(data) { // equal(data._version, 2); // // // delete // var jqxhr = backend.remove(rec.id); // jqxhr.done(function(data) { // ok(data.ok); // rec = null; // // // try to get ... // var jqxhr = backend.get(id); // jqxhr.done(function(data) { // // should not be here // ok(false, 'Should have got 404'); // }).error(function(error) { // equal(error.status, 404); // start(); // }); // }); // }); // }).fail(function(error) { // console.log(error); // ok(false, 'Basic request failed - is ElasticSearch running locally on port 9200 (required for this test!)'); // start(); // }); // }); // ================================================== module("Backend ElasticSearch - Recline"); test("query", function() { var dataset = new recline.Model.Dataset({ url: 'https://localhost:9200/my-es-db/my-es-type', backend: 'elasticsearch' }); var stub = sinon.stub($, 'ajax', function(options) { if (options.url.indexOf('_mapping') != -1) { return { done: function(callback) { callback(mapping_data); return this; }, fail: function() { return this; } } } else { return { done: function(callback) { callback(sample_data); return this; }, fail: function() { } }; } }); dataset.fetch().done(function(dataset) { deepEqual(['_created', '_last_modified', 'end', 'owner', 'start', 'title'], _.pluck(dataset.fields.toJSON(), 'id')); dataset.query().then(function(recList) { equal(3, dataset.recordCount); equal(3, recList.length); equal('Note 1', recList.models[0].get('title')); start(); }); }); $.ajax.restore(); }); // DISABLED - this test requires ElasticSearch to be running locally // test("write", function() { // var dataset = new recline.Model.Dataset({ // url: 'http://localhost:9200/recline-test/es-write', // backend: 'elasticsearch' // }); // // stop(); // // var id = parseInt(Math.random()*100000000).toString(); // var rec = new recline.Model.Record({ // id: id, // title: 'my title' // }); // dataset.records.add(rec); // // have to do this explicitly as we not really supporting adding new items atm // dataset._changes.creates.push(rec.toJSON()); // var jqxhr = dataset.save(); // jqxhr.done(function(data) { // ok(data.ok); // equal(data._id, id); // equal(data._type, 'es-write'); // equal(data._version, 1); // // // update // rec.set({title: 'new title'}); // // again set up by hand ... // dataset._changes.creates = []; // dataset._changes.updates.push(rec.toJSON()); // var jqxhr = dataset.save(); // jqxhr.done(function(data) { // equal(data._version, 2); // // // delete // dataset._changes.updates = 0; // dataset._changes.deletes.push(rec.toJSON()); // var jqxhr = dataset.save(); // jqxhr.done(function(data) { // ok(data.ok); // rec = null; // // // try to get ... // var es = new recline.Backend.ElasticSearch.Wrapper(dataset.get('url')); // var jqxhr = es.get(id); // jqxhr.done(function(data) { // // should not be here // ok(false, 'Should have got 404'); // }).error(function(error) { // equal(error.status, 404); // start(); // }); // }); // }); // }).fail(function(error) { // console.log(error); // ok(false, 'Basic request failed - is ElasticSearch running locally on port 9200 (required for this test!)'); // start(); // }); // }); })(this.jQuery);