elasticsearch-model 0.0.1 → 0.1.0.rc1
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.
- data/.gitignore +3 -0
- data/LICENSE.txt +1 -1
- data/README.md +669 -8
- data/Rakefile +52 -0
- data/elasticsearch-model.gemspec +48 -17
- data/examples/activerecord_article.rb +77 -0
- data/examples/activerecord_associations.rb +153 -0
- data/examples/couchbase_article.rb +66 -0
- data/examples/datamapper_article.rb +71 -0
- data/examples/mongoid_article.rb +68 -0
- data/examples/ohm_article.rb +70 -0
- data/examples/riak_article.rb +52 -0
- data/gemfiles/3.gemfile +11 -0
- data/gemfiles/4.gemfile +11 -0
- data/lib/elasticsearch/model.rb +151 -1
- data/lib/elasticsearch/model/adapter.rb +145 -0
- data/lib/elasticsearch/model/adapters/active_record.rb +97 -0
- data/lib/elasticsearch/model/adapters/default.rb +44 -0
- data/lib/elasticsearch/model/adapters/mongoid.rb +90 -0
- data/lib/elasticsearch/model/callbacks.rb +35 -0
- data/lib/elasticsearch/model/client.rb +61 -0
- data/lib/elasticsearch/model/importing.rb +94 -0
- data/lib/elasticsearch/model/indexing.rb +332 -0
- data/lib/elasticsearch/model/naming.rb +101 -0
- data/lib/elasticsearch/model/proxy.rb +127 -0
- data/lib/elasticsearch/model/response.rb +70 -0
- data/lib/elasticsearch/model/response/base.rb +44 -0
- data/lib/elasticsearch/model/response/pagination.rb +96 -0
- data/lib/elasticsearch/model/response/records.rb +71 -0
- data/lib/elasticsearch/model/response/result.rb +50 -0
- data/lib/elasticsearch/model/response/results.rb +32 -0
- data/lib/elasticsearch/model/searching.rb +107 -0
- data/lib/elasticsearch/model/serializing.rb +35 -0
- data/lib/elasticsearch/model/support/forwardable.rb +44 -0
- data/lib/elasticsearch/model/version.rb +1 -1
- data/test/integration/active_record_associations_parent_child.rb +138 -0
- data/test/integration/active_record_associations_test.rb +306 -0
- data/test/integration/active_record_basic_test.rb +139 -0
- data/test/integration/active_record_import_test.rb +74 -0
- data/test/integration/active_record_namespaced_model_test.rb +49 -0
- data/test/integration/active_record_pagination_test.rb +109 -0
- data/test/integration/mongoid_basic_test.rb +178 -0
- data/test/test_helper.rb +57 -0
- data/test/unit/adapter_active_record_test.rb +93 -0
- data/test/unit/adapter_default_test.rb +31 -0
- data/test/unit/adapter_mongoid_test.rb +87 -0
- data/test/unit/adapter_test.rb +69 -0
- data/test/unit/callbacks_test.rb +30 -0
- data/test/unit/client_test.rb +27 -0
- data/test/unit/importing_test.rb +97 -0
- data/test/unit/indexing_test.rb +364 -0
- data/test/unit/module_test.rb +46 -0
- data/test/unit/naming_test.rb +76 -0
- data/test/unit/proxy_test.rb +88 -0
- data/test/unit/response_base_test.rb +40 -0
- data/test/unit/response_pagination_test.rb +159 -0
- data/test/unit/response_records_test.rb +87 -0
- data/test/unit/response_result_test.rb +52 -0
- data/test/unit/response_results_test.rb +31 -0
- data/test/unit/response_test.rb +57 -0
- data/test/unit/searching_search_request_test.rb +73 -0
- data/test/unit/searching_test.rb +39 -0
- data/test/unit/serializing_test.rb +17 -0
- metadata +418 -11
data/test/test_helper.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
RUBY_1_8 = defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
|
2
|
+
|
3
|
+
exit(0) if RUBY_1_8
|
4
|
+
|
5
|
+
require 'simplecov' and SimpleCov.start { add_filter "/test|test_/" } if ENV["COVERAGE"]
|
6
|
+
|
7
|
+
# Register `at_exit` handler for integration tests shutdown.
|
8
|
+
# MUST be called before requiring `test/unit`.
|
9
|
+
at_exit { Elasticsearch::Test::IntegrationTestCase.__run_at_exit_hooks }
|
10
|
+
|
11
|
+
puts '-'*80
|
12
|
+
|
13
|
+
require 'test/unit'
|
14
|
+
require 'shoulda-context'
|
15
|
+
require 'mocha/setup'
|
16
|
+
require 'turn' unless ENV["TM_FILEPATH"] || ENV["NOTURN"] || RUBY_1_8
|
17
|
+
|
18
|
+
require 'ansi'
|
19
|
+
require 'oj'
|
20
|
+
|
21
|
+
require 'active_record'
|
22
|
+
require 'active_model'
|
23
|
+
|
24
|
+
require 'kaminari'
|
25
|
+
|
26
|
+
require 'elasticsearch/model'
|
27
|
+
|
28
|
+
require 'elasticsearch/extensions/test/cluster'
|
29
|
+
require 'elasticsearch/extensions/test/startup_shutdown'
|
30
|
+
|
31
|
+
module Elasticsearch
|
32
|
+
module Test
|
33
|
+
class IntegrationTestCase < ::Test::Unit::TestCase
|
34
|
+
extend Elasticsearch::Extensions::Test::StartupShutdown
|
35
|
+
|
36
|
+
startup { Elasticsearch::Extensions::Test::Cluster.start(nodes: 1) if ENV['SERVER'] and not Elasticsearch::Extensions::Test::Cluster.running? }
|
37
|
+
shutdown { Elasticsearch::Extensions::Test::Cluster.stop if ENV['SERVER'] && started? }
|
38
|
+
context "IntegrationTest" do; should "noop on Ruby 1.8" do; end; end if RUBY_1_8
|
39
|
+
|
40
|
+
def setup
|
41
|
+
ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => ":memory:" )
|
42
|
+
logger = ::Logger.new(STDERR)
|
43
|
+
logger.formatter = lambda { |s, d, p, m| "#{m.ansi(:faint, :cyan)}\n" }
|
44
|
+
ActiveRecord::Base.logger = logger unless ENV['QUIET']
|
45
|
+
|
46
|
+
ActiveRecord::LogSubscriber.colorize_logging = false
|
47
|
+
ActiveRecord::Migration.verbose = false
|
48
|
+
|
49
|
+
tracer = ::Logger.new(STDERR)
|
50
|
+
tracer.formatter = lambda { |s, d, p, m| "#{m.gsub(/^.*$/) { |n| ' ' + n }.ansi(:faint)}\n" }
|
51
|
+
|
52
|
+
Elasticsearch::Model.client = Elasticsearch::Client.new host: 'localhost:9250',
|
53
|
+
tracer: (ENV['QUIET'] ? nil : tracer)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::AdapterActiveRecordTest < Test::Unit::TestCase
|
4
|
+
context "Adapter ActiveRecord module: " do
|
5
|
+
class ::DummyClassForActiveRecord
|
6
|
+
RESPONSE = Struct.new('DummyActiveRecordResponse') do
|
7
|
+
def response
|
8
|
+
{ 'hits' => {'hits' => [ {'_id' => 2}, {'_id' => 1} ]} }
|
9
|
+
end
|
10
|
+
end.new
|
11
|
+
|
12
|
+
def response
|
13
|
+
RESPONSE
|
14
|
+
end
|
15
|
+
|
16
|
+
def ids
|
17
|
+
[2, 1]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
RESPONSE = { 'hits' => { 'total' => 123, 'max_score' => 456, 'hits' => [] } }
|
22
|
+
|
23
|
+
setup do
|
24
|
+
@records = [ stub(id: 1, inspect: '<Model-1>'), stub(id: 2, inspect: '<Model-2>') ]
|
25
|
+
@records.stubs(:load).returns(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
should "have the register condition" do
|
29
|
+
assert_not_nil Elasticsearch::Model::Adapter.adapters[Elasticsearch::Model::Adapter::ActiveRecord]
|
30
|
+
assert_equal false, Elasticsearch::Model::Adapter.adapters[Elasticsearch::Model::Adapter::ActiveRecord].call(DummyClassForActiveRecord)
|
31
|
+
end
|
32
|
+
|
33
|
+
context "Records" do
|
34
|
+
setup do
|
35
|
+
DummyClassForActiveRecord.__send__ :include, Elasticsearch::Model::Adapter::ActiveRecord::Records
|
36
|
+
end
|
37
|
+
|
38
|
+
should "have the implementation" do
|
39
|
+
assert_instance_of Module, Elasticsearch::Model::Adapter::ActiveRecord::Records
|
40
|
+
|
41
|
+
instance = DummyClassForActiveRecord.new
|
42
|
+
instance.expects(:klass).returns(mock('class', where: @records))
|
43
|
+
|
44
|
+
assert_equal @records, instance.records
|
45
|
+
end
|
46
|
+
|
47
|
+
should "load the records" do
|
48
|
+
instance = DummyClassForActiveRecord.new
|
49
|
+
instance.expects(:records).returns(@records)
|
50
|
+
instance.load
|
51
|
+
end
|
52
|
+
|
53
|
+
should "reorder the records based on hits order" do
|
54
|
+
@records.instance_variable_set(:@records, @records)
|
55
|
+
|
56
|
+
instance = DummyClassForActiveRecord.new
|
57
|
+
instance.expects(:klass).returns(mock('class', where: @records))
|
58
|
+
|
59
|
+
assert_equal [1, 2], @records. to_a.map(&:id)
|
60
|
+
assert_equal [2, 1], instance.records.to_a.map(&:id)
|
61
|
+
end
|
62
|
+
|
63
|
+
should "not reorder records when SQL order is present" do
|
64
|
+
@records.instance_variable_set(:@records, @records)
|
65
|
+
|
66
|
+
instance = DummyClassForActiveRecord.new
|
67
|
+
instance.expects(:klass).returns(stub('class', where: @records)).at_least_once
|
68
|
+
instance.records.expects(:order).returns(@records)
|
69
|
+
|
70
|
+
assert_equal [2, 1], instance.records. to_a.map(&:id)
|
71
|
+
assert_equal [1, 2], instance.order(:foo).to_a.map(&:id)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "Callbacks" do
|
76
|
+
should "register hooks for automatically updating the index" do
|
77
|
+
DummyClassForActiveRecord.expects(:after_commit).times(3)
|
78
|
+
|
79
|
+
Elasticsearch::Model::Adapter::ActiveRecord::Callbacks.included(DummyClassForActiveRecord)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "Importing" do
|
84
|
+
should "implement the __find_in_batches method" do
|
85
|
+
DummyClassForActiveRecord.expects(:find_in_batches).returns([])
|
86
|
+
|
87
|
+
DummyClassForActiveRecord.__send__ :extend, Elasticsearch::Model::Adapter::ActiveRecord::Importing
|
88
|
+
DummyClassForActiveRecord.__find_in_batches do; end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::AdapterDefaultTest < Test::Unit::TestCase
|
4
|
+
context "Adapter default module" do
|
5
|
+
class ::DummyClassForDefaultAdapter; end
|
6
|
+
|
7
|
+
should "have the default Records implementation" do
|
8
|
+
assert_instance_of Module, Elasticsearch::Model::Adapter::Default::Records
|
9
|
+
|
10
|
+
DummyClassForDefaultAdapter.__send__ :include, Elasticsearch::Model::Adapter::Default::Records
|
11
|
+
|
12
|
+
instance = DummyClassForDefaultAdapter.new
|
13
|
+
klass = mock('class', find: [1])
|
14
|
+
instance.expects(:klass).returns(klass)
|
15
|
+
instance.records
|
16
|
+
end
|
17
|
+
|
18
|
+
should "have the default Callbacks implementation" do
|
19
|
+
assert_instance_of Module, Elasticsearch::Model::Adapter::Default::Callbacks
|
20
|
+
end
|
21
|
+
|
22
|
+
should "have the default Importing implementation" do
|
23
|
+
DummyClassForDefaultAdapter.__send__ :include, Elasticsearch::Model::Adapter::Default::Importing
|
24
|
+
|
25
|
+
assert_raise Elasticsearch::Model::NotImplemented do
|
26
|
+
DummyClassForDefaultAdapter.new.__find_in_batches
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::AdapterMongoidTest < Test::Unit::TestCase
|
4
|
+
context "Adapter Mongoid module: " do
|
5
|
+
class ::DummyClassForMongoid
|
6
|
+
RESPONSE = Struct.new('DummyMongoidResponse') do
|
7
|
+
def response
|
8
|
+
{ 'hits' => {'hits' => [ {'_id' => 2}, {'_id' => 1} ]} }
|
9
|
+
end
|
10
|
+
end.new
|
11
|
+
|
12
|
+
def response
|
13
|
+
RESPONSE
|
14
|
+
end
|
15
|
+
|
16
|
+
def ids
|
17
|
+
[2, 1]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
setup do
|
22
|
+
@records = [ stub(id: 1, inspect: '<Model-1>'), stub(id: 2, inspect: '<Model-2>') ]
|
23
|
+
::Symbol.any_instance.stubs(:in).returns(@records)
|
24
|
+
end
|
25
|
+
|
26
|
+
should "have the register condition" do
|
27
|
+
assert_not_nil Elasticsearch::Model::Adapter.adapters[Elasticsearch::Model::Adapter::Mongoid]
|
28
|
+
assert_equal false, Elasticsearch::Model::Adapter.adapters[Elasticsearch::Model::Adapter::Mongoid].call(DummyClassForMongoid)
|
29
|
+
end
|
30
|
+
|
31
|
+
context "Records" do
|
32
|
+
setup do
|
33
|
+
DummyClassForMongoid.__send__ :include, Elasticsearch::Model::Adapter::Mongoid::Records
|
34
|
+
end
|
35
|
+
|
36
|
+
should "have the implementation" do
|
37
|
+
assert_instance_of Module, Elasticsearch::Model::Adapter::Mongoid::Records
|
38
|
+
|
39
|
+
instance = DummyClassForMongoid.new
|
40
|
+
instance.expects(:klass).returns(mock('class', where: @records))
|
41
|
+
|
42
|
+
assert_equal @records, instance.records
|
43
|
+
end
|
44
|
+
|
45
|
+
should "reorder the records based on hits order" do
|
46
|
+
@records.instance_variable_set(:@records, @records)
|
47
|
+
|
48
|
+
instance = DummyClassForMongoid.new
|
49
|
+
instance.expects(:klass).returns(mock('class', where: @records))
|
50
|
+
|
51
|
+
assert_equal [1, 2], @records. to_a.map(&:id)
|
52
|
+
assert_equal [2, 1], instance.records.to_a.map(&:id)
|
53
|
+
end
|
54
|
+
|
55
|
+
should "not reorder records when SQL order is present" do
|
56
|
+
@records.instance_variable_set(:@records, @records)
|
57
|
+
|
58
|
+
instance = DummyClassForMongoid.new
|
59
|
+
instance.expects(:klass).returns(stub('class', where: @records)).at_least_once
|
60
|
+
instance.records.expects(:asc).returns(@records)
|
61
|
+
|
62
|
+
assert_equal [2, 1], instance.records.to_a.map(&:id)
|
63
|
+
assert_equal [1, 2], instance.asc.to_a.map(&:id)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "Callbacks" do
|
68
|
+
should "register hooks for automatically updating the index" do
|
69
|
+
DummyClassForMongoid.expects(:after_create)
|
70
|
+
DummyClassForMongoid.expects(:after_update)
|
71
|
+
DummyClassForMongoid.expects(:after_destroy)
|
72
|
+
|
73
|
+
Elasticsearch::Model::Adapter::Mongoid::Callbacks.included(DummyClassForMongoid)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "Importing" do
|
78
|
+
should "implement the __find_in_batches method" do
|
79
|
+
DummyClassForMongoid.expects(:all).returns([])
|
80
|
+
|
81
|
+
DummyClassForMongoid.__send__ :extend, Elasticsearch::Model::Adapter::Mongoid::Importing
|
82
|
+
DummyClassForMongoid.__find_in_batches do; end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::AdapterTest < Test::Unit::TestCase
|
4
|
+
context "Adapter module" do
|
5
|
+
class ::DummyAdapterClass; end
|
6
|
+
class ::DummyAdapterClassWithAdapter; end
|
7
|
+
class ::DummyAdapter
|
8
|
+
Records = Module.new
|
9
|
+
Callbacks = Module.new
|
10
|
+
Importing = Module.new
|
11
|
+
end
|
12
|
+
|
13
|
+
should "return an Adapter instance" do
|
14
|
+
assert_instance_of Elasticsearch::Model::Adapter::Adapter,
|
15
|
+
Elasticsearch::Model::Adapter.from_class(DummyAdapterClass)
|
16
|
+
end
|
17
|
+
|
18
|
+
should "return a list of adapters" do
|
19
|
+
Elasticsearch::Model::Adapter::Adapter.expects(:adapters)
|
20
|
+
Elasticsearch::Model::Adapter.adapters
|
21
|
+
end
|
22
|
+
|
23
|
+
should "register an adapter" do
|
24
|
+
begin
|
25
|
+
Elasticsearch::Model::Adapter::Adapter.expects(:register)
|
26
|
+
Elasticsearch::Model::Adapter.register(:foo, lambda { |c| false })
|
27
|
+
ensure
|
28
|
+
Elasticsearch::Model::Adapter::Adapter.instance_variable_set(:@adapters, {})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "Adapter class" do
|
34
|
+
should "register an adapter" do
|
35
|
+
begin
|
36
|
+
Elasticsearch::Model::Adapter::Adapter.register(:foo, lambda { |c| false })
|
37
|
+
assert Elasticsearch::Model::Adapter::Adapter.adapters[:foo]
|
38
|
+
ensure
|
39
|
+
Elasticsearch::Model::Adapter::Adapter.instance_variable_set(:@adapters, {})
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
should "return the default adapter" do
|
44
|
+
adapter = Elasticsearch::Model::Adapter::Adapter.new(DummyAdapterClass)
|
45
|
+
assert_equal Elasticsearch::Model::Adapter::Default, adapter.adapter
|
46
|
+
end
|
47
|
+
|
48
|
+
should "return a specific adapter" do
|
49
|
+
Elasticsearch::Model::Adapter::Adapter.register(DummyAdapter,
|
50
|
+
lambda { |c| c == DummyAdapterClassWithAdapter })
|
51
|
+
|
52
|
+
adapter = Elasticsearch::Model::Adapter::Adapter.new(DummyAdapterClassWithAdapter)
|
53
|
+
assert_equal DummyAdapter, adapter.adapter
|
54
|
+
end
|
55
|
+
|
56
|
+
should "return the modules" do
|
57
|
+
assert_nothing_raised do
|
58
|
+
Elasticsearch::Model::Adapter::Adapter.register(DummyAdapter,
|
59
|
+
lambda { |c| c == DummyAdapterClassWithAdapter })
|
60
|
+
|
61
|
+
adapter = Elasticsearch::Model::Adapter::Adapter.new(DummyAdapterClassWithAdapter)
|
62
|
+
|
63
|
+
assert_instance_of Module, adapter.records_mixin
|
64
|
+
assert_instance_of Module, adapter.callbacks_mixin
|
65
|
+
assert_instance_of Module, adapter.importing_mixin
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::CallbacksTest < Test::Unit::TestCase
|
4
|
+
context "Callbacks module" do
|
5
|
+
class ::DummyCallbacksModel
|
6
|
+
end
|
7
|
+
|
8
|
+
module DummyCallbacksAdapter
|
9
|
+
module CallbacksMixin
|
10
|
+
end
|
11
|
+
|
12
|
+
def callbacks_mixin
|
13
|
+
CallbacksMixin
|
14
|
+
end; module_function :callbacks_mixin
|
15
|
+
end
|
16
|
+
|
17
|
+
should "include the callbacks mixin from adapter" do
|
18
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
19
|
+
.with(DummyCallbacksModel)
|
20
|
+
.returns(DummyCallbacksAdapter)
|
21
|
+
|
22
|
+
::DummyCallbacksModel.expects(:__send__).with do |method, parameter|
|
23
|
+
assert_equal :include, method
|
24
|
+
assert_equal DummyCallbacksAdapter::CallbacksMixin, parameter
|
25
|
+
end
|
26
|
+
|
27
|
+
Elasticsearch::Model::Callbacks.included(DummyCallbacksModel)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::ClientTest < Test::Unit::TestCase
|
4
|
+
context "Client module" do
|
5
|
+
class ::DummyClientModel
|
6
|
+
extend Elasticsearch::Model::Client::ClassMethods
|
7
|
+
include Elasticsearch::Model::Client::InstanceMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
should "have the default client method" do
|
11
|
+
assert_instance_of Elasticsearch::Transport::Client, DummyClientModel.client
|
12
|
+
assert_instance_of Elasticsearch::Transport::Client, DummyClientModel.new.client
|
13
|
+
end
|
14
|
+
|
15
|
+
should "set the client for the model" do
|
16
|
+
DummyClientModel.client = 'foobar'
|
17
|
+
assert_equal 'foobar', DummyClientModel.client
|
18
|
+
assert_equal 'foobar', DummyClientModel.new.client
|
19
|
+
end
|
20
|
+
|
21
|
+
should "set the client for a model instance" do
|
22
|
+
instance = DummyClientModel.new
|
23
|
+
instance.client = 'moobam'
|
24
|
+
assert_equal 'moobam', instance.client
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Elasticsearch::Model::ImportingTest < Test::Unit::TestCase
|
4
|
+
context "Importing module" do
|
5
|
+
class ::DummyImportingModel
|
6
|
+
end
|
7
|
+
|
8
|
+
module ::DummyImportingAdapter
|
9
|
+
module ImportingMixin
|
10
|
+
def __find_in_batches(options={}, &block)
|
11
|
+
yield if block_given?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def importing_mixin
|
16
|
+
ImportingMixin
|
17
|
+
end; module_function :importing_mixin
|
18
|
+
end
|
19
|
+
|
20
|
+
should "include methods from the module and adapter" do
|
21
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
22
|
+
.with(DummyImportingModel)
|
23
|
+
.returns(DummyImportingAdapter)
|
24
|
+
|
25
|
+
DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
|
26
|
+
|
27
|
+
assert_respond_to DummyImportingModel, :import
|
28
|
+
assert_respond_to DummyImportingModel, :__find_in_batches
|
29
|
+
end
|
30
|
+
|
31
|
+
should "call the client when importing" do
|
32
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
33
|
+
.with(DummyImportingModel)
|
34
|
+
.returns(DummyImportingAdapter)
|
35
|
+
|
36
|
+
DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
|
37
|
+
|
38
|
+
client = mock('client')
|
39
|
+
client.expects(:bulk).returns({'items' => []})
|
40
|
+
|
41
|
+
DummyImportingModel.expects(:client).returns(client)
|
42
|
+
DummyImportingModel.expects(:index_name).returns('foo')
|
43
|
+
DummyImportingModel.expects(:document_type).returns('foo')
|
44
|
+
|
45
|
+
assert_equal 0, DummyImportingModel.import
|
46
|
+
end
|
47
|
+
|
48
|
+
should "return number of errors" do
|
49
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
50
|
+
.with(DummyImportingModel)
|
51
|
+
.returns(DummyImportingAdapter)
|
52
|
+
|
53
|
+
DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
|
54
|
+
|
55
|
+
client = mock('client')
|
56
|
+
client.expects(:bulk).returns({'items' => [ {'index' => {}}, {'index' => {'error' => 'FAILED'}} ]})
|
57
|
+
|
58
|
+
DummyImportingModel.stubs(:client).returns(client)
|
59
|
+
DummyImportingModel.stubs(:index_name).returns('foo')
|
60
|
+
DummyImportingModel.stubs(:document_type).returns('foo')
|
61
|
+
|
62
|
+
assert_equal 1, DummyImportingModel.import
|
63
|
+
end
|
64
|
+
|
65
|
+
should "yield the response" do
|
66
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
67
|
+
.with(DummyImportingModel)
|
68
|
+
.returns(DummyImportingAdapter)
|
69
|
+
|
70
|
+
DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
|
71
|
+
|
72
|
+
client = mock('client')
|
73
|
+
client.expects(:bulk).returns({'items' => [ {'index' => {}}, {'index' => {'error' => 'FAILED'}} ]})
|
74
|
+
|
75
|
+
DummyImportingModel.stubs(:client).returns(client)
|
76
|
+
DummyImportingModel.stubs(:index_name).returns('foo')
|
77
|
+
DummyImportingModel.stubs(:document_type).returns('foo')
|
78
|
+
|
79
|
+
DummyImportingModel.import do |response|
|
80
|
+
assert_equal 2, response['items'].size
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
should "delete and create the index with the force option" do
|
85
|
+
DummyImportingModel.expects(:__find_in_batches).with do |options|
|
86
|
+
assert_equal 'bar', options[:foo]
|
87
|
+
assert_nil options[:force]
|
88
|
+
end
|
89
|
+
|
90
|
+
DummyImportingModel.expects(:create_index!).with do |options|
|
91
|
+
assert_equal true, options[:force]
|
92
|
+
end
|
93
|
+
|
94
|
+
DummyImportingModel.import force: true, foo: 'bar'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|