elasticsearch-rails2 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Client do
4
+
5
+ context "Client module" do
6
+ class ::FooClientModule
7
+ include Elasticsearch::Rails2
8
+ # extend Elasticsearch::Rails2::Client::ClassMethods
9
+ # include Elasticsearch::Rails2::Client::InstanceMethods
10
+ end
11
+
12
+ context "default client method" do
13
+ it "should be an Elasticsearch::Transport::Client" do
14
+ expect(FooClientModule.client).to be_an Elasticsearch::Transport::Client
15
+ expect(FooClientModule.new.client).to be_an Elasticsearch::Transport::Client
16
+ end
17
+ end
18
+
19
+ context "set the client for the model" do
20
+ it "should set the client for the class and for new instances" do
21
+ obj = 'foo'
22
+ FooClientModule.client = obj
23
+ expect(FooClientModule.client).to be obj
24
+ expect(FooClientModule.new.client).to be obj
25
+ end
26
+ end
27
+
28
+ context "set the client for an instance" do
29
+ it "should set the client for the instance" do
30
+ obj = 'foo'
31
+ instance = FooClientModule.new
32
+ instance.client = obj
33
+ expect(instance.client).to be obj
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Naming do
4
+ context "Naming module" do
5
+ class ::NamingDummyModel < ActiveRecord::Base
6
+ include Elasticsearch::Rails2
7
+ end
8
+
9
+ before(:each){create_dummy_table :naming_dummy_models}
10
+
11
+ describe "index_name" do
12
+ context "Elasticsearch::Rails2.index_name is not defined" do
13
+ it "should return default index_name" do
14
+ expect(NamingDummyModel.index_name).to eq("naming_dummy_models_index")
15
+ expect(NamingDummyModel.new.index_name).to eq("naming_dummy_models_index")
16
+ end
17
+ end
18
+
19
+ context "Elasticsearch::Rails2.index_name is defined" do
20
+
21
+ before(:each) {Elasticsearch::Rails2.index_name = 'foo'}
22
+ after(:each) {Elasticsearch::Rails2.reset}
23
+
24
+ it "should return the Elasticsearch::Rails2.index_name" do
25
+ expect(NamingDummyModel.index_name).to eq("foo")
26
+ expect(NamingDummyModel.new.index_name).to eq("foo")
27
+ end
28
+ end
29
+
30
+ context "when the index_name is defined in the class" do
31
+ before(:each){ NamingDummyModel.index_name = 'foobar'}
32
+ after(:each){ NamingDummyModel.index_name = nil}
33
+
34
+ it "should return the index_name defined in the class" do
35
+ expect(NamingDummyModel.index_name).to eq("foobar")
36
+ expect(NamingDummyModel.new.index_name).to eq("foobar")
37
+ end
38
+
39
+ end
40
+
41
+
42
+ context "when the index_name is defined for an instance" do
43
+ before(:each){
44
+ @foo = NamingDummyModel.new
45
+ @foo.index_name = 'foobar_instance'
46
+ }
47
+
48
+ it "should return the index_name defined in the instance" do
49
+ expect(NamingDummyModel.index_name).to eq("naming_dummy_models_index")
50
+ expect(@foo.index_name).to eq("foobar_instance")
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ describe "document_type" do
58
+
59
+ it "should return the default calculated document_type" do
60
+ expect(NamingDummyModel.document_type).to eq("naming_dummy_models")
61
+ expect(NamingDummyModel.new.document_type).to eq("naming_dummy_models")
62
+ end
63
+
64
+ context "when document_type is defined in the class" do
65
+ before(:each){ NamingDummyModel.document_type = 'foobar'}
66
+ after(:each){ NamingDummyModel.document_type = nil}
67
+
68
+ it "should return the new document_type" do
69
+ expect(NamingDummyModel.document_type).to eq("foobar")
70
+ expect(NamingDummyModel.new.document_type).to eq("foobar")
71
+ end
72
+ end
73
+
74
+ context "when document_type is defined in the instance" do
75
+ before(:each){
76
+ @foo = NamingDummyModel.new
77
+ @foo.document_type = 'foobar_instance'
78
+ }
79
+
80
+ it "should return the new document_type" do
81
+ expect(NamingDummyModel.document_type).to eq("naming_dummy_models")
82
+ expect(@foo.document_type).to eq("foobar_instance")
83
+ end
84
+ end
85
+
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2 do
4
+
5
+ after do
6
+ Elasticsearch::Rails2.reset
7
+ end
8
+
9
+ describe ".client" do
10
+ it "should return a default Elasticsearch::Transport::Client" do
11
+ expect(Elasticsearch::Rails2.client).to be_an Elasticsearch::Transport::Client
12
+ end
13
+ end
14
+
15
+ describe ".client=" do
16
+ it "should set the client" do
17
+ obj = 'foo'
18
+ Elasticsearch::Rails2.client = obj
19
+ expect(Elasticsearch::Rails2.client).to be obj
20
+ end
21
+ end
22
+
23
+ describe '.index_name' do
24
+ it "should return the default index_name" do
25
+ expect(Elasticsearch::Rails2.index_name).to eq(Elasticsearch::Rails2::Configuration::DEFAULT_INDEX_NAME)
26
+ end
27
+ end
28
+
29
+ describe '.index_name=' do
30
+ it "should set the index_name" do
31
+ Elasticsearch::Rails2.index_name = 'production'
32
+ expect(Elasticsearch::Rails2.index_name).to eq('production')
33
+ end
34
+ end
35
+
36
+ describe '.options=' do
37
+ before do
38
+ @keys = Elasticsearch::Rails2::Configuration::VALID_OPTIONS_KEYS
39
+
40
+ @options = {
41
+ :index_name => 'production'
42
+ }
43
+ end
44
+
45
+ it "should override default configuration" do
46
+ Elasticsearch::Rails2.options = @options
47
+ @keys.each do |key|
48
+ expect(Elasticsearch::Rails2.send(key)).to eq(@options[key])
49
+ end
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Response::Result do
4
+
5
+ it "should have method access to properties" do
6
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar', bar: { bam: 'baz' }
7
+
8
+ expect(result).to respond_to :foo
9
+ expect(result).to respond_to :bar
10
+
11
+ expect(result.foo).to eq('bar')
12
+ expect(result.bar.bam).to eq('baz')
13
+
14
+ expect{result.xoxo}.to raise_error(NoMethodError)
15
+ end
16
+
17
+ it "should return _id as #id" do
18
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar', _id: 42, _source: { id: 12 }
19
+
20
+ expect(result.id).to eq(42)
21
+ expect(result._source.id).to eq(12)
22
+ end
23
+
24
+ it "should return _type as #type" do
25
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar', _type: 'baz', _source: { type: 'BAM' }
26
+
27
+ expect(result.type).to eq('baz')
28
+ expect(result._source.type).to eq('BAM')
29
+ end
30
+
31
+ it "should delegate method calls to `_source` when available" do
32
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar', _source: { bar: 'baz' }
33
+
34
+ expect(result).to respond_to :foo
35
+ expect(result).to respond_to :_source
36
+ expect(result).to respond_to :bar
37
+
38
+ expect(result.foo).to eq('bar')
39
+ expect(result._source.bar).to eq('baz')
40
+ expect(result.bar).to eq('baz')
41
+ end
42
+
43
+ it "should delegate existence method calls to `_source`" do
44
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar', _source: { bar: { bam: 'baz' } }
45
+
46
+ expect(result._source).to respond_to :bar?
47
+ expect(result).to respond_to :bar?
48
+
49
+ expect(result._source.bar?).to be true
50
+ expect(result.bar?).to be true
51
+ expect(result.boo?).to be false
52
+
53
+ expect(result.bar.bam?).to be true
54
+ expect(result.bar.boo?).to be false
55
+ end
56
+
57
+ it "should delegate methods to @result" do
58
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar'
59
+
60
+
61
+ expect(result.foo).to eq('bar')
62
+ expect(result.fetch('foo')).to eq('bar')
63
+ expect(result.fetch('NOT_EXIST', 'moo')).to eq('moo')
64
+ expect(result.keys).to eq(['foo'])
65
+
66
+ expect(result).to respond_to :to_hash
67
+ expect(result.to_hash).to eq({'foo' => 'bar'})
68
+
69
+ expect{result.does_not_exist}.to raise_error(NoMethodError)
70
+ end
71
+
72
+ it "should delegate existence method calls to @result" do
73
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar', _source: { bar: 'bam' }
74
+ expect(result).to respond_to :foo?
75
+
76
+ expect(result.foo?).to be true
77
+ expect(result.boo?).to be false
78
+ expect(result._source.foo?).to be false
79
+ expect(result._source.boo?).to be false
80
+ end
81
+
82
+ it "should delegate as_json to @result even when ActiveSupport changed half of Ruby" do
83
+ require 'active_support/json/encoding'
84
+ result = Elasticsearch::Rails2::Response::Result.new foo: 'bar'
85
+
86
+ expect(result.instance_variable_get(:@result)).to receive(:as_json).with(:except => 'foo')
87
+ result.as_json(:except => 'foo')
88
+ end
89
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Response::Results do
4
+ context "Response results" do
5
+ class ::ResultsDummyModel < ActiveRecord::Base
6
+ include Elasticsearch::Rails2
7
+ end
8
+
9
+ before do
10
+ create_dummy_table :results_dummy_models
11
+
12
+ @els_response = { 'hits' => { 'total' => 123, 'max_score' => 456, 'hits' => [{'foo' => 'bar'}] } }
13
+
14
+ @search = Elasticsearch::Rails2::Searching::SearchRequest.new ResultsDummyModel, '*'
15
+ allow(@search).to receive(:execute!){@els_response}
16
+ @response = Elasticsearch::Rails2::Response::Response.new ResultsDummyModel, @search
17
+ @results = Elasticsearch::Rails2::Response::Results.new ResultsDummyModel, @response
18
+ end
19
+
20
+ it "should access the results" do
21
+ expect(@results).to respond_to :results
22
+ results_results = @results.results
23
+ expect(results_results.size).to eq 1
24
+ expect(results_results.first.foo).to eq 'bar'
25
+ end
26
+
27
+ it "should delegate Enumerable methods to results" do
28
+ expect(@results).to_not be_empty
29
+ expect(@results.first.foo).to eq 'bar'
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Response do
4
+
5
+ class ::ResponseFooModel < ActiveRecord::Base
6
+ include Elasticsearch::Rails2
7
+ index_name :test_index
8
+ end
9
+
10
+ RESPONSE = { 'took' => '5', 'timed_out' => false, '_shards' => {'one' => 'OK'}, 'hits' => { 'hits' => [] } }
11
+
12
+
13
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Searching::SearchRequest do
4
+ class ::SearchingDummyModel < ActiveRecord::Base
5
+ include Elasticsearch::Rails2
6
+ end
7
+
8
+ before do
9
+ create_dummy_table :searching_dummy_models
10
+
11
+ @client = double('client')
12
+ expect(SearchingDummyModel).to receive(:client).and_return(@client)
13
+ end
14
+
15
+ context "when the query is an string" do
16
+ it "should pass the search definition as a simple query" do
17
+ expect(@client).to receive(:search).with(hash_including(q: 'foo'))
18
+
19
+ search_request = Elasticsearch::Rails2::Searching::SearchRequest.new SearchingDummyModel, 'foo'
20
+ search_request.execute!
21
+ end
22
+ end
23
+
24
+ context "when the query is a hash" do
25
+ it "should pass the search definition as a hash" do
26
+ expect(@client).to receive(:search).with(hash_including(body: {foo: 'bar'}))
27
+
28
+ search_request = Elasticsearch::Rails2::Searching::SearchRequest.new SearchingDummyModel, {foo: 'bar'}
29
+ search_request.execute!
30
+ end
31
+ end
32
+
33
+ context "when the query is a JSON string" do
34
+ it "should pass the search definition as a JSON string" do
35
+ expect(@client).to receive(:search).with(hash_including(body: "{'foo':'bar'}"))
36
+
37
+ search_request = Elasticsearch::Rails2::Searching::SearchRequest.new SearchingDummyModel, "{'foo':'bar'}"
38
+ search_request.execute!
39
+ end
40
+ end
41
+
42
+ context "when the query responds to_hash" do
43
+ class CustomQuery
44
+ def to_hash; {foo: 'bar'}; end
45
+ end
46
+
47
+ it "should pass the search definition as a hash" do
48
+ expect(@client).to receive(:search).with(hash_including(body: {foo: 'bar'}))
49
+
50
+ search_request = Elasticsearch::Rails2::Searching::SearchRequest.new SearchingDummyModel, CustomQuery.new
51
+ search_request.execute!
52
+ end
53
+ end
54
+
55
+ it "should pass the options to the client" do
56
+ expect(@client).to receive(:search).with(hash_including(q: 'foo', size: 15))
57
+
58
+ search_request = Elasticsearch::Rails2::Searching::SearchRequest.new SearchingDummyModel, 'foo', size: 15
59
+ search_request.execute!
60
+ end
61
+
62
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Elasticsearch::Rails2::Searching do
4
+ class ::SearchingDummyModel < ActiveRecord::Base
5
+ include Elasticsearch::Rails2
6
+ end
7
+
8
+ before do
9
+ create_dummy_table :searching_dummy_models
10
+ end
11
+
12
+ it "should have the search method" do
13
+ expect(SearchingDummyModel).to respond_to :search
14
+ end
15
+
16
+ it "should have the scan_all_ids method" do
17
+ expect(SearchingDummyModel).to respond_to :scan_all_ids
18
+ end
19
+
20
+ describe ".search" do
21
+ it "should initialize the search request object" do
22
+ expect(Elasticsearch::Rails2::Searching::SearchRequest).to receive(:new)
23
+ .with(SearchingDummyModel, 'foo', {default_operator: 'AND'})
24
+
25
+ SearchingDummyModel.search 'foo', default_operator: 'AND'
26
+ end
27
+
28
+ it "should not execute the actual search" do
29
+ # the search is executed when the response is accessed
30
+ search_request = double('search_request')
31
+ allow(Elasticsearch::Rails2::Searching::SearchRequest).to receive(:new).and_return(search_request)
32
+ expect(search_request).to_not receive(:execute!)
33
+ SearchingDummyModel.search 'foo'
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ RUBY_1_8 = defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
2
+
3
+ exit(0) if RUBY_1_8
4
+
5
+ $:.unshift File.dirname(__FILE__) + '/../lib'
6
+
7
+ require 'elasticsearch/rails2'
8
+ require 'rspec'
9
+ require 'support/active_record'
10
+
11
+ RSpec.configure do |config|
12
+ config.before(:each) {@dummy_tables = []}
13
+ config.after(:each) {drop_dummy_tables}
14
+ end
15
+
16
+ def create_dummy_table(table_name)
17
+ ActiveRecord::Migration.verbose = false
18
+ ActiveRecord::Migration.create_table table_name do |t|
19
+ t.string :name
20
+ end
21
+ @dummy_tables << table_name
22
+ end
23
+
24
+ def drop_dummy_tables
25
+ ActiveRecord::Migration.verbose = false
26
+ @dummy_tables.each {|table_name| ActiveRecord::Migration.drop_table table_name}
27
+ end