rspec-solr 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
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
|