sunspot 2.0.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,39 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ describe Sunspot::DataExtractor do
4
+ it "removes special characters from strings" do
5
+ extractor = Sunspot::DataExtractor::AttributeExtractor.new(:name)
6
+ blog = Blog.new(:name => "Te\x0\x1\x7\x6\x8st\xB\xC\xE Bl\x1Fo\x7fg")
7
+
8
+ expect(extractor.value_for(blog)).to eq "Test Blog"
9
+ end
10
+
11
+ it "removes special characters from arrays" do
12
+ extractor = Sunspot::DataExtractor::BlockExtractor.new { tags }
13
+ post = Post.new(:tags => ["Te\x0\x1\x7\x6\x8st Ta\x1Fg\x7f 1", "Test\xB\xC\xE Tag 2"])
14
+
15
+ expect(extractor.value_for(post)).to eq ["Test Tag 1", "Test Tag 2"]
16
+ end
17
+
18
+ it "removes special characters from hashes" do
19
+ extractor = Sunspot::DataExtractor::Constant.new({ "Te\x0\x1\x7\x6\x8st" => "Ta\x1Fg\x7f" })
20
+
21
+ expect(extractor.value_for(Post.new)).to eq({ "Test" => "Tag" })
22
+ end
23
+
24
+ it "skips other data types" do
25
+ [
26
+ :"Te\x0\x1\x7\x6\x8st",
27
+ 123,
28
+ 123.0,
29
+ nil,
30
+ false,
31
+ true,
32
+ Sunspot::Util::Coordinates.new(40.7, -73.5)
33
+ ].each do |value|
34
+ extractor = Sunspot::DataExtractor::Constant.new(value)
35
+
36
+ expect(extractor.value_for(Post.new)).to eq value
37
+ end
38
+ end
39
+ end
@@ -9,37 +9,60 @@ describe Sunspot::Search::HitEnumerable do
9
9
 
10
10
  describe "#hits" do
11
11
  before do
12
- subject.stub(:solr_docs).and_return([{"id" => "Post 1", "score" => 3.14}])
13
- subject.stub(:highlights_for)
12
+ allow(subject).to receive(:solr_docs).and_return([{"id" => "Post 1", "score" => 3.14}])
13
+ allow(subject).to receive(:highlights_for)
14
14
  end
15
15
 
16
16
  it "retrieves the raw Solr response from #solr_docs and constructs Hit objects" do
17
- Sunspot::Search::Hit.should_receive(:new).
17
+ expect(Sunspot::Search::Hit).to receive(:new).
18
18
  with({"id" => "Post 1", "score" => 3.14}, anything, anything)
19
19
 
20
20
  subject.hits
21
21
  end
22
22
 
23
23
  it "constructs Hit objects with highlights" do
24
- subject.should_receive(:highlights_for).with({"id" => "Post 1", "score" => 3.14})
24
+ expect(subject).to receive(:highlights_for).with({"id" => "Post 1", "score" => 3.14})
25
25
 
26
26
  subject.hits
27
27
  end
28
28
 
29
29
  it "returns only verified hits if :verify => true is passed" do
30
- Sunspot::Search::Hit.any_instance.stub(:result).and_return(nil)
30
+ allow_any_instance_of(Sunspot::Search::Hit).to receive(:result).and_return(nil)
31
31
 
32
- subject.hits(:verify => true).should be_empty
32
+ expect(subject.hits(:verify => true)).to be_empty
33
33
  end
34
34
 
35
35
  it "returns an empty array if no results are available from Solr" do
36
- subject.stub(:solr_docs).and_return(nil)
36
+ allow(subject).to receive(:solr_docs).and_return(nil)
37
37
 
38
- subject.hits.should == []
38
+ expect(subject.hits).to eq([])
39
39
  end
40
40
 
41
41
  it "provides #populate_hits so that querying for one hit result will eager load the rest" do
