From 87cc7799be53209fc163858b54a46f9650ca76ba Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Thu, 21 Aug 2014 16:47:21 +0300 Subject: [PATCH] Nameserver removing with domain update request --- app/helpers/epp/domains_helper.rb | 1 + app/models/domain.rb | 18 ++++++++-- app/models/domain_status.rb | 4 --- config/locales/en.yml | 2 ++ spec/epp/domain_spec.rb | 33 ++++++++++++++----- spec/epp/requests/domains/update.xml | 1 + .../requests/domains/update_add_objects.xml | 22 +++++++++++++ .../domains/update_remove_objects.xml | 19 +++++++++++ spec/fabricators/setting_group_fabricator.rb | 3 +- 9 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 spec/epp/requests/domains/update_add_objects.xml create mode 100644 spec/epp/requests/domains/update_remove_objects.xml diff --git a/app/helpers/epp/domains_helper.rb b/app/helpers/epp/domains_helper.rb index fe7c1289c..566f5ebd2 100644 --- a/app/helpers/epp/domains_helper.rb +++ b/app/helpers/epp/domains_helper.rb @@ -39,6 +39,7 @@ module Epp::DomainsHelper handle_errors(@domain) and return unless @domain handle_errors(@domain) and return unless @domain.attach_objects(@ph, parsed_frame.css('add')) + handle_errors(@domain) and return unless @domain.detach_objects(@ph, parsed_frame.css('rem')) handle_errors(@domain) and return unless @domain.save render '/epp/domains/success' diff --git a/app/models/domain.rb b/app/models/domain.rb index ad53ca3a5..1f52863ed 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -49,7 +49,7 @@ class Domain < ActiveRecord::Base write_attribute(:name_dirty, value) end - ### CREATE ### + ### CREATE & UPDATE ### def attach_objects(ph, parsed_frame) attach_owner_contact(ph[:registrant]) if ph[:registrant] @@ -60,6 +60,10 @@ class Domain < ActiveRecord::Base errors.empty? end + def detach_objects(ph, parsed_frame) + detach_nameservers(self.class.parse_nameservers_from_frame(parsed_frame)) + end + def attach_owner_contact(code) self.owner_contact = Contact.find_by(code: code) @@ -116,6 +120,15 @@ class Domain < ActiveRecord::Base end end + def detach_nameservers(ns_list) + to_delete = [] + ns_list.each do |ns_attrs| + to_delete << self.nameservers.where(ns_attrs) + end + + self.nameservers.delete(to_delete) + end + ### RENEW ### def renew(cur_exp_date, period, unit='y') @@ -255,7 +268,6 @@ class Domain < ActiveRecord::Base description: x.text } end - res end @@ -275,7 +287,7 @@ class Domain < ActiveRecord::Base end if Domain.find_by(name: x) - res << {name: x, avail: 0, reason: 'in use'} #confirm reason with current API + res << {name: x, avail: 0, reason: 'in use'} else res << {name: x, avail: 1} end diff --git a/app/models/domain_status.rb b/app/models/domain_status.rb index e3a9c47e7..80c898161 100644 --- a/app/models/domain_status.rb +++ b/app/models/domain_status.rb @@ -13,10 +13,6 @@ class DomainStatus < ActiveRecord::Base validates :setting, uniqueness: { scope: :domain_id } - def setting_uniqueness - - end - def epp_code_map { '2302' => [[:setting, :taken]] diff --git a/config/locales/en.yml b/config/locales/en.yml index df0e07895..6465dd977 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -70,6 +70,8 @@ en: attributes: setting: taken: 'Status already exists on this domain' + value: + taken: 'Status already exists on this domain' attributes: domain: name: 'Domain name' diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 98e9b9527..0ef3e6671 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -245,34 +245,51 @@ describe 'EPP Domain', epp: true do expect(response[:results][0][:msg]).to eq('Domain not found') end - it 'updates domain' do - response = epp_request('domains/update.xml') + it 'updates domain and adds objects' do + response = epp_request('domains/update_add_objects.xml') expect(response[:results][0][:result_code]).to eq('2303') expect(response[:results][0][:msg]).to eq('Contact was not found') Fabricate(:contact, code: 'mak21') - response = epp_request('domains/update.xml') + response = epp_request('domains/update_add_objects.xml') expect(response[:results][0][:result_code]).to eq('1000') d = Domain.first - new_ns = d.nameservers.find_by(hostname: 'ns2.example.com') - expect(new_ns).to be_truthy + new_ns_count = d.nameservers.where(hostname: ['ns1.example.com', 'ns2.example.com']).count + expect(new_ns_count).to eq(2) new_contact = d.tech_contacts.find_by(code: 'mak21') expect(new_contact).to be_truthy - expect(d.domain_statuses.count).to eq(1) + expect(d.domain_statuses.count).to eq(2) expect(d.domain_statuses.first.description).to eq('Payment overdue.') expect(d.domain_statuses.first.value).to eq('clientHold') expect(d.domain_statuses.first.code).to eq('client_hold') - response = epp_request('domains/update.xml') + expect(d.domain_statuses.last.value).to eq('clientUpdateProhibited') + + response = epp_request('domains/update_add_objects.xml') expect(response[:results][0][:result_code]).to eq('2302') expect(response[:results][0][:msg]).to eq('Status already exists on this domain') - expect(d.domain_statuses.count).to eq(1) + expect(d.domain_statuses.count).to eq(2) + end + + it 'updates a domain and removes objects' do + Fabricate(:contact, code: 'mak21') + epp_request('domains/update_add_objects.xml') + + d = Domain.last + + new_ns = d.nameservers.find_by(hostname: 'ns1.example.com') + expect(new_ns).to be_truthy + + response = epp_request('domains/update_remove_objects.xml') + + rem_ns = d.nameservers.find_by(hostname: 'ns1.example.com') + expect(rem_ns).to be_falsey end end diff --git a/spec/epp/requests/domains/update.xml b/spec/epp/requests/domains/update.xml index 0c4bd59dd..d3a5b9a6c 100644 --- a/spec/epp/requests/domains/update.xml +++ b/spec/epp/requests/domains/update.xml @@ -7,6 +7,7 @@ example.ee + ns1.example.com ns2.example.com mak21 diff --git a/spec/epp/requests/domains/update_add_objects.xml b/spec/epp/requests/domains/update_add_objects.xml new file mode 100644 index 000000000..8cfd17616 --- /dev/null +++ b/spec/epp/requests/domains/update_add_objects.xml @@ -0,0 +1,22 @@ + + + + + + example.ee + + + ns1.example.com + ns2.example.com + + mak21 + Payment overdue. + + + + + ABC-12345 + + diff --git a/spec/epp/requests/domains/update_remove_objects.xml b/spec/epp/requests/domains/update_remove_objects.xml new file mode 100644 index 000000000..fd79586c3 --- /dev/null +++ b/spec/epp/requests/domains/update_remove_objects.xml @@ -0,0 +1,19 @@ + + + + + + example.ee + + + ns1.example.com + + sh8013 + + + + + ABC-12345 + + diff --git a/spec/fabricators/setting_group_fabricator.rb b/spec/fabricators/setting_group_fabricator.rb index e4ea0ac1a..f4bb09221 100644 --- a/spec/fabricators/setting_group_fabricator.rb +++ b/spec/fabricators/setting_group_fabricator.rb @@ -17,6 +17,7 @@ end Fabricator(:domain_statuses_setting_group, from: :setting_group) do code 'domain_statuses' settings { [ - Fabricate(:setting, code: 'client_hold', value: 'clientHold') + Fabricate(:setting, code: 'client_hold', value: 'clientHold'), + Fabricate(:setting, code: 'client_update_prohibited', value: 'clientUpdateProhibited') ]} end