diff --git a/app/models/epp/response.rb b/app/models/epp/response.rb new file mode 100644 index 000000000..55f33c1bd --- /dev/null +++ b/app/models/epp/response.rb @@ -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 diff --git a/app/models/epp/response/result.rb b/app/models/epp/response/result.rb new file mode 100644 index 000000000..2251587c0 --- /dev/null +++ b/app/models/epp/response/result.rb @@ -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 diff --git a/spec/models/epp/response/result_spec.rb b/spec/models/epp/response/result_spec.rb new file mode 100644 index 000000000..eaf136793 --- /dev/null +++ b/spec/models/epp/response/result_spec.rb @@ -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 diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index cd242967b..2fdd6a8e8 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -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? diff --git a/spec/support/matchers/epp/have_result.rb b/spec/support/matchers/epp/have_result.rb new file mode 100644 index 000000000..7850082dd --- /dev/null +++ b/spec/support/matchers/epp/have_result.rb @@ -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 diff --git a/spec/support/requests/epp_helpers.rb b/spec/support/requests/epp_helpers.rb index beb8ca2c2..fb0175df1 100644 --- a/spec/support/requests/epp_helpers.rb +++ b/spec/support/requests/epp_helpers.rb @@ -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