42
- Sunspot::Search::Hit.any_instance.should_receive(:result=)
42
+ expect_any_instance_of(Sunspot::Search::Hit).to receive(:result=)
43
+
44
+ subject.populate_hits
45
+ end
46
+ end
47
+
48
+ describe "#populate_hits" do
49
+ let(:post_1) { Post.new(id: "1", title: "Title 1") }
50
+
51
+ before do
52
+ allow(subject).to receive(:solr_docs).and_return([{ "id" => "Post 1", "score" => 3.14 }])
53
+ allow(subject).to receive(:highlights_for)
54
+ end
55
+
56
+ it "populates the hit object with the result from the data accessor" do
57
+ allow_any_instance_of(MockAdapter::DataAccessor).to receive(:load_all).and_return([post_1])
58
+ expect_any_instance_of(Sunspot::Search::Hit).to receive(:result=).with(post_1)
59
+
60
+ subject.populate_hits
61
+ end
62
+
63
+ it "populates the hit object only once if there are duplicate entries in the database (ex: db missing unique constraints)" do
64
+ allow_any_instance_of(MockAdapter::DataAccessor).to receive(:load_all).and_return([post_1, post_1])
65
+ expect_any_instance_of(Sunspot::Search::Hit).to receive(:result=).with(post_1)
43
66
 
44
67
  subject.populate_hits
45
68
  end
@@ -4,146 +4,151 @@ require 'bigdecimal'
4
4
  describe 'indexing attribute fields', :type => :indexer do
5
5
  it 'should correctly index a stored string attribute field' do
6
6
  session.index(post(:title => 'A Title'))
7
- connection.should have_add_with(:title_ss => 'A Title')
7
+ expect(connection).to have_add_with(:title_ss => 'A Title')
8
8
  end
9
9
 
10
10
  it 'should correctly index an integer attribute field' do
11
11
  session.index(post(:blog_id => 4))
12
- connection.should have_add_with(:blog_id_i => '4')
12
+ expect(connection).to have_add_with(:blog_id_i => '4')
13
13
  end
14
14
 
15
15
  it 'should correctly index a long attribute field' do
16
16
  session.index(Namespaced::Comment.new(:hash => 2**30))
17
- connection.should have_add_with(:hash_l => '1073741824')
17
+ expect(connection).to have_add_with(:hash_l => '1073741824')
18
18
  end
19
19
 
20
20
  it 'should correctly index a float attribute field' do
21
21
  session.index(post(:ratings_average => 2.23))
22
- connection.should have_add_with(:average_rating_ft => '2.23')
22
+ expect(connection).to have_add_with(:average_rating_ft => '2.23')
23
23
  end
24
24
 
25
25
  it 'should correctly index a double attribute field' do
26
26
  session.index(Namespaced::Comment.new(:average_rating => 2.23))
27
- connection.should have_add_with(:average_rating_e => '2.23')
27
+ expect(connection).to have_add_with(:average_rating_e => '2.23')
28
28
  end
29
29
 
30
30
  it 'should correctly index a trie integer attribute field' do
31
31
  session.index(Photo.new(:size => 104856))
32
- connection.should have_add_with(:size_it => '104856')
32
+ expect(connection).to have_add_with(:size_it => '104856')
33
33
  end
34
34
 
35
35
  it 'should correctly index a trie float attribute field' do
36
36
  session.index(Photo.new(:average_rating => 2.23))
37
- connection.should have_add_with(:average_rating_ft => '2.23')
37
+ expect(connection).to have_add_with(:average_rating_ft => '2.23')
38
38
  end
39
39
 
40
40
  it 'should correctly index a trie time attribute field' do
41
41
  session.index(Photo.new(:created_at => Time.parse('2009-12-16 15:00:00 -0400')))
42
- connection.should have_add_with(:created_at_dt => '2009-12-16T19:00:00Z')
42
+ expect(connection).to have_add_with(:created_at_dt => '2009-12-16T19:00:00Z')
43
43
  end
44
44
 
