lib/active_merchant/billing/response.rb in jelaniharris-activemerchant-1.24.1 vs lib/active_merchant/billing/response.rb in jelaniharris-activemerchant-1.29.1

- old
+ new

@@ -1,32 +1,79 @@ module ActiveMerchant #:nodoc: module Billing #:nodoc: - class Error < ActiveMerchantError #:nodoc: end - + class Response attr_reader :params, :message, :test, :authorization, :avs_result, :cvv_result - + def success? @success end def test? @test end - + def fraud_review? @fraud_review end - + def initialize(success, message, params = {}, options = {}) @success, @message, @params = success, message, params.stringify_keys - @test = options[:test] || false + @test = options[:test] || false @authorization = options[:authorization] @fraud_review = options[:fraud_review] - @avs_result = AVSResult.new(options[:avs_result]).to_hash - @cvv_result = CVVResult.new(options[:cvv_result]).to_hash + + avs_result_builder = if options[:avs_result].kind_of?(Hash) + AVSResult.new(options[:avs_result]) + else + options[:avs_result] || {} + end + @avs_result = avs_result_builder.to_hash + + cvv_result_builder = if options[:cvv_result].kind_of?(String) + CVVResult.new(options[:cvv_result]) + else + options[:cvv_result] || {} + end + @cvv_result = cvv_result_builder.to_hash + end + end + + class MultiResponse < Response + def self.run(&block) + new.tap(&block) + end + + attr_reader :responses + + def initialize + @responses = [] + end + + def process + self << yield if(responses.empty? || success?) + end + + def <<(response) + if response.is_a?(MultiResponse) + response.responses.each{|r| @responses << r} + else + @responses << response + end + end + + def success? + @responses.all?{|r| r.success?} + end + + %w(params message test authorization avs_result cvv_result test? fraud_review?).each do |m| + class_eval %( + def #{m} + (@responses.empty? ? nil : @responses.last.#{m}) + end + ) end end end end