sunspot 2.0.0 → 2.5.0

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.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -0
  4. data/Appraisals +7 -0
  5. data/Gemfile +0 -2
  6. data/History.txt +10 -0
  7. data/lib/sunspot.rb +55 -17
  8. data/lib/sunspot/adapters.rb +68 -18
  9. data/lib/sunspot/batcher.rb +1 -1
  10. data/lib/sunspot/configuration.rb +4 -2
  11. data/lib/sunspot/data_extractor.rb +36 -6
  12. data/lib/sunspot/dsl.rb +4 -3
  13. data/lib/sunspot/dsl/adjustable.rb +2 -2
  14. data/lib/sunspot/dsl/field_query.rb +69 -16
  15. data/lib/sunspot/dsl/field_stats.rb +25 -0
  16. data/lib/sunspot/dsl/fields.rb +28 -8
  17. data/lib/sunspot/dsl/fulltext.rb +9 -1
  18. data/lib/sunspot/dsl/group.rb +118 -0
  19. data/lib/sunspot/dsl/paginatable.rb +4 -1
  20. data/lib/sunspot/dsl/scope.rb +19 -10
  21. data/lib/sunspot/dsl/search.rb +1 -1
  22. data/lib/sunspot/dsl/spellcheckable.rb +14 -0
  23. data/lib/sunspot/dsl/standard_query.rb +63 -35
  24. data/lib/sunspot/field.rb +76 -4
  25. data/lib/sunspot/field_factory.rb +60 -11
  26. data/lib/sunspot/indexer.rb +70 -18
  27. data/lib/sunspot/query.rb +5 -4
  28. data/lib/sunspot/query/abstract_field_facet.rb +0 -2
  29. data/lib/sunspot/query/abstract_fulltext.rb +76 -0
  30. data/lib/sunspot/query/abstract_json_field_facet.rb +70 -0
  31. data/lib/sunspot/query/bbox.rb +5 -1
  32. data/lib/sunspot/query/common_query.rb +31 -6
  33. data/lib/sunspot/query/composite_fulltext.rb +58 -8
  34. data/lib/sunspot/query/date_field_json_facet.rb +25 -0
  35. data/lib/sunspot/query/dismax.rb +25 -71
  36. data/lib/sunspot/query/field_json_facet.rb +19 -0
  37. data/lib/sunspot/query/field_list.rb +15 -0
  38. data/lib/sunspot/query/field_stats.rb +61 -0
  39. data/lib/sunspot/query/function_query.rb +1 -2
  40. data/lib/sunspot/query/geo.rb +1 -1
  41. data/lib/sunspot/query/geofilt.rb +8 -3
  42. data/lib/sunspot/query/group.rb +46 -0
  43. data/lib/sunspot/query/group_query.rb +17 -0
  44. data/lib/sunspot/query/join.rb +88 -0
  45. data/lib/sunspot/query/more_like_this.rb +1 -1
  46. data/lib/sunspot/query/pagination.rb +12 -4
  47. data/lib/sunspot/query/range_json_facet.rb +28 -0
  48. data/lib/sunspot/query/restriction.rb +99 -13
  49. data/lib/sunspot/query/sort.rb +41 -0
  50. data/lib/sunspot/query/sort_composite.rb +7 -0
  51. data/lib/sunspot/query/spellcheck.rb +19 -0
  52. data/lib/sunspot/query/standard_query.rb +24 -2
  53. data/lib/sunspot/query/text_field_boost.rb +1 -3
  54. data/lib/sunspot/schema.rb +12 -3
  55. data/lib/sunspot/search.rb +4 -2
  56. data/lib/sunspot/search/abstract_search.rb +93 -43
  57. data/lib/sunspot/search/cursor_paginated_collection.rb +32 -0
  58. data/lib/sunspot/search/field_facet.rb +4 -4
  59. data/lib/sunspot/search/field_json_facet.rb +33 -0
  60. data/lib/sunspot/search/field_stats.rb +21 -0
  61. data/lib/sunspot/search/hit.rb +6 -1
  62. data/lib/sunspot/search/hit_enumerable.rb +4 -1
  63. data/lib/sunspot/search/json_facet_row.rb +40 -0
  64. data/lib/sunspot/search/json_facet_stats.rb +23 -0
  65. data/lib/sunspot/search/paginated_collection.rb +1 -0
  66. data/lib/sunspot/search/query_group.rb +74 -0
  67. data/lib/sunspot/search/standard_search.rb +70 -3
  68. data/lib/sunspot/search/stats_facet.rb +25 -0
  69. data/lib/sunspot/search/stats_json_row.rb +82 -0
  70. data/lib/sunspot/search/stats_row.rb +68 -0
  71. data/lib/sunspot/session.rb +62 -37
  72. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +6 -4
  73. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +16 -8
  74. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +2 -2
  75. data/lib/sunspot/session_proxy/retry_5xx_session_proxy.rb +1 -1
  76. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +4 -2
  77. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +1 -1
  78. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +6 -4
  79. data/lib/sunspot/setup.rb +42 -0
  80. data/lib/sunspot/type.rb +20 -0
  81. data/lib/sunspot/util.rb +78 -14
  82. data/lib/sunspot/version.rb +1 -1
  83. data/spec/api/adapters_spec.rb +40 -15
  84. data/spec/api/batcher_spec.rb +15 -15
  85. data/spec/api/binding_spec.rb +3 -3
  86. data/spec/api/class_set_spec.rb +6 -6
  87. data/spec/api/data_extractor_spec.rb +39 -0
  88. data/spec/api/hit_enumerable_spec.rb +32 -9
  89. data/spec/api/indexer/attributes_spec.rb +35 -30
  90. data/spec/api/indexer/batch_spec.rb +8 -7
  91. data/spec/api/indexer/dynamic_fields_spec.rb +8 -8
  92. data/spec/api/indexer/fixed_fields_spec.rb +16 -11
  93. data/spec/api/indexer/fulltext_spec.rb +8 -8
  94. data/spec/api/indexer/removal_spec.rb +24 -14
  95. data/spec/api/indexer_spec.rb +2 -2
  96. data/spec/api/query/advanced_manipulation_examples.rb +3 -3
  97. data/spec/api/query/connectives_examples.rb +26 -14
  98. data/spec/api/query/dsl_spec.rb +24 -6
  99. data/spec/api/query/dynamic_fields_examples.rb +18 -18
  100. data/spec/api/query/faceting_examples.rb +80 -61
  101. data/spec/api/query/fulltext_examples.rb +194 -40
  102. data/spec/api/query/function_spec.rb +116 -13
  103. data/spec/api/query/geo_examples.rb +8 -12
  104. data/spec/api/query/group_spec.rb +27 -5
  105. data/spec/api/query/highlighting_examples.rb +26 -26
  106. data/spec/api/query/join_spec.rb +19 -0
  107. data/spec/api/query/more_like_this_spec.rb +40 -27
  108. data/spec/api/query/ordering_pagination_examples.rb +37 -23
  109. data/spec/api/query/scope_examples.rb +39 -39
  110. data/spec/api/query/spatial_examples.rb +3 -3
  111. data/spec/api/query/spellcheck_examples.rb +20 -0
  112. data/spec/api/query/standard_spec.rb +3 -1
  113. data/spec/api/query/stats_examples.rb +66 -0
  114. data/spec/api/query/text_field_scoping_examples.rb +5 -5
  115. data/spec/api/query/types_spec.rb +4 -4
  116. data/spec/api/search/cursor_paginated_collection_spec.rb +35 -0
  117. data/spec/api/search/dynamic_fields_spec.rb +4 -4
  118. data/spec/api/search/faceting_spec.rb +55 -52
  119. data/spec/api/search/highlighting_spec.rb +7 -7
  120. data/spec/api/search/hits_spec.rb +43 -29
  121. data/spec/api/search/paginated_collection_spec.rb +19 -18
  122. data/spec/api/search/results_spec.rb +13 -13
  123. data/spec/api/search/search_spec.rb +3 -3
  124. data/spec/api/search/stats_spec.rb +94 -0
  125. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +23 -16
  126. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +16 -4
  127. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +10 -6
  128. data/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +11 -11
  129. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +15 -14
  130. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +3 -3
  131. data/spec/api/session_proxy/spec_helper.rb +1 -1
  132. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +40 -26
  133. data/spec/api/session_spec.rb +78 -38
  134. data/spec/api/sunspot_spec.rb +7 -4
  135. data/spec/helpers/integration_helper.rb +11 -1
  136. data/spec/helpers/query_helper.rb +1 -1
  137. data/spec/helpers/search_helper.rb +30 -0
  138. data/spec/integration/atomic_updates_spec.rb +58 -0
  139. data/spec/integration/dynamic_fields_spec.rb +31 -20
  140. data/spec/integration/faceting_spec.rb +252 -39
  141. data/spec/integration/field_grouping_spec.rb +47 -15
  142. data/spec/integration/field_lists_spec.rb +57 -0
  143. data/spec/integration/geospatial_spec.rb +34 -8
  144. data/spec/integration/highlighting_spec.rb +8 -8
  145. data/spec/integration/indexing_spec.rb +7 -6
  146. data/spec/integration/join_spec.rb +45 -0
  147. data/spec/integration/keyword_search_spec.rb +68 -38
  148. data/spec/integration/local_search_spec.rb +4 -4
  149. data/spec/integration/more_like_this_spec.rb +7 -7
  150. data/spec/integration/scoped_search_spec.rb +193 -74
  151. data/spec/integration/spellcheck_spec.rb +119 -0
  152. data/spec/integration/stats_spec.rb +88 -0
  153. data/spec/integration/stored_fields_spec.rb +1 -1
  154. data/spec/integration/test_pagination.rb +4 -4
  155. data/spec/integration/unicode_spec.rb +1 -1
  156. data/spec/mocks/adapters.rb +36 -0
  157. data/spec/mocks/connection.rb +5 -3
  158. data/spec/mocks/photo.rb +32 -1
  159. data/spec/mocks/post.rb +18 -3
  160. data/spec/spec_helper.rb +13 -8
  161. data/sunspot.gemspec +6 -4
  162. data/tasks/rdoc.rake +22 -14
  163. metadata +101 -44
  164. data/lib/sunspot/dsl/field_group.rb +0 -57
  165. data/lib/sunspot/query/field_group.rb +0 -37