45
45
  it 'should allow indexing by a multiple-value field' do
46
46
  session.index(post(:category_ids => [3, 14]))
47
- connection.should have_add_with(:category_ids_im => ['3', '14'])
47
+ expect(connection).to have_add_with(:category_ids_im => ['3', '14'])
48
48
  end
49
49
 
50
50
  it 'should not index a single-value field with newlines as multiple' do
51
51
  session.index(post(:title => "Multi\nLine"))
52
- connection.adds.last.first.field_by_name(:title_ss).value.should == "Multi\nLine"
52
+ expect(connection.adds.last.first.field_by_name(:title_ss).value).to eq("Multi\nLine")
53
53
  end
54
54
 
55
55
  it 'should correctly index a time field' do
56
56
  session.index(
57
57
  post(:published_at => Time.parse('1983-07-08 05:00:00 -0400'))
58
58
  )
59
- connection.should have_add_with(:published_at_dt => '1983-07-08T09:00:00Z')
59
+ expect(connection).to have_add_with(:published_at_dt => '1983-07-08T09:00:00Z')
60
60
  end
61
61
 
62
62
  it 'should correctly index a time field that\'s after 32-bit Y2K' do
63
63
  session.index(
64
64
  post(:published_at => DateTime.parse('2050-07-08 05:00:00 -0400'))
65
65
  )
66
- connection.should have_add_with(:published_at_dt => '2050-07-08T09:00:00Z')
66
+ expect(connection).to have_add_with(:published_at_dt => '2050-07-08T09:00:00Z')
67
67
  end
68
68
 
69
69
  it 'should correctly index a date field' do
70
70
  session.index(post(:expire_date => Date.new(2009, 07, 13)))
71
- connection.should have_add_with(:expire_date_d => '2009-07-13T00:00:00Z')
71
+ expect(connection).to have_add_with(:expire_date_d => '2009-07-13T00:00:00Z')
72
+ end
73
+
74
+ it 'should correctly index a date range field' do
75
+ session.index(post(:featured_for => Date.new(2009, 07, 13)..Date.new(2009, 12, 25)))
76
+ expect(connection).to have_add_with(:featured_for_dr => '[2009-07-13T00:00:00Z TO 2009-12-25T00:00:00Z]')
72
77
  end
73
78
 
74
79
  it 'should correctly index a boolean field' do
75
80
  session.index(post(:featured => true))
76
- connection.should have_add_with(:featured_bs => 'true')
81
+ expect(connection).to have_add_with(:featured_bs => 'true')
77
82
  end
78
83
 
79
84
  it 'should correctly index a false boolean field' do
80
85
  session.index(post(:featured => false))
81
- connection.should have_add_with(:featured_bs => 'false')
86
+ expect(connection).to have_add_with(:featured_bs => 'false')
82
87
  end
83
88
 
84
89
  it 'should not index a nil boolean field' do
85
90
  session.index(post)
86
- connection.should_not have_add_with(:featured_bs)
91
+ expect(connection).not_to have_add_with(:featured_bs)
87
92
  end
88
93
 
89
94
  it 'should index latitude and longitude as a pair' do
90
95
  session.index(post(:coordinates => Sunspot::Util::Coordinates.new(40.7, -73.5)))
91
- connection.should have_add_with(:coordinates_s => 'dr5xx3nytvgs')
96
+ expect(connection).to have_add_with(:coordinates_s => 'dr5xx3nytvgs')
92
97
  end
93
98
 
94
99
  it 'should index latitude and longitude passed as non-Floats' do
95
100
  coordinates = Sunspot::Util::Coordinates.new(
96
101
  BigDecimal.new('40.7'), BigDecimal.new('-73.5'))
97
102
  session.index(post(:coordinates => coordinates))
98
- connection.should have_add_with(:coordinates_s => 'dr5xx3nytvgs')
103
+ expect(connection).to have_add_with(:coordinates_s => 'dr5xx3nytvgs')
99
104
  end
100
105
 
