diff --git a/app/models/concerns/domain/discardable.rb b/app/models/concerns/domain/discardable.rb index bf2b3d8c4..25547af0f 100644 --- a/app/models/concerns/domain/discardable.rb +++ b/app/models/concerns/domain/discardable.rb @@ -1,16 +1,6 @@ module Concerns::Domain::Discardable extend ActiveSupport::Concern - def discard - raise 'Domain is already discarded' if discarded? - - statuses << DomainStatus::DELETE_CANDIDATE - transaction do - save(validate: false) - delete_later - end - end - def keep statuses.delete(DomainStatus::DELETE_CANDIDATE) transaction do @@ -22,4 +12,14 @@ module Concerns::Domain::Discardable def discarded? statuses.include?(DomainStatus::DELETE_CANDIDATE) end + + private + + def discard + statuses << DomainStatus::DELETE_CANDIDATE + transaction do + save(validate: false) + delete_later + end + end end diff --git a/test/integration/epp/domain/domain_delete_test.rb b/test/integration/epp/domain/domain_delete_test.rb index 438e20eeb..da811da1a 100644 --- a/test/integration/epp/domain/domain_delete_test.rb +++ b/test/integration/epp/domain/domain_delete_test.rb @@ -31,9 +31,7 @@ class EppDomainDeleteTest < ApplicationIntegrationTest end def test_discarded_domain_cannot_be_deleted - travel_to Time.zone.parse('2010-07-05 10:30') - @domain.delete_at = Time.zone.parse('2010-07-05 10:00') - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) request_xml = <<-XML diff --git a/test/integration/epp/domain/domain_update_test.rb b/test/integration/epp/domain/domain_update_test.rb index 26996c63f..bdd39a0a4 100644 --- a/test/integration/epp/domain/domain_update_test.rb +++ b/test/integration/epp/domain/domain_update_test.rb @@ -32,9 +32,7 @@ class EppDomainUpdateTest < ApplicationIntegrationTest end def test_discarded_domain_cannot_be_updated - travel_to Time.zone.parse('2010-07-05 10:30') - @domain.delete_at = Time.zone.parse('2010-07-05 10:00') - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) request_xml = <<-XML diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index e54c65b16..82f453277 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -81,9 +81,7 @@ class EppDomainTransferRequestTest < ApplicationIntegrationTest end def test_discarded_domain_cannot_be_transferred - travel_to Time.zone.parse('2010-07-05 10:30') - @domain.delete_at = Time.zone.parse('2010-07-05 10:00') - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } @domain.reload diff --git a/test/models/domain/discardable_test.rb b/test/models/domain/discardable_test.rb deleted file mode 100644 index 0181a6bb4..000000000 --- a/test/models/domain/discardable_test.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'test_helper' - -class DomainDiscardableTest < ActiveSupport::TestCase - setup do - travel_to Time.zone.parse('2010-07-05 10:30') - @domain = domains(:shop) - @domain.delete_at = Time.zone.parse('2010-07-05 10:00') - end - - teardown do - travel_back - end - - def test_discarding_a_domain_persists_the_state - @domain.discard - @domain.reload - assert @domain.discarded? - end - - def test_discarding_a_domain_schedules_deletion_at_random_time - @domain.discard - other_domain = domains(:airport) - other_domain.delete_at = Time.zone.parse('2010-07-04') - other_domain.discard - - background_job = QueJob.find_by("args->>0 = '#{@domain.id}'", job_class: DomainDeleteJob.name) - other_background_job = QueJob.find_by("args->>0 = '#{other_domain.id}'", - job_class: DomainDeleteJob.name) - assert_not_equal background_job.run_at, other_background_job.run_at - end - - def test_discarding_a_domain_bypasses_validation - domain = domains(:invalid) - domain.delete_at = Time.zone.parse('2010-07-05 10:00') - domain.discard - domain.reload - assert domain.discarded? - end - - def test_domain_cannot_be_discarded_repeatedly - @domain.discard - - exception = assert_raises do - @domain.discard - end - assert_equal 'Domain is already discarded', exception.message - end - - def test_keeping_a_domain_bypasses_validation - domain = domains(:invalid) - domain.delete_at = Time.zone.parse('2010-07-05 10:00') - domain.discard - domain.keep - domain.reload - assert_not domain.discarded? - end - - def test_keeping_a_domain_cancels_domain_deletion - @domain.discard - @domain.keep - assert_nil QueJob.find_by("args->>0 = '#{@domain.id}'", job_class: DomainDeleteJob.name) - end -end diff --git a/test/models/domain/releasable/discardable_test.rb b/test/models/domain/releasable/discardable_test.rb index 5351a8d77..b8b6aff59 100644 --- a/test/models/domain/releasable/discardable_test.rb +++ b/test/models/domain/releasable/discardable_test.rb @@ -50,4 +50,46 @@ class DomainReleasableDiscardableTest < ActiveSupport::TestCase assert_not @domain.discarded? end + + def test_discarding_a_domain_schedules_deletion_at_random_time + travel_to Time.zone.parse('2010-07-05 10:30') + @domain.update_columns(delete_at: Time.zone.parse('2010-07-05 10:00')) + Domain.release_domains + + other_domain = domains(:airport) + other_domain.update_columns(delete_at: Time.zone.parse('2010-07-05 10:00')) + Domain.release_domains + + background_job = QueJob.find_by("args->>0 = '#{@domain.id}'", job_class: DomainDeleteJob.name) + other_background_job = QueJob.find_by("args->>0 = '#{other_domain.id}'", + job_class: DomainDeleteJob.name) + assert_not_equal background_job.run_at, other_background_job.run_at + end + + def test_discarding_a_domain_bypasses_validation + travel_to Time.zone.parse('2010-07-05 10:30') + domain = domains(:invalid) + domain.update_columns(delete_at: Time.zone.parse('2010-07-05 10:00')) + + Domain.release_domains + domain.reload + + assert domain.discarded? + end + + def test_keeping_a_domain_bypasses_validation + domain = domains(:invalid) + domain.update_columns(statuses: [DomainStatus::DELETE_CANDIDATE]) + + domain.keep + domain.reload + + assert_not domain.discarded? + end + + def test_keeping_a_domain_cancels_domain_deletion + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) + @domain.keep + assert_nil QueJob.find_by("args->>0 = '#{@domain.id}'", job_class: DomainDeleteJob.name) + end end diff --git a/test/system/admin_area/domains/details_test.rb b/test/system/admin_area/domains/details_test.rb index 04cdb06e3..33636e39a 100644 --- a/test/system/admin_area/domains/details_test.rb +++ b/test/system/admin_area/domains/details_test.rb @@ -13,7 +13,7 @@ class AdminAreaDomainDetailsTest < ApplicationSystemTestCase visit admin_domain_url(@domain) assert_no_css 'span.label.label-warning', text: 'deleteCandidate' - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) visit admin_domain_url(@domain) assert_css 'span.label.label-warning', text: 'deleteCandidate' diff --git a/test/system/admin_area/domains_test.rb b/test/system/admin_area/domains_test.rb index 91e484fc7..7037a076d 100644 --- a/test/system/admin_area/domains_test.rb +++ b/test/system/admin_area/domains_test.rb @@ -29,8 +29,7 @@ class AdminDomainsTestTest < ApplicationSystemTestCase end def test_keep_a_domain - @domain.delete_at = Time.zone.parse('2010-07-05 10:00') - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) visit edit_admin_domain_url(@domain) click_link_or_button 'Remove deleteCandidate status'