spec/spec_helper.rb in appengine-apis-0.0.2 vs spec/spec_helper.rb in appengine-apis-0.0.3

- old
+ new

@@ -7,5 +7,80 @@ end $:.unshift(File.dirname(__FILE__) + '/../lib') require 'appengine-apis/testing' AppEngine::Testing.install_test_env + +class ProtoMatcher + def compare(hash, proto, prefix='') + hash.each do |key, value| + name = "#{prefix}#{key}" + case value + when Array + if value[0].kind_of? Hash + count = proto.send("#{key}_size") + compare_value("#{name}.size", value.size, count) + value.each_with_index do |item, index| + break if index == count + compare(item, proto.send(key, index), "#{name}[#{index}].") + end + else + actual = proto.send("#{key}s").to_a + compare_value(name, value, actual) + end + when Hash + compare(value, proto.send(key), "#{name}.") + else + compare_value(name, value, proto.send(key)) + end + end + end + + def compare_value(label, expected, actual) + if expected != actual + @failures << "%s differs. expected: %s actual: %s" % + [label, expected.inspect, actual.inspect] + end + end + + def initialize(klass, expected) + @klass = klass + @expected = expected + end + + def matches(bytes) + @failures = [] + @proto = @klass.new + @proto.parse_from(bytes) + compare(@expected, @proto) + @failures.empty? + end + + def ==(bytes) + Spec::Expectations.fail_with(failure_message) unless matches(bytes) + true + end + + def failure_message + @failures.join("\n") + end +end + +module ProtoMethods + def proto(klass, hash) + ProtoMatcher.new(klass, hash) + end + alias be_proto proto + + def mock_delegate + delegate = mock("apiproxy") + delegate.instance_eval do + class << self + include AppEngine::ApiProxy::Delegate + end + end + end +end + +Spec::Runner.configure do |config| + config.include(ProtoMethods) +end \ No newline at end of file