101
106
  it 'should correctly index an attribute field with block access' do
102
107
  session.index(post(:title => 'The Blog Post'))
103
- connection.should have_add_with(:sort_title_s => 'blog post')
108
+ expect(connection).to have_add_with(:sort_title_s => 'blog post')
104
109
  end
105
110
 
106
111
  it 'should correctly index an attribute field with instance-external block access' do
107
112
  session.index(post(:category_ids => [1, 2, 3]))
108
- connection.should have_add_with(:primary_category_id_i => '1')
113
+ expect(connection).to have_add_with(:primary_category_id_i => '1')
109
114
  end
110
115
 
111
116
  it 'should correctly index a field that is defined on a superclass' do
112
117
  Sunspot.setup(SuperClass) { string :author_name }
113
118
  session.index(post(:author_name => 'Mat Brown'))
114
- connection.should have_add_with(:author_name_s => 'Mat Brown')
119
+ expect(connection).to have_add_with(:author_name_s => 'Mat Brown')
115
120
  end
116
121
 
117
122
  it 'should throw a NoMethodError only if a nonexistent type is defined' do
118
- lambda { Sunspot.setup(Post) { string :author_name }}.should_not raise_error
119
- lambda { Sunspot.setup(Post) { bogus :journey }}.should raise_error(NoMethodError)
123
+ expect { Sunspot.setup(Post) { string :author_name }}.not_to raise_error
124
+ expect { Sunspot.setup(Post) { bogus :journey }}.to raise_error(NoMethodError)
120
125
  end
121
126
 
122
127
  it 'should throw a NoMethodError if a nonexistent field argument is passed' do
123
- lambda { Sunspot.setup(Post) { string :author_name, :bogus => :argument }}.should raise_error(ArgumentError)
128
+ expect { Sunspot.setup(Post) { string :author_name, :bogus => :argument }}.to raise_error(ArgumentError)
124
129
  end
125
130
 
126
131
  it 'should throw an ArgumentError if single-value field tries to index multiple values' do
127
- lambda do
132
+ expect do
128
133
  Sunspot.setup(Post) { string :author_name }
129
134
  session.index(post(:author_name => ['Mat Brown', 'Matthew Brown']))
130
- end.should raise_error(ArgumentError)
135
+ end.to raise_error(ArgumentError)
131
136
  end
132
137
 
133
138
  it 'should throw an ArgumentError if specifying more_like_this on type that does not support it' do
134
- lambda do
139
+ expect do
135
140
  Sunspot.setup(Post) { integer :popularity, :more_like_this => true }
136
- end.should raise_error(ArgumentError)
141
+ end.to raise_error(ArgumentError)
137
142
  end
138
143
 
139
144
  it 'should use a specified field name when the :as option is set' do
140
145
  session.index(post(:title => 'A Title'))
141
- connection.should have_add_with(:legacy_field_s => 'legacy A Title')
146
+ expect(connection).to have_add_with(:legacy_field_s => 'legacy A Title')
142
147
  end
143
148
 
144
149
  it 'should use a specified field name when the :as option is set for array values' do
145
150
  session.index(post(:title => 'Another Title'))
146
- connection.should have_add_with(:legacy_array_field_sm => ['first string', 'second string'])
151
+ expect(connection).to have_add_with(:legacy_array_field_sm => ['first string', 'second string'])
147
152
  end
148
153
  end
149
154
 
@@ -9,7 +9,7 @@ describe 'batch indexing', :type => :indexer do
9
9
  session.index(post)
10
10
  end
11
11
  end
12
- connection.adds.length.should == 1
12
+ expect(connection.adds.length).to eq(1)
13
13
  end
14
14
 
15
15
  it 'should add all batched adds' do
@@ -19,8 +19,9 @@ describe 'batch indexing', :type => :indexer do
19
19
  end
20
20
  end
21
21
  add = connection.adds.last
