Add EPP response spec matcher

This commit is contained in:
Artur Beljajev 2017-08-18 13:04:24 +03:00
parent dfca1d4e69
commit 3038d240f7
6 changed files with 115 additions and 1 deletions

View file

@ -0,0 +1,22 @@
module EPP
class Response
attr_accessor :results
def self.from_xml(xml)
xml_doc = Nokogiri::XML(xml)
response = self.new
result_elements = xml_doc.css('result')
result_elements.each do |result_element|
response.results << Result.new(result_element[:code].to_s, result_element.text.strip)
end
response
end
def initialize
@results = []
end
end
end

View file

@ -0,0 +1,28 @@
module EPP
class Response
class Result
CODE_TO_TYPE = {
'1000' => :success,
'1001' => :success_pending,
'1300' => :success_empty_queue,
'1301' => :success_dequeue,
'2001' => :syntax_error,
'2003' => :required_param_missing,
'2005' => :param_syntax_error,
'2308' => :data_management_policy_violation,
}
attr_accessor :code
attr_accessor :message
def initialize(code, message)
@code = code
@message = message
end
def self.codes
CODE_TO_TYPE
end
end
end
end

View file

@ -0,0 +1,21 @@
require 'rails_helper'
RSpec.describe EPP::Response::Result, db: false do
# https://tools.ietf.org/html/rfc5730#section-3
describe '::codes' do
it 'returns codes' do
codes = {
'1000' => :success,
'1001' => :success_pending,
'1300' => :success_empty_queue,
'1301' => :success_dequeue,
'2001' => :syntax_error,
'2003' => :required_param_missing,
'2005' => :param_syntax_error,
'2308' => :data_management_policy_violation,
}
expect(described_class.codes).to eq(codes)
end
end
end

View file

@ -10,6 +10,7 @@ require 'support/requests/epp_helpers'
require 'support/features/session_helpers'
require 'support/matchers/alias_attribute'
require 'support/matchers/epp/code'
require 'support/matchers/epp/have_result'
require 'support/capybara'
require 'support/devise'
@ -28,7 +29,8 @@ RSpec.configure do |config|
config.include AbstractController::Translation, type: :request
config.include AbstractController::Translation, type: :feature
config.include AbstractController::Translation, type: :mailer
config.include Requests::EPPHelpers, type: :request
config.include Requests::EPPHelpers, epp: true
config.include Matchers::EPP, epp: true
config.define_derived_metadata(file_path: %r[/spec/features/]) do |metadata|
metadata[:db] = true if metadata[:db].nil?

View file

@ -0,0 +1,37 @@
module Matchers
module EPP
class HaveResultMatcher
def initialize(expected)
@expected = expected
end
def matches?(target)
@target = target
if @expected.message.present?
@target.results.any? { |result| result.code == @expected.code && result.message == @expected.message }
else
@target.results.any? { |result| result.code == @expected.code }
end
end
def failure_message
"expected #{@target.results} to have result #{@expected.inspect}"
end
def failure_message_when_negated
"expected #{@target.results} not to have result #{@expected.inspect}"
end
def description
"should have EPP code of #{@expected}"
end
end
def have_result(type, message = nil)
code = ::EPP::Response::Result.codes.key(type)
result = ::EPP::Response::Result.new(code, message)
HaveResultMatcher.new(result)
end
end
end

View file

@ -7,5 +7,9 @@ module Requests
def valid_legal_document
Base64.encode64('a' * 5000)
end
def epp_response
EPP::Response.from_xml(response.body)
end
end
end