diff --git a/app/models/concerns/domain/deletable.rb b/app/models/concerns/domain/deletable.rb
index f724162e5..a0d49decb 100644
--- a/app/models/concerns/domain/deletable.rb
+++ b/app/models/concerns/domain/deletable.rb
@@ -5,6 +5,11 @@ module Concerns::Domain::Deletable
alias_attribute :delete_time, :delete_at
end
+ def discard
+ self.statuses << DomainStatus::DELETE_CANDIDATE
+ save
+ end
+
def discarded?
statuses.include?(DomainStatus::DELETE_CANDIDATE)
end
diff --git a/spec/factories/domain.rb b/spec/factories/domain.rb
index fc4d3a97b..4e15a8713 100644
--- a/spec/factories/domain.rb
+++ b/spec/factories/domain.rb
@@ -10,9 +10,5 @@ FactoryBot.define do
domain.admin_domain_contacts << FactoryBot.build(:admin_domain_contact)
domain.tech_domain_contacts << FactoryBot.build(:tech_domain_contact)
end
-
- factory :domain_discarded do
- statuses [DomainStatus::DELETE_CANDIDATE]
- end
end
end
diff --git a/spec/models/concerns/domain/deletable_spec.rb b/spec/models/concerns/domain/deletable_spec.rb
deleted file mode 100644
index 826299b69..000000000
--- a/spec/models/concerns/domain/deletable_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Domain, db: false do
- it { is_expected.to alias_attribute(:delete_time, :delete_at) }
-
- describe '#discarded?' do
- context 'when :deleteCandidate status is present' do
- let(:domain) { described_class.new(statuses: [DomainStatus::DELETE_CANDIDATE]) }
-
- specify { expect(domain).to be_discarded }
- end
-
- context 'when :deleteCandidate status is absent' do
- let(:domain) { described_class.new(statuses: []) }
-
- specify { expect(domain).to_not be_discarded }
- end
- end
-end
diff --git a/spec/requests/epp/domain/delete/discarded_spec.rb b/spec/requests/epp/domain/delete/discarded_spec.rb
deleted file mode 100644
index 55e74d965..000000000
--- a/spec/requests/epp/domain/delete/discarded_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe 'EPP domain:delete' do
- let(:registrar) { create(:registrar) }
- let(:user) { create(:api_user_epp, registrar: registrar) }
- let(:session_id) { create(:epp_session, user: user).session_id }
- let(:request_xml) { <<-XML
-
-
-
-
-
- test.com
-
-
-
-
- dGVzdCBmYWlsCg==
-
-
-
-
- XML
- }
-
- before :example do
- login_as user
- end
-
- context 'when domain is not discarded' do
- let!(:domain) { create(:domain, name: 'test.com') }
-
- it 'returns epp code of 1001' do
- post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}"
- expect(response).to have_code_of(1001)
- end
- end
-
- context 'when domain is discarded' do
- let!(:domain) { create(:domain_discarded, name: 'test.com') }
-
- it 'returns epp code of 2105' do
- post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}"
- expect(response).to have_code_of(2105)
- end
- end
-end
diff --git a/spec/requests/epp/domain/update/discarded_spec.rb b/spec/requests/epp/domain/update/discarded_spec.rb
deleted file mode 100644
index 4a31b7d10..000000000
--- a/spec/requests/epp/domain/update/discarded_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe 'EPP domain:update' do
- let(:registrar) { create(:registrar) }
- let(:user) { create(:api_user_epp, registrar: registrar) }
- let(:session_id) { create(:epp_session, user: user).session_id }
- let(:request_xml) { <<-XML
-
-
-
-
-
- test.com
-
-
-
-
- XML
- }
-
- before :example do
- login_as user
- end
-
- context 'when domain is not discarded' do
- let!(:domain) { create(:domain, name: 'test.com') }
-
- it 'returns epp code of 1000' do
- post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}"
- expect(response).to have_code_of(1000)
- end
- end
-
- context 'when domain is discarded' do
- let!(:domain) { create(:domain_discarded, name: 'test.com') }
-
- it 'returns epp code of 2105' do
- post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}"
- expect(response).to have_code_of(2105)
- end
- end
-end
diff --git a/test/integration/epp/domain/domain_delete_test.rb b/test/integration/epp/domain/domain_delete_test.rb
index bdd326a3e..eae4d39ff 100644
--- a/test/integration/epp/domain/domain_delete_test.rb
+++ b/test/integration/epp/domain/domain_delete_test.rb
@@ -25,4 +25,31 @@ class EppDomainDeleteTest < ActionDispatch::IntegrationTest
assert_equal '1001', Nokogiri::XML(response.body).at_css('result')[:code]
assert_equal 1, Nokogiri::XML(response.body).css('result').size
end
+
+ def test_discarded_domain_cannot_be_deleted
+ domains(:shop).discard
+
+ request_xml = <<-XML
+
+
+
+
+
+ shop.test
+
+
+
+
+ dGVzdCBmYWlsCg==
+
+
+
+
+ XML
+
+ assert_no_difference 'Domain.count' do
+ post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
+ end
+ assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code]
+ end
end
diff --git a/test/integration/epp/domain/domain_update_test.rb b/test/integration/epp/domain/domain_update_test.rb
new file mode 100644
index 000000000..9519b37bc
--- /dev/null
+++ b/test/integration/epp/domain/domain_update_test.rb
@@ -0,0 +1,23 @@
+require 'test_helper'
+
+class EppDomainUpdateTest < ActionDispatch::IntegrationTest
+ def test_discarded_domain_cannot_be_updated
+ domains(:shop).discard
+
+ request_xml = <<-XML
+
+
+
+
+
+ shop.test
+
+
+
+
+ XML
+
+ post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
+ assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code]
+ end
+end
diff --git a/test/models/domain/deletable_test.rb b/test/models/domain/deletable_test.rb
new file mode 100644
index 000000000..499ff20b6
--- /dev/null
+++ b/test/models/domain/deletable_test.rb
@@ -0,0 +1,14 @@
+require 'test_helper'
+
+class DomainDeletableTest < ActiveSupport::TestCase
+ def setup
+ @domain = domains(:shop)
+ end
+
+ def test_discard
+ refute @domain.discarded?
+ @domain.discard
+ @domain.reload
+ assert @domain.discarded?
+ end
+end