22
- connection.adds.first.map { |add| add.field_by_name(:id).value }.should ==
22
+ expect(connection.adds.first.map { |add| add.field_by_name(:id).value }).to eq(
23
23
  posts.map { |post| "Post #{post.id}" }
24
+ )
24
25
  end
25
26
 
26
27
  it 'should not index changes to models that happen after index call' do
@@ -29,13 +30,13 @@ describe 'batch indexing', :type => :indexer do
29
30
  session.index(post)
30
31
  post.title = 'Title'
31
32
  end
32
- connection.adds.first.first.field_by_name(:title_ss).should be_nil
33
+ expect(connection.adds.first.first.field_by_name(:title_ss)).to be_nil
33
34
  end
34
35
 
35
36
  it 'should batch an add and a delete' do
36
- pending 'batching all operations'
37
- connection.should_not_receive(:add)
38
- connection.should_not_receive(:remove)
37
+ skip 'batching all operations'
38
+ expect(connection).not_to receive(:add)
39
+ expect(connection).not_to receive(:remove)
39
40
  session.batch do
40
41
  session.index(posts[0])
41
42
  session.remove(posts[1])
@@ -64,7 +65,7 @@ describe 'batch indexing', :type => :indexer do
64
65
  a_nested_batch
65
66
  nested_batches_adds = connection.adds
66
67
 
