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