-
Notifications
You must be signed in to change notification settings - Fork 62
/
reduce_to_matcher.rb
48 lines (42 loc) · 1.35 KB
/
reduce_to_matcher.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
module CouchPotato
module RSpec
class ReduceToProxy
def initialize(keys, values, rereduce = false)
@keys, @values, @rereduce = keys, values, rereduce
end
def to(expected_ruby)
ReduceToMatcher.new(expected_ruby, @keys, @values, @rereduce)
end
end
class ReduceToMatcher
def initialize(expected_ruby, keys, values, rereduce = false)
@expected_ruby, @keys, @values, @rereduce = expected_ruby, keys, values, rereduce
end
def matches?(view_spec)
js = <<-JS
(function() {
sum = function(values) {
var rv = 0;
for (var i in values) {
rv += values[i];
}
return rv;
};
var keys = #{@keys.to_json};
var values = #{@values.to_json};
var reduce = #{view_spec.reduce_function};
return JSON.stringify({result: reduce(keys, values, #{@rereduce})});
})()
JS
@actual_ruby = JSON.parse(ExecJS.eval(js))['result']
@expected_ruby == @actual_ruby
end
def failure_message
"Expected to reduce to #{@expected_ruby.inspect} but got #{@actual_ruby.inspect}."
end
def failure_message_when_negated
"Expected not to reduce to #{@actual_ruby.inspect} but did."
end
end
end
end