67
- nested_batches_adds.first.first.field_by_name(:title_ss).value.should eq(
68
+ expect(nested_batches_adds.first.first.field_by_name(:title_ss).value).to eq(
68
69
  two_sets_of_batches_adds.first.first.field_by_name(:title_ss).value
69
70
  )
70
71
  end
@@ -3,40 +3,40 @@ require File.expand_path('spec_helper', File.dirname(__FILE__))
3
3
  describe 'indexing dynamic fields' do
4
4
  it 'indexes string data' do
5
5
  session.index(post(:custom_string => { :test => 'string' }))
6
- connection.should have_add_with(:"custom_string:test_ss" => 'string')
6
+ expect(connection).to have_add_with(:"custom_string:test_ss" => 'string')
7
7
  end
8
8
 
9
9
  it 'indexes integer data with virtual accessor' do
10
10
  session.index(post(:category_ids => [1, 2]))
11
- connection.should have_add_with(:"custom_integer:1_i" => '1', :"custom_integer:2_i" => '1')
11
+ expect(connection).to have_add_with(:"custom_integer:1_i" => '1', :"custom_integer:2_i" => '1')
12
12
  end
13
13
 
14
14
  it 'indexes float data' do
15
15
  session.index(post(:custom_fl => { :test => 1.5 }))
16
- connection.should have_add_with(:"custom_float:test_fm" => '1.5')
16
+ expect(connection).to have_add_with(:"custom_float:test_fm" => '1.5')
17
17
  end
18
18
 
19
19
  it 'indexes time data' do
20
20
  session.index(post(:custom_time => { :test => Time.parse('2009-05-18 18:05:00 -0400') }))
21
- connection.should have_add_with(:"custom_time:test_d" => '2009-05-18T22:05:00Z')
21
+ expect(connection).to have_add_with(:"custom_time:test_d" => '2009-05-18T22:05:00Z')
22
22
  end
23
23
 
24
24
  it 'indexes boolean data' do
25
25
  session.index(post(:custom_boolean => { :test => false }))
26
- connection.should have_add_with(:"custom_boolean:test_b" => 'false')
26
+ expect(connection).to have_add_with(:"custom_boolean:test_b" => 'false')
27
27
  end
28
28
 
29
29
  it 'indexes multiple values for a field' do
30
30
  session.index(post(:custom_fl => { :test => [1.0, 2.1, 3.2] }))
31
- connection.should have_add_with(:"custom_float:test_fm" => %w(1.0 2.1 3.2))
31
+ expect(connection).to have_add_with(:"custom_float:test_fm" => %w(1.0 2.1 3.2))
32
32
  end
33
33
 
34
34
  it 'should throw a NoMethodError if dynamic text field defined' do
35
- lambda do
35
+ expect do
36
36
  Sunspot.setup(Post) do
37
37
  dynamic_text :custom_text
38
38
  end
39
- end.should raise_error(NoMethodError)
39
+ end.to raise_error(NoMethodError)
40
40
  end
41
41
  end
42
42
 
@@ -3,23 +3,28 @@ require File.expand_path('spec_helper', File.dirname(__FILE__))
3
3
  describe 'indexing fixed fields', :type => :indexer do
4
4
  it 'should index id' do
5
5
  session.index post
6
- connection.should have_add_with(:id => "Post #{post.id}")
6
+ expect(connection).to have_add_with(:id => "Post #{post.id}")
7
7
  end
8
8
 
9
9
  it 'should index type' do
10
10
  session.index post
11
- connection.should have_add_with(:type => ['Post', 'SuperClass', 'MockRecord'])
11
+ expect(connection).to have_add_with(:type => ['Post', 'SuperClass', 'MockRecord'])
12
+ end
13
+
14
+ it 'should not index join fields' do
15
+ session.index PhotoContainer.new
16
+ expect(connection).not_to have_add_with(:photo_caption => 'blah')
12
17
  end
13
18
 
14
19
  it 'should index class name' do
15
20
  session.index post
16
- connection.should have_add_with(:class_name => 'Post')
21
+ expect(connection).to have_add_with(:class_name => 'Post')
17
22
  end
18
23
 
19
24
  it 'should index the array of objects supplied' do
20
25
  posts = Array.new(2) { Post.new }
21
26
  session.index posts
22
- connection.should have_add_with(
27
+ expect(connection).to have_add_with(
23
28
  { :id => "Post #{posts.first.id}" },
24
29
  { :id => "Post #{posts.last.id}" }
25
30
  )
@@ -28,7 +33,7 @@ describe 'indexing fixed fields', :type => :indexer do
28
33
  it 'should index an array containing more than one type of object' do
29
34
  post1, comment, post2 = objects = [Post.new, Namespaced::Comment.new, Post.new]
30
35
  session.index objects
31
- connection.should have_add_with(
36
+ expect(connection).to have_add_with(
32
37
  { :id => "Post #{post1.id}", :type => ['Post', 'SuperClass', 'MockRecord'] },
33
38
  { :id => "Namespaced::Comment #{comment.id}", :type => ['Namespaced::Comment', 'MockRecord'] },
34
39
  { :id => "Post #{post2.id}", :type => ['Post', 'SuperClass', 'MockRecord'] }
@@ -36,22 +41,22 @@ describe 'indexing fixed fields', :type => :indexer do
36
41
  end
37
42
 
38
43
  it 'commits immediately after index! called' do
39
- connection.should_receive(:add).ordered
40
- connection.should_receive(:commit).ordered
44
+ expect(connection).to receive(:add).ordered
45
+ expect(connection).to receive(:commit).ordered
41
46
  session.index!(post)
42
47
  end
43
48
 
44
49
  it 'raises an ArgumentError if an attempt is made to index an object that has no configuration' do
45
- lambda { session.index(Blog.new) }.should raise_error(Sunspot::NoSetupError)
50
+ expect { session.index(Blog.new) }.to raise_error(Sunspot::NoSetupError)
46
51
  end
47
52
 
48
53
  it 'raises a NoAdapterError if class without adapter is indexed' do
49
- lambda { session.index(User.new) }.should raise_error(Sunspot::NoAdapterError)
54
+ expect { session.index(User.new) }.to raise_error(Sunspot::NoAdapterError)
50
55
  end
51
56
 
52
57
  it 'raises an ArgumentError if a non-word character is included in the field name' do
53
- lambda do
58
+ expect do
54
59
  Sunspot.setup(Post) { string :"bad name" }
55
- end.should raise_error(ArgumentError)
60
+ end.to raise_error(ArgumentError)
56
61
  end
57
62
  end