diff --git a/app/helpers/epp/domains_helper.rb b/app/helpers/epp/domains_helper.rb index f413178c8..316cdc254 100644 --- a/app/helpers/epp/domains_helper.rb +++ b/app/helpers/epp/domains_helper.rb @@ -6,8 +6,7 @@ module Epp::DomainsHelper if @domain.save && @domain.attach_contacts(domain_contacts) render '/epp/domains/create' else - handle_domain_name_errors - handle_contact_errors + handle_errors render '/epp/error' raise ActiveRecord::Rollback end @@ -50,18 +49,18 @@ module Epp::DomainsHelper res end - def handle_domain_name_errors - [:epp_domain_taken, :epp_domain_reserved].each do |x| - if @domain.errors.added?(:name, x) - epp_errors << {code: '2302', msg: @domain.errors[:name].first} + def handle_errors + error_code_map = { + '2302' => [:epp_domain_taken, :epp_domain_reserved], + '2306' => [:blank], + '2303' => [:epp_contact_not_found] + } + + @domain.errors.each do |key, err| + error_code_map.each do |code, values| + epp_errors << {code: code, msg: err} and break if values.any? {|x| @domain.errors.added?(key, x) } end end end - def handle_contact_errors - if @domain.errors.added?(:admin_contacts, :blank) - epp_errors << {code: '2306', msg: @domain.errors[:admin_contacts].first} - end - end - end diff --git a/app/models/domain.rb b/app/models/domain.rb index cc5d15d62..eb30a6b8c 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -17,14 +17,9 @@ class Domain < ActiveRecord::Base has_and_belongs_to_many :nameservers - validates_presence_of :name - - validates :name, domain_name: true, uniqueness: { message: I18n.t('errors.messages.epp_domain_taken') } - validates :name_puny, domain_name: true + validates :name_dirty, domain_name: true, uniqueness: { message: I18n.t('errors.messages.epp_domain_taken') } validates :period, numericality: { only_integer: true, greater_than: 0, less_than: 100 } - validates :owner_contact, presence: true - # validates :tech_contacts_count - #validate :admin_contacts_count, on: :update + validates :name, :owner_contact, presence: true def name=(value) value.strip! @@ -36,7 +31,9 @@ class Domain < ActiveRecord::Base def attach_contacts(contacts) contacts.each do |k, v| v.each do |x| - attach_contact(k, Contact.find_by(code: x[:contact])) + contact = Contact.find_by(code: x[:contact]) + attach_contact(k, contact) and next if contact + errors.add(:domain_contacts, I18n.t('errors.messages.epp_contact_not_found')) end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 5d4c49008..ddcf9e1fa 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -51,3 +51,4 @@ en: epp_domain_taken: 'Domain name already exists' epp_obj_does_not_exist: 'Object does not exist' epp_command_failed: 'Command failed' + epp_contact_not_found: "Contact was not found" diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index bc34d71c9..5bbc3a408 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -6,8 +6,28 @@ describe 'EPP Domain', epp: true do context 'with valid user' do before(:each) { Fabricate(:epp_user) } + it 'returns error if contact does not exists' do + Fabricate(:contact, code: 'jd1234') + + response = epp_request('domains/create.xml') + expect(response[:results][0][:result_code]).to eq('2303') + expect(response[:results][0][:msg]).to eq('Contact was not found') + + expect(response[:results][1][:result_code]).to eq('2303') + expect(response[:results][1][:msg]).to eq('Contact was not found') + + expect(response[:results][2][:result_code]).to eq('2303') + expect(response[:results][2][:msg]).to eq('Contact was not found') + + expect(response[:clTRID]).to eq('ABC-12345') + end + context 'with citizen as an owner' do - before(:each) { Fabricate(:contact, code: 'jd1234') } + before(:each) { + Fabricate(:contact, code: 'jd1234') + Fabricate(:contact, code: 'sh8013') + Fabricate(:contact, code: 'sh801333') + } it 'creates a domain' do response = epp_request('domains/create.xml') @@ -16,11 +36,8 @@ describe 'EPP Domain', epp: true do expect(response[:clTRID]).to eq('ABC-12345') expect(Domain.first.registrar.name).to eq('Zone Media OÜ') - expect(Domain.first.tech_contacts.count).to eq 1 + expect(Domain.first.tech_contacts.count).to eq 2 expect(Domain.first.admin_contacts.count).to eq 1 - - tech_contact = Domain.first.tech_contacts.first - expect(tech_contact.code).to eq('jd1234') end it 'does not create duplicate domain' do @@ -39,18 +56,9 @@ describe 'EPP Domain', epp: true do expect(response[:clTRID]).to eq('ABC-12345') end - it 'creates a domain with other contacts' do - Fabricate(:contact, code: 'sh8013') - Fabricate(:contact, code: 'sh801333') - - response = epp_request('domains/create.xml') - expect(response[:result_code]).to eq('1000') - expect(response[:msg]).to eq('Command completed successfully') - expect(response[:clTRID]).to eq('ABC-12345') - - expect(Domain.first.tech_contacts.count).to eq 2 - expect(Domain.first.admin_contacts.count).to eq 1 - expect(Domain.first.owner_contact).to_not be nil + it 'does not create domain without contacts and registrant' do + response = epp_request('domains/create_wo_contacts_and_registrant.xml') + expect(response[:result_code]).to eq('2306') end end diff --git a/spec/epp/requests/domains/create_wo_contacts_and_registrant.xml b/spec/epp/requests/domains/create_wo_contacts_and_registrant.xml new file mode 100644 index 000000000..222bb7837 --- /dev/null +++ b/spec/epp/requests/domains/create_wo_contacts_and_registrant.xml @@ -0,0 +1,20 @@ + + + + + + example.ee + 1 + + ns1.example.net + ns2.example.net + + + 2fooBAR + + + + ABC-12345 + + diff --git a/spec/support/epp.rb b/spec/support/epp.rb index a1c3b2282..169bfa737 100644 --- a/spec/support/epp.rb +++ b/spec/support/epp.rb @@ -23,13 +23,21 @@ module Epp def parse_response raw res = Nokogiri::XML(raw) - { - result_code: res.css('epp response result').first[:code], - msg: res.css('epp response result msg').text, + obj = { + results: [], clTRID: res.css('epp trID clTRID').text, parsed: res.remove_namespaces!, raw: raw } + + res.css('epp response result').each do |x| + obj[:results] << {result_code: x[:code], msg: x.css('msg').text} + end + + obj[:result_code] = obj[:results][0][:result_code] + obj[:msg] = obj[:results][0][:msg] + + obj end end