# frozen_string_literal: true require "savon/mock" module Savon module SpecHelper class Interface def mock! Savon.observers << self end def unmock! Savon.observers.clear end def expects(operation_name) expectation = MockExpectation.new(operation_name) expectations << expectation expectation end def expectations @expectations ||= [] end def notify(operation_name, builder, globals, locals) expectation = expectations.shift if expectation expectation.actual(operation_name, builder, globals, locals) expectation.verify! expectation.response! else raise ExpectationError, "Unexpected request to the #{operation_name.inspect} operation." end rescue ExpectationError @expectations.clear raise end def verify! return if expectations.empty? expectations.each(&:verify!) rescue ExpectationError @expectations.clear raise end end def savon @savon ||= Interface.new end def verify_mocks_for_rspec super if defined? super savon.verify! end end end