@@ -9,8 +9,8 @@ describe Sunspot::SessionProxy::ClassShardingSessionProxy do
9
9
  it "should delegate #{method} to appropriate shard" do
10
10
  post = Post.new
11
11
  photo = Photo.new
12
- @proxy.post_session.should_receive(method).with([post])
13
- @proxy.photo_session.should_receive(method).with([photo])
12
+ expect(@proxy.post_session).to receive(method).with([post])
13
+ expect(@proxy.photo_session).to receive(method).with([photo])
14
14
  @proxy.send(method, post)
15
15
  @proxy.send(method, photo)
16
16
  end
@@ -18,24 +18,30 @@ describe Sunspot::SessionProxy::ClassShardingSessionProxy do
18
18
 
19
19
  [:remove_by_id, :remove_by_id!].each do |method|
20
20
  it "should delegate #{method} to appropriate shard" do
21
- @proxy.post_session.should_receive(method).with(Post, 1)
22
- @proxy.photo_session.should_receive(method).with(Photo, 1)
21
+ expect(@proxy.post_session).to receive(method).with(Post, [1])
22
+ expect(@proxy.photo_session).to receive(method).with(Photo, [1])
23
23
  @proxy.send(method, Post, 1)
24
24
  @proxy.send(method, Photo, 1)
