rspec-solr 0.1.2 → 0.1.3
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/MATCHERS.rdoc
CHANGED
@@ -76,13 +76,15 @@ TODO:
|
|
76
76
|
=== Matchers
|
77
77
|
* include().as_first
|
78
78
|
* include().as_first.document
|
79
|
-
* include().as_first.results
|
80
|
-
* include().as_first.anything.can.go.here
|
81
79
|
* include().in_first(n)
|
82
|
-
* include().in_first(n).documents
|
83
|
-
* include().in_first(n).results
|
84
|
-
* include().in_first(n).anything_can_go_here
|
85
80
|
* include(Array).in_first(n).results
|
81
|
+
* include(Hash).in_each_of_first(n).documents
|
82
|
+
|
83
|
+
Note that the following are equivalent:
|
84
|
+
* include().blah.document
|
85
|
+
* include().blah.documents
|
86
|
+
* include().blah.result
|
87
|
+
* include().blah.results
|
86
88
|
|
87
89
|
TODO:
|
88
90
|
* include_at_least(3).of_these_documents().in_first(3).results
|
@@ -94,6 +96,7 @@ See above for information on how to specify specific documents
|
|
94
96
|
* rspec-solr_resp_hash.should include(["111", "222"]).as_first.documents
|
95
97
|
* rspec-solr_resp_hash.should include([{"title" => "title1"}, {"title" => "title2"}]).in_first(3).results
|
96
98
|
* rspec-solr_resp_hash.should include("fld1" => "val1").in_first(3)
|
99
|
+
* rspec-solr_resp_hash.should include("title" => /cooking/).in_first(3).results
|
97
100
|
|
98
101
|
|
99
102
|
== MATCHING RELATIVE ORDER OF SPECIFIC DOCUMENTS
|
@@ -15,6 +15,14 @@ module RSpec
|
|
15
15
|
|
16
16
|
alias_method :as_first, :in_first
|
17
17
|
|
18
|
+
# chain method for .should include().in_each_of_first(n)
|
19
|
+
# sets @min_for_last_matching_doc_ix for use in perform_match method
|
20
|
+
# @return self - "each method must return self in order to chain methods together"
|
21
|
+
def in_each_of_first(num=1)
|
22
|
+
@min_for_last_matching_doc_pos = num
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
18
26
|
# chain method for .should include().before()
|
19
27
|
# sets @before_expected for use in perform_match method
|
20
28
|
# @return self - "each method must return self in order to chain methods together"
|
@@ -30,6 +38,8 @@ module RSpec
|
|
30
38
|
# FIXME: DRY up these messages across cases and across should and should_not
|
31
39
|
if @before_expected
|
32
40
|
"expected #{@actual.inspect} to #{name_to_sentence} #{doc_label_str(@expected)}#{expected_to_sentence} before #{doc_label_str(@before_expected)} matching #{@before_expected.inspect}"
|
41
|
+
elsif @min_for_last_matching_doc_pos
|
42
|
+
"expected each of the first #{@min_for_last_matching_doc_pos.to_s} documents to #{name_to_sentence}#{expected_to_sentence}: #{@actual.inspect}"
|
33
43
|
elsif @max_doc_position
|
34
44
|
"expected #{@actual.inspect} to #{name_to_sentence} #{doc_label_str(@expected)}#{expected_to_sentence} in first #{@max_doc_position.to_s} results"
|
35
45
|
else
|
@@ -42,6 +52,8 @@ module RSpec
|
|
42
52
|
assert_ivars :@actual, :@expected
|
43
53
|
if @before_expected
|
44
54
|
"expected #{@actual.inspect} not to #{name_to_sentence} #{doc_label_str(@expected)}#{expected_to_sentence} before #{doc_label_str(@before_expected)} matching #{@before_expected.inspect}"
|
55
|
+
elsif @min_for_last_matching_doc_pos
|
56
|
+
"expected some of the first #{@min_for_last_matching_doc_pos.to_s} documents not to #{name_to_sentence}#{expected_to_sentence}: #{@actual.inspect}"
|
45
57
|
elsif @max_doc_position
|
46
58
|
"expected #{@actual.inspect} not to #{name_to_sentence} #{doc_label_str(@expected)}#{expected_to_sentence} in first #{@max_doc_position.to_s} results"
|
47
59
|
else
|
@@ -56,7 +68,7 @@ private
|
|
56
68
|
def perform_match(predicate, hash_predicate, actuals, expecteds)
|
57
69
|
expecteds.send(predicate) do |expected|
|
58
70
|
if comparing_doc_to_solr_resp_hash?(actuals, expected)
|
59
|
-
if
|
71
|
+
if @before_expected
|
60
72
|
before_ix = actuals.get_first_doc_index(@before_expected)
|
61
73
|
if before_ix
|
62
74
|
@max_doc_position = before_ix + 1
|
@@ -65,7 +77,11 @@ private
|
|
65
77
|
@max_doc_position = -1
|
66
78
|
end
|
67
79
|
end
|
68
|
-
|
80
|
+
if @min_for_last_matching_doc_pos
|
81
|
+
actuals.has_document?(expected, @min_for_last_matching_doc_pos, true)
|
82
|
+
else
|
83
|
+
actuals.has_document?(expected, @max_doc_position)
|
84
|
+
end
|
69
85
|
elsif comparing_hash_values?(actuals, expected)
|
70
86
|
expected.send(hash_predicate) {|k,v| actuals[k] == v}
|
71
87
|
elsif comparing_hash_keys?(actuals, expected)
|
@@ -82,10 +98,14 @@ private
|
|
82
98
|
end
|
83
99
|
|
84
100
|
def method_missing(method, *args, &block)
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
101
|
+
if (method =~ /documents?/ || method =~ /results?/)
|
102
|
+
@collection_name = method
|
103
|
+
@args = args
|
104
|
+
@block = block
|
105
|
+
self
|
106
|
+
else
|
107
|
+
super.method_missing
|
108
|
+
end
|
89
109
|
end
|
90
110
|
|
91
111
|
# @return [String] 'documents' or 'document' as indicated by expectation
|
@@ -38,34 +38,51 @@ class RSpecSolr
|
|
38
38
|
# [{"title" => "warm fuzzies"}, {"title" => "cool fuzzies"}] implies we expect at least one Solr doc in this response matching each Hash in the Array
|
39
39
|
# [{"title" => /rm fuzz/}, {"title" => /^cool/}] implies we expect at least one Solr doc in this response matching each Hash in the Array
|
40
40
|
# @param [FixNum] max_doc_position maximum acceptable position (1-based) of document in results. (e.g. if 2, it must be the 1st or 2nd doc in the results)
|
41
|
-
def has_document?(expected_doc, max_doc_position = nil)
|
41
|
+
def has_document?(expected_doc, max_doc_position = nil, all_must_match = nil)
|
42
42
|
if expected_doc.is_a?(Hash)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
case exp_val
|
52
|
-
when Regexp
|
53
|
-
Array(doc[exp_fname]).any? { |val| val =~ exp_val }
|
54
|
-
else
|
55
|
-
Array(doc[exp_fname]).include?(exp_val)
|
56
|
-
end
|
57
|
-
} &&
|
43
|
+
if all_must_match
|
44
|
+
first_non_match = docs.find_index { |doc|
|
45
|
+
!doc_matches_all_criteria(doc, expected_doc)
|
46
|
+
} >= max_doc_position
|
47
|
+
else
|
48
|
+
# we are happy if any doc meets all of our expectations
|
49
|
+
docs.any? { |doc|
|
50
|
+
doc_matches_all_criteria(doc, expected_doc) &&
|
58
51
|
# satisfy doc's position in the results
|
59
52
|
(max_doc_position ? docs.find_index(doc) < max_doc_position : true)
|
60
53
|
}
|
61
|
-
|
54
|
+
end
|
62
55
|
elsif expected_doc.is_a?(String)
|
56
|
+
if all_must_match
|
57
|
+
raise ArgumentError, "in_each_of_first(n) requires a Hash argument to include() method"
|
58
|
+
end
|
63
59
|
has_document?({self.id_field => expected_doc}, max_doc_position)
|
64
60
|
elsif expected_doc.is_a?(Array)
|
61
|
+
if all_must_match
|
62
|
+
raise ArgumentError, "in_each_of_first(n) requires a Hash argument to include() method"
|
63
|
+
end
|
65
64
|
expected_doc.all? { |exp| has_document?(exp, max_doc_position) }
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
68
|
+
# return true if the document contains all the key value pairs in the expectations_hash
|
69
|
+
def doc_matches_all_criteria(doc, expectations_hash)
|
70
|
+
expectations_hash.all? { | exp_fname, exp_vals |
|
71
|
+
doc.include?(exp_fname) &&
|
72
|
+
# exp_vals can be a String or an Array
|
73
|
+
# if it's an Array, then all expected values must be present
|
74
|
+
Array(exp_vals).all? { | exp_val |
|
75
|
+
# a doc's fld values can be a String or an Array
|
76
|
+
case exp_val
|
77
|
+
when Regexp
|
78
|
+
Array(doc[exp_fname]).any? { |val| val =~ exp_val }
|
79
|
+
else
|
80
|
+
Array(doc[exp_fname]).include?(exp_val)
|
81
|
+
end
|
82
|
+
}
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
69
86
|
# @return the index of the first document that meets the expectations in THIS response
|
70
87
|
# @param expected_doc what should be matched in a document in THIS response
|
71
88
|
# @example expected_doc Hash implies ALL key/value pairs will be matched in a SINGLE Solr document
|
data/lib/rspec-solr/version.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rspec-solr'
|
3
|
+
|
4
|
+
describe RSpecSolr do
|
5
|
+
|
6
|
+
# fixtures below
|
7
|
+
|
8
|
+
context "#include().in_each_of_first(n)" do
|
9
|
+
context "should" do
|
10
|
+
it "passes when all docs in range meet criteria" do
|
11
|
+
@solr_resp.should include("fld" => "val").in_each_of_first(2)
|
12
|
+
@solr_resp.should include("fld" => "val").in_each_of_first(2).documents
|
13
|
+
@solr_resp.should include("fld" => "val").in_each_of_first(2).results
|
14
|
+
end
|
15
|
+
it "fails when doc in range doesn't meet criteria" do
|
16
|
+
lambda {
|
17
|
+
@solr_resp.should include("fld2" => "val2").in_each_of_first(2)
|
18
|
+
}.should fail_matching('expected each of the first 2 documents to include {"fld2"=>"val2"}')
|
19
|
+
lambda {
|
20
|
+
@solr_resp.should include("fld" => "val").in_each_of_first(3)
|
21
|
+
}.should fail_matching('expected each of the first 3 documents to include {"fld"=>"val"}')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
context "should_NOT" do
|
25
|
+
it "fails when all docs in range meet criteria" do
|
26
|
+
lambda {
|
27
|
+
@solr_resp.should_not include("fld" => "val").in_each_of_first(2)
|
28
|
+
}.should fail_matching('expected some of the first 2 documents not to include {"fld"=>"val"}')
|
29
|
+
lambda {
|
30
|
+
@solr_resp.should_not include("fld" => "val").in_each_of_first(2).documents
|
31
|
+
}.should fail_matching('expected some of the first 2 documents not to include {"fld"=>"val"}')
|
32
|
+
lambda {
|
33
|
+
@solr_resp.should_not include("fld" => "val").in_each_of_first(2).results
|
34
|
+
}.should fail_matching('expected some of the first 2 documents not to include {"fld"=>"val"}')
|
35
|
+
end
|
36
|
+
it "passes when doc in range doesn't meet criteria" do
|
37
|
+
@solr_resp.should_not include("fld" => "val").in_each_of_first(3)
|
38
|
+
@solr_resp.should_not include("fld2" => "val2").in_each_of_first(2)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
it "should expect a Hash for the include" do
|
42
|
+
expect {
|
43
|
+
@solr_resp.should include("111").in_each_of_first(1)
|
44
|
+
}.to raise_error(ArgumentError, "in_each_of_first(n) requires a Hash argument to include() method")
|
45
|
+
expect {
|
46
|
+
@solr_resp.should include(["111", "222"]).in_each_of_first(1)
|
47
|
+
}.to raise_error(ArgumentError, "in_each_of_first(n) requires a Hash argument to include() method")
|
48
|
+
expect {
|
49
|
+
@solr_resp.should_not include("111").in_each_of_first(1)
|
50
|
+
}.to raise_error(ArgumentError, "in_each_of_first(n) requires a Hash argument to include() method")
|
51
|
+
expect {
|
52
|
+
@solr_resp.should include("fld" => "val").in_each_of_first(1)
|
53
|
+
}.to_not raise_error(ArgumentError)
|
54
|
+
expect {
|
55
|
+
@solr_resp.should include({"fld" => "val", "fld2" => "val2"}).in_each_of_first(1)
|
56
|
+
}.to_not raise_error(ArgumentError)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
before(:all) do
|
61
|
+
@solr_resp = RSpecSolr::SolrResponseHash.new({ "response" =>
|
62
|
+
{ "numFound" => 5,
|
63
|
+
"start" => 0,
|
64
|
+
"docs" =>
|
65
|
+
[ {"id"=>"111", "fld"=>"val", "fld2"=>"val2"},
|
66
|
+
{"id"=>"222", "fld"=>"val"},
|
67
|
+
{"id"=>"333"},
|
68
|
+
{"id"=>"444", "fld"=>["val1", "val2", "val3"]},
|
69
|
+
{"id"=>"555"}
|
70
|
+
]
|
71
|
+
}
|
72
|
+
})
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -110,13 +110,12 @@ describe RSpecSolr do
|
|
110
110
|
end
|
111
111
|
end # include().in_first (no n set)
|
112
112
|
|
113
|
-
context "#include().in_first(n).
|
114
|
-
context "should #include().in_first(n).
|
113
|
+
context "#include().in_first(n).allowed_chained.names" do
|
114
|
+
context "should #include().in_first(n).allowed_chained.names" do
|
115
115
|
it "passes when document(s) meet criteria" do
|
116
116
|
@solr_resp_5_docs.should include("222").in_first(2).results
|
117
117
|
@solr_resp_5_docs.should include("222").in_first(2).documents
|
118
|
-
@solr_resp_5_docs.should include("
|
119
|
-
@solr_resp_5_docs.should include("fld2"=>"val2").in_first.solr.document
|
118
|
+
@solr_resp_5_docs.should include("fld2"=>"val2").in_first.document
|
120
119
|
end
|
121
120
|
it "fails when document(s) don't meet criteria" do
|
122
121
|
lambda {
|
@@ -124,20 +123,25 @@ describe RSpecSolr do
|
|
124
123
|
}.should fail_matching('} to include document {"fld"=>["val1", "val2", "val3"]} in first 1')
|
125
124
|
end
|
126
125
|
end
|
127
|
-
context "should_NOT #include().in_first(n).
|
126
|
+
context "should_NOT #include().in_first(n).allowed_chained.names" do
|
128
127
|
it "fails when document(s) meet criteria" do
|
129
128
|
lambda {
|
130
|
-
@solr_resp_5_docs.should_not include("222").in_first(2).
|
129
|
+
@solr_resp_5_docs.should_not include("222").in_first(2).documents
|
131
130
|
}.should fail_matching('not to include document "222" in first 2 ')
|
132
131
|
lambda {
|
133
|
-
@solr_resp_5_docs.should_not include("fld2"=>"val2").in_first.
|
132
|
+
@solr_resp_5_docs.should_not include("fld2"=>"val2").in_first.document
|
134
133
|
}.should fail_matching('not to include document {"fld2"=>"val2"} in first 1')
|
135
134
|
end
|
136
135
|
it "passes when document(s) don't meet criteria" do
|
137
136
|
@solr_resp_5_docs.should_not include("fld"=>["val1", "val2", "val3"]).in_first.result
|
138
137
|
end
|
139
138
|
end
|
140
|
-
|
139
|
+
it "should raise a NoMethodError exception when it gets nonsense after include" do
|
140
|
+
expect {
|
141
|
+
@solr_resp.should include("111").bad_method(2)
|
142
|
+
}.to raise_error(NoMethodError, /bad_method/)
|
143
|
+
end
|
144
|
+
end # include().in_first().allowed_chained.names
|
141
145
|
|
142
146
|
context "#include().as_first" do
|
143
147
|
context "should include().as_first" do
|
@@ -183,12 +187,12 @@ describe RSpecSolr do
|
|
183
187
|
end
|
184
188
|
|
185
189
|
|
186
|
-
context "#include().as_first().
|
187
|
-
context "should #include().as_first(n).
|
190
|
+
context "#include().as_first().allowed_chained.names" do
|
191
|
+
context "should #include().as_first(n).allowed_chained.names" do
|
188
192
|
it "passes when document(s) meet criteria" do
|
189
193
|
@solr_resp_5_docs.should include(["111", "222"]).as_first(2).results
|
190
|
-
@solr_resp_5_docs.should include(["111", "222"]).as_first(2).
|
191
|
-
@solr_resp_5_docs.should include("fld2"=>"val2").as_first.
|
194
|
+
@solr_resp_5_docs.should include(["111", "222"]).as_first(2).documents
|
195
|
+
@solr_resp_5_docs.should include("fld2"=>"val2").as_first.document
|
192
196
|
end
|
193
197
|
it "fails when document(s) don't meet criteria" do
|
194
198
|
lambda {
|
@@ -199,17 +203,17 @@ describe RSpecSolr do
|
|
199
203
|
context "should_NOT #include().as_first(n).any_chained.names" do
|
200
204
|
it "fails when document(s) meet criteria" do
|
201
205
|
lambda {
|
202
|
-
@solr_resp_5_docs.should_not include(["111", "222"]).as_first(2).
|
206
|
+
@solr_resp_5_docs.should_not include(["111", "222"]).as_first(2).documents
|
203
207
|
}.should fail_matching('not to include documents ["111", "222"] in first 2')
|
204
208
|
lambda {
|
205
|
-
@solr_resp_5_docs.should_not include("fld2"=>"val2").as_first.
|
209
|
+
@solr_resp_5_docs.should_not include("fld2"=>"val2").as_first.document
|
206
210
|
}.should fail_matching('not to include document {"fld2"=>"val2"} in first 1')
|
207
211
|
end
|
208
212
|
it "passes when document(s) don't meet criteria" do
|
209
213
|
@solr_resp_5_docs.should_not include("fld"=>["val1", "val2", "val3"]).as_first.result
|
210
214
|
end
|
211
215
|
end
|
212
|
-
end # include().as_first().
|
216
|
+
end # include().as_first().allowed_chained.names
|
213
217
|
|
214
218
|
before(:all) do
|
215
219
|
@solr_resp_5_docs = RSpecSolr::SolrResponseHash.new({ "response" =>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-solr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-10-
|
13
|
+
date: 2012-10-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -158,6 +158,7 @@ files:
|
|
158
158
|
- spec/have_documents_spec.rb
|
159
159
|
- spec/include_before_spec.rb
|
160
160
|
- spec/include_document_spec.rb
|
161
|
+
- spec/include_in_each_of_first_n_spec.rb
|
161
162
|
- spec/include_in_first_n_spec.rb
|
162
163
|
- spec/number_of_documents_spec.rb
|
163
164
|
- spec/solr_response_hash_spec.rb
|
@@ -177,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
177
178
|
version: '0'
|
178
179
|
segments:
|
179
180
|
- 0
|
180
|
-
hash: -
|
181
|
+
hash: -2465877972703506306
|
181
182
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
183
|
none: false
|
183
184
|
requirements:
|
@@ -186,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
186
187
|
version: '0'
|
187
188
|
segments:
|
188
189
|
- 0
|
189
|
-
hash: -
|
190
|
+
hash: -2465877972703506306
|
190
191
|
requirements: []
|
191
192
|
rubyforge_project:
|
192
193
|
rubygems_version: 1.8.24
|
@@ -198,6 +199,7 @@ test_files:
|
|
198
199
|
- spec/have_documents_spec.rb
|
199
200
|
- spec/include_before_spec.rb
|
200
201
|
- spec/include_document_spec.rb
|
202
|
+
- spec/include_in_each_of_first_n_spec.rb
|
201
203
|
- spec/include_in_first_n_spec.rb
|
202
204
|
- spec/number_of_documents_spec.rb
|
203
205
|
- spec/solr_response_hash_spec.rb
|