25
25
  end
26
+ it "should delegate #{method} to appropriate shard given ids" do
27
+ expect(@proxy.post_session).to receive(method).with(Post, [1, 2])
28
+ expect(@proxy.photo_session).to receive(method).with(Photo, [1, 2])
29
+ @proxy.send(method, Post, 1, 2)
30
+ @proxy.send(method, Photo, [1, 2])
31
+ end
26
32
  end
27
33
 
28
34
  [:remove_all, :remove_all!].each do |method|
29
35
  it "should delegate #{method} with argument to appropriate shard" do
30
- @proxy.post_session.should_receive(method).with(Post)
31
- @proxy.photo_session.should_receive(method).with(Photo)
36
+ expect(@proxy.post_session).to receive(method).with(Post)
37
+ expect(@proxy.photo_session).to receive(method).with(Photo)
32
38
  @proxy.send(method, Post)
33
39
  @proxy.send(method, Photo)
34
40
  end
35
41
 
36
42
  it "should delegate #{method} without argument to all shards" do
37
- @proxy.post_session.should_receive(method)
38
- @proxy.photo_session.should_receive(method)
43
+ expect(@proxy.post_session).to receive(method)
44
+ expect(@proxy.photo_session).to receive(method)
39
45
  @proxy.send(method)
40
46
  end
41
47
  end
@@ -43,42 +49,43 @@ describe Sunspot::SessionProxy::ClassShardingSessionProxy do
43
49
  [:commit, :commit_if_dirty, :commit_if_delete_dirty, :optimize].each do |method|
44
50
  it "should delegate #{method} to all sessions" do
45
51
  [@proxy.post_session, @proxy.photo_session].each do |session|
46
- session.should_receive(method)
52
+ expect(session).to receive(method)
47
53
  end
48
54
  @proxy.send(method)
49
55
  end
50
56
  end
51
57
 
52
58
  it "should not support the :batch method" do
53
- lambda { @proxy.batch }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
59
+ expect { @proxy.batch }.to raise_error(Sunspot::SessionProxy::NotSupportedError)
54
60
  end
55
61
 
56
62
  it "should delegate new_search to search session, adding in shards parameter" do
57
63
  search = @proxy.new_search(Post)
58
- search.query[:shards].should ==
64
+ expect(search.query[:shards]).to eq(
59
65
  'http://photos.solr.local/solr,http://posts.solr.local/solr'
66
+ )
60
67
  end
61
68
 
62
69
  it "should delegate search to search session, adding in shards parameter" do
63
70
  @proxy.search(Post)
64
- connection.should have_last_search_with(
71
+ expect(connection).to have_last_search_with(
65
72
  :shards => 'http://photos.solr.local/solr,http://posts.solr.local/solr'
66
73
  )
67
74
  end
68
75
 
69
76
  [:dirty, :delete_dirty].each do |method|
70
77
  it "should be dirty if any of the sessions are dirty" do
71
- @proxy.post_session.stub!(:"#{method}?").and_return(true)
72
- @proxy.should send("be_#{method}")
78
+ allow(@proxy.post_session).to receive(:"#{method}?").and_return(true)
79
+ expect(@proxy).to send("be_#{method}")
73
80
  end
74
81
 
75
82
  it "should not be dirty if none of the sessions are dirty" do
76
- @proxy.should_not send("be_#{method}")
83
+ expect(@proxy).not_to send("be_#{method}")
77
84
  end
78
85
  end
79
86
 
80
87
  it "should raise a NotSupportedError when :config is called" do
81
- lambda { @proxy.config }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
88
+ expect { @proxy.config }.to raise_error(Sunspot::SessionProxy::NotSupportedError)
82
89
  end
83
90
 
84
91
  it_should_behave_like 'session proxy'
@@ -10,8 +10,8 @@ describe Sunspot::SessionProxy::ShardingSessionProxy do
10
10
  [:index, :index!, :remove, :remove!].each do |method|
11
11
  it "should delegate #{method} to appropriate shard" do
12
12
  posts = [Post.new(:id => 2), Post.new(:id => 1)]
13
- @proxy.sessions[0].should_receive(method).with([posts[0]])
14
- @proxy.sessions[1].should_receive(method).with([posts[1]])
13
+ expect(@proxy.sessions[0]).to receive(method).with([posts[0]])
14
+ expect(@proxy.sessions[1]).to receive(method).with([posts[1]])
15
15
  @proxy.send(method, posts[0])
16
16
  @proxy.send(method, posts[1])
17
17
  end
@@ -19,10 +19,22 @@ describe Sunspot::SessionProxy::ShardingSessionProxy do
19
19
 
20
20
  [:remove_by_id, :remove_by_id!].each do |method|
21
21
  it "should delegate #{method} to appropriate session" do
22
- @proxy.sessions[0].should_receive(method).with(Post, 2)
23
- @proxy.sessions[1].should_receive(method).with(Post, 1)
22
+ expect(@proxy.sessions[1]).to receive(method).with(Post, [3])
23
+ expect(@proxy.sessions[0]).to receive(method).with(Post, [2])
24
+ expect(@proxy.sessions[1]).to receive(method).with(Post, [1])
24
25
  @proxy.send(method, Post, 1)
25
26
  @proxy.send(method, Post, 2)
27
+ @proxy.send(method, Post, 3)
28
+ end
29
+ it "should delegate #{method} to appropriate session given splatted index ids" do
30
+ expect(@proxy.sessions[0]).to receive(method).with(Post, [2])
31
+ expect(@proxy.sessions[1]).to receive(method).with(Post, [1, 3])
32
+ @proxy.send(method, Post, 1, 2, 3)
33
+ end
34
+ it "should delegate #{method} to appropriate session given array of index ids" do
35
+ expect(@proxy.sessions[0]).to receive(method).with(Post, [2])
36
+ expect(@proxy.sessions[1]).to receive(method).with(Post, [1, 3])
37
+ @proxy.send(method, Post, [1, 2, 3])
26
38
  end
27
39
  end
28
40
 
@@ -13,28 +13,32 @@ describe Sunspot::SessionProxy::MasterSlaveSessionProxy do
13
13
  methods.each do |method|
14
14
  it "should delegate #{method} to #{delegate}" do
15
15
  args = Array.new(Sunspot::Session.instance_method(method).arity.abs) do
16
- stub('arg')
16
+ double('arg')
17
+ end
18
+ if args.empty?
19
+ expect(instance_variable_get(:"@#{delegate}")).to receive(method).with(no_args)
20
+ else
21
+ expect(instance_variable_get(:"@#{delegate}")).to receive(method).with(*args)
17
22
  end
18
- instance_variable_get(:"@#{delegate}").should_receive(method).with(*args)
19
23
  @proxy.send(method, *args)
20
24
  end
21
25
  end
22
26
  end
23
27
 
24
28
  it 'should return master session config by default' do
25
- @proxy.config.should eql(@master_session.config)
29
+ expect(@proxy.config).to eql(@master_session.config)
26
30
  end
27
31
 
28
32
  it 'should return master session config when specified' do
29
- @proxy.config(:master).should eql(@master_session.config)
33
+ expect(@proxy.config(:master)).to eql(@master_session.config)
30
34
  end
31
35
 
32
36
  it 'should return slave session config when specified' do
33
- @proxy.config(:slave).should eql(@slave_session.config)
37
+ expect(@proxy.config(:slave)).to eql(@slave_session.config)
34
38
  end
35
39
 
36
40
  it 'should raise ArgumentError when bogus config specified' do
37
- lambda { @proxy.config(:bogus) }.should raise_error
41
+ expect { @proxy.config(:bogus) }.to raise_error
38
42
  end
39
43
 
40
44
  it_should_behave_like 'session proxy'
@@ -33,14 +33,14 @@ describe Sunspot::SessionProxy::Retry5xxSessionProxy do
33
33
  end
34
34
 
35
35
  it "should behave normally without a stubbed exception" do
36
- @sunspot_session.should_receive(:index).and_return(mock)
36
+ expect(@sunspot_session).to receive(:index).and_return(double)
37
37
  Sunspot.index(post)
38
38
  end
39
39
 
40
40
  it "should be successful with a single exception followed by a sucess" do
41
41
  e = FakeRSolrErrorHttp.new(fake_rsolr_request, fake_rsolr_response(503))
42
- @sunspot_session.should_receive(:index).and_return do
43
- @sunspot_session.should_receive(:index).and_return(mock)
42
+ expect(@sunspot_session).to receive(:index) do
43
+ expect(@sunspot_session).to receive(:index).and_return(double)
44
44
  raise e
45
45
  end
46
46
  Sunspot.index(post)
@@ -49,25 +49,25 @@ describe Sunspot::SessionProxy::Retry5xxSessionProxy do
49
49
  it "should return the error response after two exceptions" do
50
50
  fake_response = fake_rsolr_response(503)
51
51
  e = FakeRSolrErrorHttp.new(fake_rsolr_request, fake_response)
52
- fake_success = mock('success')
52
+ fake_success = double('success')
53
53
 
54
- @sunspot_session.should_receive(:index).and_return do
55
- @sunspot_session.should_receive(:index).and_return do
56
- @sunspot_session.stub!(:index).and_return(fake_success)
54
+ expect(@sunspot_session).to receive(:index) do
55
+ expect(@sunspot_session).to receive(:index) do
56
+ allow(@sunspot_session).to receive(:index).and_return(fake_success)
57
57
  raise e
58
58
  end
59
59
  raise e
60
60
  end
61
61
 
62
62
  response = Sunspot.index(post)
63
- response.should_not == fake_success
64
- response.should == fake_response
63
+ expect(response).not_to eq(fake_success)
64
+ expect(response).to eq(fake_response)
65
65
  end
66
66
 
67
67
  it "should not retry a 4xx" do
68
68
  e = FakeRSolrErrorHttp.new(fake_rsolr_request, fake_rsolr_response(400))
69
- @sunspot_session.should_receive(:index).and_raise(e)
70
- lambda { Sunspot.index(post) }.should raise_error
69
+ expect(@sunspot_session).to receive(:index).and_raise(e)
70
+ expect { Sunspot.index(post) }.to raise_error
71
71
  end
72
72
 
73
73
  # TODO: try against more than just Sunspot.index? but that's just testing the
@@ -8,26 +8,26 @@ describe Sunspot::SessionProxy::ShardingSessionProxy do
8
8
  [:index, :index!, :remove, :remove!].each do |method|
9
9
  it "should delegate #{method} to appropriate shard" do
10
10
  posts = [Post.new(:blog_id => 2), Post.new(:blog_id => 3)]
11
- @proxy.sessions[0].should_receive(method).with([posts[0]])
12
- @proxy.sessions[1].should_receive(method).with([posts[1]])
11
+ expect(@proxy.sessions[0]).to receive(method).with([posts[0]])
12
+ expect(@proxy.sessions[1]).to receive(method).with([posts[1]])
13
13
  @proxy.send(method, posts[0])
14
14
  @proxy.send(method, posts[1])
15
15
  end
16
16
  end
17
17
 
18
- [:remove_by_id, :remove_by_id!].each do |method|
18
+ [:remove_by_id, :remove_by_id!, :atomic_update, :atomic_update!].each do |method|
19
19
  it "should raise NotSupportedError when #{method} called" do
20
- lambda { @proxy.send(method, Post, 1) }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
20
+ expect { @proxy.send(method, Post, 1) }.to raise_error(Sunspot::SessionProxy::NotSupportedError)
21
21
  end
22
22
  end
23
23
 
24
24
  [:remove_all, :remove_all!].each do |method|
25
25
  it "should raise NotSupportedError when #{method} called with argument" do
26
- lambda { @proxy.send(method, Post) }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
26
+ expect { @proxy.send(method, Post) }.to raise_error(Sunspot::SessionProxy::NotSupportedError)
27
27
  end
28
28
 
29
29
  it "should delegate #{method} without argument to all shards" do
30
- @proxy.sessions.each { |session| session.should_receive(method) }
30
+ @proxy.sessions.each { |session| expect(session).to receive(method) }
31
31
  @proxy.send(method)
32
32
  end
33
33
  end
@@ -35,42 +35,43 @@ describe Sunspot::SessionProxy::ShardingSessionProxy do
35
35
  [:commit, :commit_if_dirty, :commit_if_delete_dirty, :optimize].each do |method|
36
36
  it "should delegate #{method} to all sessions" do
37
37
  @proxy.sessions.each do |session|
38
- session.should_receive(method)
38
+ expect(session).to receive(method)
39
39
  end
40
40
  @proxy.send(method)
41
41
  end
42
42
  end
43
43
 
44
44
  it "should not support the :batch method" do
45
- lambda { @proxy.batch }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
45
+ expect { @proxy.batch }.to raise_error(Sunspot::SessionProxy::NotSupportedError)
46
46
  end
47
47
 
48
48
  it "should delegate new_search to search session, adding in shards parameter" do
49
49
  search = @proxy.new_search(Post)
50
- search.query[:shards].should ==
50
+ expect(search.query[:shards]).to eq(
51
51
  'http://localhost:8980/solr,http://localhost:8981/solr'
52
+ )
52
53
  end
53
54
 
54
55
  it "should delegate search to search session, adding in shards parameter" do
55
56
  @proxy.search(Post)
56
- connection.should have_last_search_with(
57
+ expect(connection).to have_last_search_with(
57
58
  :shards => 'http://localhost:8980/solr,http://localhost:8981/solr'
58
59
  )
59
60
  end
60
61
 
61
62
  [:dirty, :delete_dirty].each do |method|
62
63
  it "should be dirty if any of the sessions are dirty" do
63
- @proxy.sessions[0].stub!(:"#{method}?").and_return(true)
64
- @proxy.should send("be_#{method}")
64
+ allow(@proxy.sessions[0]).to receive(:"#{method}?").and_return(true)
65
+ expect(@proxy).to send("be_#{method}")
65
66
  end
66
67
 
67
68
  it "should not be dirty if none of the sessions are dirty" do
68
- @proxy.should_not send("be_#{method}")
69
+ expect(@proxy).not_to send("be_#{method}")
69
70
  end
70
71
  end
71
72
 
72
73
  it "should raise a NotSupportedError when :config is called" do
73
- lambda { @proxy.config }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
74
+ expect { @proxy.config }.to raise_error(Sunspot::SessionProxy::NotSupportedError)
74
75
  end
75
76
 
76
77
  it_should_behave_like 'session proxy'
@@ -6,15 +6,15 @@ describe Sunspot::SessionProxy::ShardingSessionProxy do
6
6
  SUPPORTED_METHODS = Sunspot::SessionProxy::SilentFailSessionProxy::SUPPORTED_METHODS
7
7
 
8
8
  before do
9
- @search_session = mock(Sunspot::Session.new)
9
+ @search_session = double(Sunspot::Session.new)
10
10
  @proxy = Sunspot::SessionProxy::SilentFailSessionProxy.new(@search_session)
11
11
  end
12
12
 
13
13
  it "should call rescued_exception when an exception is caught" do
14
14
  SUPPORTED_METHODS.each do |method|
15
15
  e = FakeException.new(method)
16
- @search_session.stub!(method).and_raise(e)
17
- @proxy.should_receive(:rescued_exception).with(method, e)
16
+ allow(@search_session).to receive(method).and_raise(e)
17
+ expect(@proxy).to receive(:rescued_exception).with(method, e)
18
18
  @proxy.send(method)
19
19
  end
20
20
  end
@@ -3,7 +3,7 @@ require File.expand_path('spec_helper', File.join(File.dirname(__FILE__), '..'))
3
3
  shared_examples_for 'session proxy' do
4
4
  Sunspot::Session.public_instance_methods(false).each do |method|
5
5
  it "should respond to #{method.inspect}" do
6
- @proxy.should respond_to(method)
6
+ expect(@proxy).to respond_to(method)
7
7
  end
8
8
  end
9
9
  end
@@ -2,38 +2,52 @@ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
2
  require 'weakref'
3
3
 
4
4
  describe Sunspot::SessionProxy::ThreadLocalSessionProxy do
5
- before :each do
6
- @config = Sunspot::Configuration.build
7
- @proxy = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(@config)
8
- end
5
+ context 'when not passing a config' do
6
+ before :each do
7
+ @proxy = Sunspot::SessionProxy::ThreadLocalSessionProxy.new
8
+ end
9
9
 
10
- it 'should have the same session for the same thread' do
11
- @proxy.session.should eql(@proxy.session)
10
+ it_should_behave_like 'session proxy'
12
11
  end
13
12
 
14
- it 'should not have the same session for different threads' do
15
- session1 = @proxy.session
16
- session2 = nil
17
- Thread.new do
18
- session2 = @proxy.session
19
- end.join
20
- session1.should_not eql(session2)
21
- end
13
+ context 'when passing a config' do
14
+ before :each do
15
+ @config = Sunspot::Configuration.build
16
+ @proxy = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(@config)
17
+ end
22
18
 
23
- it 'should not have the same session for the same thread in different proxy instances' do
24
- proxy2 = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(@config)
25
- @proxy.session.should_not eql(proxy2.session)
26
- end
19
+ it 'should have the same session for the same thread' do
20
+ expect(@proxy.session).to eql(@proxy.session)
21
+ end
27
22
 
28
- (Sunspot::Session.public_instance_methods(false) - ['config', :config]).each do |method|
29
- it "should delegate #{method.inspect} to its session" do
30
- args = Array.new(Sunspot::Session.instance_method(method).arity.abs) do
31
- stub('arg')
23
+ it 'should not have the same session for different threads' do
24
+ session1 = @proxy.session
25
+ session2 = nil
26
+ Thread.new do
27
+ session2 = @proxy.session
28
+ end.join
29
+ expect(session1).not_to eql(session2)
30
+ end
31
+
32
+ it 'should not have the same session for the same thread in different proxy instances' do
33
+ proxy2 = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(@config)
34
+ expect(@proxy.session).not_to eql(proxy2.session)
35
+ end
36
+
37
+ (Sunspot::Session.public_instance_methods(false) - ['config', :config]).each do |method|
38
+ it "should delegate #{method.inspect} to its session" do
39
+ args = Array.new(Sunspot::Session.instance_method(method).arity.abs) do
40
+ double('arg')
41
+ end
42
+ if args.empty?
43
+ expect(@proxy.session).to receive(method).with(no_args)
44
+ else
45
+ expect(@proxy.session).to receive(method).with(*args)
46
+ end
47
+ @proxy.send(method, *args)
32
48
  end
33
- @proxy.session.should_receive(method).with(*args)
34
- @proxy.send(method, *args)
35
49
  end
36
- end
37
50
 
38
- it_should_behave_like 'session proxy'
51
+ it_should_behave_like 'session proxy'
52
+ end
39
53
  end
@@ -7,7 +7,7 @@ shared_examples_for 'all sessions' do
7
7
  end
8
8
 
9
9
  it 'should add document to connection' do
10
- connection.should have(1).adds
10
+ expect(connection.adds.size).to eq(1)
11
11
  end
12
12
  end
13
13
 
@@ -17,11 +17,11 @@ shared_examples_for 'all sessions' do
17
17
  end
18
18
 
19
19
  it 'should add document to connection' do
20
- connection.should have(1).adds
20
+ expect(connection.adds.size).to eq(1)
21
21
  end
22
22
 
23
23
  it 'should commit' do
24
- connection.should have(1).commits
24
+ expect(connection.commits.size).to eq(1)
25
25
  end
26
26
  end
27
27
 
@@ -31,7 +31,27 @@ shared_examples_for 'all sessions' do
31
31
  end
32
32
 
33
33
  it 'should commit' do
34
- connection.should have(1).commits
34
+ expect(connection.commits.size).to eq(1)
35
+ end
36
+ end
37
+
38
+ context '#commit(bool)' do
39
+ it 'should soft-commit if bool=true' do
40
+ @session.commit(true)
41
+ expect(connection.commits.size).to eq(1)
42
+ expect(connection.soft_commits.size).to eq(1)
43
+ end
44
+
45
+ it 'should hard-commit if bool=false' do
46
+ @session.commit(false)
47
+ expect(connection.commits.size).to eq(1)
48
+ expect(connection.soft_commits.size).to eq(0)
49
+ end
50
+
51
+ it 'should hard-commit if bool is not specified' do
52
+ @session.commit
53
+ expect(connection.commits.size).to eq(1)
54
+ expect(connection.soft_commits.size).to eq(0)
35
55
  end
36
56
  end
37
57
 
@@ -41,7 +61,7 @@ shared_examples_for 'all sessions' do
41
61
  end
42
62
 
43
63
  it 'should optimize' do
44
- connection.should have(1).optims
64
+ expect(connection.optims.size).to eq(1)
45
65
  end
46
66
  end
47
67
 
@@ -51,7 +71,7 @@ shared_examples_for 'all sessions' do
51
71
  end
52
72
 
53
73
  it 'should search' do
54
- connection.should have(1).searches
74
+ expect(connection.searches.size).to eq(1)
55
75
  end
56
76
  end
57
77
  end
@@ -77,25 +97,31 @@ describe 'Session' do
77
97
 
78
98
  it 'should open connection with defaults if nothing specified' do
79
99
  Sunspot.commit
80
- connection.opts[:url].should == 'http://127.0.0.1:8983/solr'
100
+ expect(connection.opts[:url]).to eq('http://127.0.0.1:8983/solr/default')
81
101
  end
82
102
 
83
103
  it 'should open a connection with custom host' do
84
104
  Sunspot.config.solr.url = 'http://127.0.0.1:8981/solr'
85
105
  Sunspot.commit
86
- connection.opts[:url].should == 'http://127.0.0.1:8981/solr'
106
+ expect(connection.opts[:url]).to eq('http://127.0.0.1:8981/solr')
87
107
  end
88
108
 
89
109
  it 'should open a connection with custom read timeout' do
90
110
  Sunspot.config.solr.read_timeout = 0.5
91
111
  Sunspot.commit
92
- connection.opts[:read_timeout].should == 0.5
112
+ expect(connection.opts[:read_timeout]).to eq(0.5)
93
113
  end
94
114
 
95
115
  it 'should open a connection with custom open timeout' do
96
116
  Sunspot.config.solr.open_timeout = 0.5
97
117
  Sunspot.commit
98
- connection.opts[:open_timeout].should == 0.5
118
+ expect(connection.opts[:open_timeout]).to eq(0.5)
119
+ end
120
+
121
+ it 'should open a connection through a provided proxy' do
122
+ Sunspot.config.solr.proxy = 'http://proxy.com:1234'
123
+ Sunspot.commit
124
+ expect(connection.opts[:proxy]).to eq('http://proxy.com:1234')
99
125
  end
100
126
  end
101
127
 
@@ -111,7 +137,7 @@ describe 'Session' do
111
137
  config.solr.url = 'http://127.0.0.1:8982/solr'
112
138
  end
113
139
  session.commit
114
- connection.opts[:url].should == 'http://127.0.0.1:8982/solr'
140
+ expect(connection.opts[:url]).to eq('http://127.0.0.1:8982/solr')
115
141
  end
116
142
  end
117
143
 
@@ -121,106 +147,120 @@ describe 'Session' do
121
147
  end
122
148
 
123
149
  it 'should start out not dirty' do
124
- @session.dirty?.should be_false
150
+ expect(@session.dirty?).to be(false)
125
151
  end
126
-
152
+
127
153
  it 'should start out not delete_dirty' do
128
- @session.delete_dirty?.should be_false
154
+ expect(@session.delete_dirty?).to be(false)
129
155
  end
130
156
 
131
157
  it 'should be dirty after adding an item' do
132
158
  @session.index(Post.new)
133
- @session.dirty?.should be_true
159
+ expect(@session.dirty?).to be(true)
134
160
  end
135
-
161
+
136
162
  it 'should be not be delete_dirty after adding an item' do
137
163
  @session.index(Post.new)
138
- @session.delete_dirty?.should be_false
164
+ expect(@session.delete_dirty?).to be(false)
139
165
  end
140
166
 
141
167
  it 'should be dirty after deleting an item' do
142
168
  @session.remove(Post.new)
143
- @session.dirty?.should be_true
169
+ expect(@session.dirty?).to be(true)
144
170
  end
145
171
 
146
172
  it 'should be delete_dirty after deleting an item' do
147
173
  @session.remove(Post.new)
148
- @session.delete_dirty?.should be_true
174
+ expect(@session.delete_dirty?).to be(true)
149
175
  end
150
176
 
151
177
  it 'should be dirty after a remove_all for a class' do
152
178
  @session.remove_all(Post)
153
- @session.dirty?.should be_true
179
+ expect(@session.dirty?).to be(true)
154
180
  end
155
181
 
156
182
  it 'should be delete_dirty after a remove_all for a class' do
157
183
  @session.remove_all(Post)
158
- @session.delete_dirty?.should be_true
184
+ expect(@session.delete_dirty?).to be(true)
159
185
  end
160
186
 
161
187
  it 'should be dirty after a global remove_all' do
162
188
  @session.remove_all
163
- @session.dirty?.should be_true
189
+ expect(@session.dirty?).to be(true)
164
190
  end
165
-
191
+
166
192
  it 'should be delete_dirty after a global remove_all' do
167
193
  @session.remove_all
168
- @session.delete_dirty?.should be_true
194
+ expect(@session.delete_dirty?).to be(true)
169
195
  end
170
-
196
+
171
197
  it 'should not be dirty after a commit' do
172
198
  @session.index(Post.new)
173
199
  @session.commit
174
- @session.dirty?.should be_false
200
+ expect(@session.dirty?).to be(false)
175
201
  end
176
202
 
177
203
  it 'should not be dirty after an optimize' do
178
204
  @session.index(Post.new)
179
205
  @session.optimize
180
- @session.dirty?.should be_false
206
+ expect(@session.dirty?).to be(false)
181
207
  end
182
208
 
183
209
  it 'should not be delete_dirty after a commit' do
184
210
  @session.remove(Post.new)
185
211
  @session.commit
186
- @session.delete_dirty?.should be_false
212
+ expect(@session.delete_dirty?).to be(false)
187
213
  end
188
214
 
189
215
  it 'should not be delete_dirty after an optimize' do
190
216
  @session.remove(Post.new)
191
217
  @session.optimize
192
- @session.delete_dirty?.should be_false
218
+ expect(@session.delete_dirty?).to be(false)
193
219
  end
194
220
 
195
221
  it 'should not commit when commit_if_dirty called on clean session' do
196
222
  @session.commit_if_dirty
197
- connection.should have(0).commits
223
+ expect(connection.commits.size).to eq(0)
198
224
  end
199
225
 
200
226
  it 'should not commit when commit_if_delete_dirty called on clean session' do
201
227
  @session.commit_if_delete_dirty
202
- connection.should have(0).commits
228
+ expect(connection.commits.size).to eq(0)
203
229
  end
204
230
 
205
- it 'should commit when commit_if_dirty called on dirty session' do
231
+ it 'should hard commit when commit_if_dirty called on dirty session' do
206
232
  @session.index(Post.new)
207
233
  @session.commit_if_dirty
208
- connection.should have(1).commits
234
+ expect(connection.commits.size).to eq(1)
209
235
  end
210
-
211
- it 'should commit when commit_if_delete_dirty called on delete_dirty session' do
236
+
237
+ it 'should soft commit when commit_if_dirty called on dirty session' do
238
+ @session.index(Post.new)
239
+ @session.commit_if_dirty(true)
240
+ expect(connection.commits.size).to eq(1)
241
+ expect(connection.soft_commits.size).to eq(1)
242
+ end
243
+
244
+ it 'should hard commit when commit_if_delete_dirty called on delete_dirty session' do
212
245
  @session.remove(Post.new)
213
246
  @session.commit_if_delete_dirty
214
- connection.should have(1).commits
247
+ expect(connection.commits.size).to eq(1)
248
+ end
249
+
250
+ it 'should soft commit when commit_if_delete_dirty called on delete_dirty session' do
251
+ @session.remove(Post.new)
252
+ @session.commit_if_delete_dirty(true)
253
+ expect(connection.commits.size).to eq(1)
254
+ expect(connection.soft_commits.size).to eq(1)
215
255
  end
216
256
  end
217
257
 
218
258
  context 'session proxy' do
219
259
  it 'should send messages to manually assigned session proxy' do
220
- stub_session = stub!('session')
260
+ stub_session = double('session')
221
261
  Sunspot.session = stub_session
222
262
  post = Post.new
223
- stub_session.should_receive(:index).with(post)
263
+ expect(stub_session).to receive(:index).with(post)
224
264
  Sunspot.index(post)
225
265
  Sunspot.reset!
226
266
  end