diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index 1a525a72c..69276df0e 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -1,7 +1,7 @@ module Admin class DomainsController < BaseController - load_and_authorize_resource - before_action :set_domain, only: [:show, :edit, :update, :zonefile] + before_action :set_domain, only: %i[show edit update keep] + authorize_resource helper_method :force_delete_templates def index @@ -33,7 +33,8 @@ module Admin end def show - @domain.valid? + # Validation is needed to warn users + @domain.validate end def edit @@ -60,6 +61,11 @@ module Admin @versions = @domain.versions end + def keep + @domain.keep + redirect_to edit_admin_domain_url(@domain), notice: t('.kept') + end + private def set_domain diff --git a/app/models/concerns/domain/deletable.rb b/app/models/concerns/domain/deletable.rb index 86c296d88..8640277c8 100644 --- a/app/models/concerns/domain/deletable.rb +++ b/app/models/concerns/domain/deletable.rb @@ -1,16 +1,25 @@ module Concerns::Domain::Deletable extend ActiveSupport::Concern - included do - alias_attribute :delete_time, :delete_at + private + + def delete_later + deletion_time = Time.zone.at(rand(deletion_time_span)) + DomainDeleteJob.enqueue(id, run_at: deletion_time, priority: 1) + logger.info "Domain #{name} is scheduled to be deleted around #{deletion_time}" end - def discard - statuses << DomainStatus::DELETE_CANDIDATE - save + def do_not_delete_later + # Que job can be manually deleted in admin area UI + QueJob.find_by("args->>0 = '#{id}'", job_class: DomainDeleteJob.name)&.destroy end - def discarded? - statuses.include?(DomainStatus::DELETE_CANDIDATE) + def deletion_time_span + range_params = [Time.zone.now.to_i, deletion_deadline.to_i].sort + Range.new(*range_params) end -end + + def deletion_deadline + delete_at + 24.hours + end +end \ No newline at end of file diff --git a/app/models/concerns/domain/discardable.rb b/app/models/concerns/domain/discardable.rb new file mode 100644 index 000000000..e46492220 --- /dev/null +++ b/app/models/concerns/domain/discardable.rb @@ -0,0 +1,40 @@ +module Concerns::Domain::Discardable + extend ActiveSupport::Concern + + class_methods do + def discard_domains + domains = where('delete_at < ? AND ? != ALL(coalesce(statuses, array[]::varchar[])) AND' \ + ' ? != ALL(COALESCE(statuses, array[]::varchar[]))', + Time.zone.now, + DomainStatus::SERVER_DELETE_PROHIBITED, + DomainStatus::DELETE_CANDIDATE) + + domains.each do |domain| + domain.discard + yield domain if block_given? + end + end + end + + 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 + save(validate: false) + do_not_delete_later + end + end + + def discarded? + statuses.include?(DomainStatus::DELETE_CANDIDATE) + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 84ecc37d0..a7ba227e6 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -4,6 +4,7 @@ class Domain < ActiveRecord::Base include Concerns::Domain::Expirable include Concerns::Domain::Activatable include Concerns::Domain::ForceDelete + include Concerns::Domain::Discardable include Concerns::Domain::Deletable include Concerns::Domain::Transferable @@ -249,13 +250,6 @@ class Domain < ActiveRecord::Base true end - def delete_candidateable? - return false if delete_at > Time.zone.now - return false if statuses.include?(DomainStatus::DELETE_CANDIDATE) - return false if statuses.include?(DomainStatus::SERVER_DELETE_PROHIBITED) - true - end - def renewable? if Setting.days_to_renew_domain_before_expire != 0 # if you can renew domain at days_to_renew before domain expiration @@ -613,10 +607,6 @@ class Domain < ActiveRecord::Base where("#{attribute_alias(:outzone_time)} < ?", Time.zone.now) end - def self.delete_candidates - where("#{attribute_alias(:delete_time)} < ?", Time.zone.now) - end - def self.uses_zone?(zone) exists?(["name ILIKE ?", "%.#{zone.origin}"]) end diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index 8de52b226..2d208d647 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -84,22 +84,6 @@ class DomainCron c = 0 - domains = Domain.delete_candidates - - domains.each do |domain| - next unless domain.delete_candidateable? - - domain.statuses << DomainStatus::DELETE_CANDIDATE - - # If domain successfully saved, add it to delete schedule - if domain.save(validate: false) - ::PaperTrail.whodunnit = "cron - #{__method__}" - DomainDeleteJob.enqueue(domain.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) - STDOUT << "#{Time.zone.now.utc} DomainCron.destroy_delete_candidates: job added by deleteCandidate status ##{domain.id} (#{domain.name})\n" unless Rails.env.test? - c += 1 - end - end - Domain.where('force_delete_at <= ?', Time.zone.now.end_of_day.utc).each do |x| DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) STDOUT << "#{Time.zone.now.utc} DomainCron.destroy_delete_candidates: job added by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? diff --git a/app/models/domain_status.rb b/app/models/domain_status.rb index 4da6a4a3c..2f7a457dd 100644 --- a/app/models/domain_status.rb +++ b/app/models/domain_status.rb @@ -153,13 +153,11 @@ class DomainStatus < ActiveRecord::Base [ ['Hold', SERVER_HOLD], ['ManualInzone', SERVER_MANUAL_INZONE], - # [''], ['RenewProhibited', SERVER_RENEW_PROHIBITED], ['TransferProhibited', SERVER_TRANSFER_PROHIBITED], ['RegistrantChangeProhibited', SERVER_REGISTRANT_CHANGE_PROHIBITED], ['AdminChangeProhibited', SERVER_ADMIN_CHANGE_PROHIBITED], ['TechChangeProhibited', SERVER_TECH_CHANGE_PROHIBITED], - # [''], ['UpdateProhibited', SERVER_UPDATE_PROHIBITED], ['DeleteProhibited', SERVER_DELETE_PROHIBITED] ] @@ -171,11 +169,11 @@ class DomainStatus < ActiveRecord::Base INACTIVE, FORCE_DELETE, PENDING_CREATE, - #PENDING_DELETE, PENDING_RENEW, PENDING_TRANSFER, PENDING_UPDATE, - PENDING_DELETE_CONFIRMATION + PENDING_DELETE_CONFIRMATION, + DELETE_CANDIDATE, ] end end diff --git a/app/models/que_job.rb b/app/models/que_job.rb new file mode 100644 index 000000000..5eed581fc --- /dev/null +++ b/app/models/que_job.rb @@ -0,0 +1,4 @@ +# To be able to remove existing jobs +class QueJob < ActiveRecord::Base + self.primary_key = 'job_id' +end diff --git a/app/presenters/domain_presenter.rb b/app/presenters/domain_presenter.rb index b82d4df3f..03516af5e 100644 --- a/app/presenters/domain_presenter.rb +++ b/app/presenters/domain_presenter.rb @@ -30,7 +30,7 @@ class DomainPresenter end def delete_date - view.l(domain.delete_time, format: :date) if domain.delete_time + view.l(domain.delete_at, format: :date) if domain.delete_at end def force_delete_date @@ -59,6 +59,15 @@ class DomainPresenter end end + def keep_btn + return unless domain.discarded? + + view.link_to view.t('admin.domains.edit.keep_btn'), view.keep_admin_domain_path(@domain), + method: :patch, + data: { confirm: view.t('admin.domains.edit.keep_btn_confirm') }, + class: 'btn btn-default' + end + private def schedule_force_delete_btn diff --git a/app/views/admin/domains/edit.html.erb b/app/views/admin/domains/edit.html.erb index 30028e09e..5bbb9f241 100644 --- a/app/views/admin/domains/edit.html.erb +++ b/app/views/admin/domains/edit.html.erb @@ -13,6 +13,7 @@
<%= link_to t('.add_new_status_btn'), '#', class: 'btn btn-primary js-add-status' %> + <%= domain.keep_btn %> <%= domain.force_delete_toggle_btn %>
diff --git a/config/locales/admin/domains.en.yml b/config/locales/admin/domains.en.yml index ed93eb647..41751874a 100644 --- a/config/locales/admin/domains.en.yml +++ b/config/locales/admin/domains.en.yml @@ -15,6 +15,11 @@ en: edit: header: "Edit: %{domain}" add_new_status_btn: Add new status + keep_btn: Remove deleteCandidate status + keep_btn_confirm: Are you sure you want to remove deleteCandidate status? + + keep: + kept: deleteCandidate status has been removed force_delete_dialog: title: Force delete diff --git a/config/routes.rb b/config/routes.rb index 62b7c20d2..362271516 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -190,11 +190,15 @@ Rails.application.routes.draw do match 'forward', via: [:post, :get] end - resources :domains do + resources :domains, except: %i[new create destroy] do resources :domain_versions, controller: 'domains', action: 'versions' resources :pending_updates resources :pending_deletes resource :force_delete, controller: 'domains/force_delete', only: %i[create destroy] + + member do + patch :keep + end end resources :domain_versions do diff --git a/config/schedule.rb b/config/schedule.rb index 6413a9c56..6ad7328b2 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -57,6 +57,10 @@ if @cron_group == 'registry' every :day, at: '19:00pm' do runner 'Directo.send_receipts' end if @environment == 'production' + + every 42.minutes do + rake 'domain:discard' + end end every 10.minutes do diff --git a/db/migrate/20180816123540_change_contacts_email_to_not_null.rb b/db/migrate/20180816123540_change_contacts_email_to_not_null.rb new file mode 100644 index 000000000..e6080e38b --- /dev/null +++ b/db/migrate/20180816123540_change_contacts_email_to_not_null.rb @@ -0,0 +1,5 @@ +class ChangeContactsEmailToNotNull < ActiveRecord::Migration + def change + change_column_null :contacts, :email, false + end +end \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 19672f4d2..c0b4742e6 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -613,7 +613,7 @@ CREATE TABLE public.contacts ( id integer NOT NULL, code character varying NOT NULL, phone character varying, - email character varying, + email character varying NOT NULL, fax character varying, created_at timestamp without time zone, updated_at timestamp without time zone, @@ -4762,6 +4762,8 @@ INSERT INTO schema_migrations (version) VALUES ('20180613045614'); INSERT INTO schema_migrations (version) VALUES ('20180713154915'); +INSERT INTO schema_migrations (version) VALUES ('20180816123540'); + INSERT INTO schema_migrations (version) VALUES ('20180823161237'); INSERT INTO schema_migrations (version) VALUES ('20180823163548'); diff --git a/lib/tasks/domain.rake b/lib/tasks/domain.rake new file mode 100644 index 000000000..a5cc6d557 --- /dev/null +++ b/lib/tasks/domain.rake @@ -0,0 +1,13 @@ +namespace :domain do + desc 'Discard domains' + task discard: :environment do + domain_count = 0 + + Domain.discard_domains do |domain| + puts "#{domain} is discarded" + domain_count = domain_count + 1 + end + + puts "Discarded total: #{domain_count}" + end +end \ No newline at end of file diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 858570c68..c88e25a6f 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -840,22 +840,6 @@ RSpec.describe Domain do end end - describe '::delete_candidates', db: true do - before :example do - travel_to Time.zone.parse('05.07.2010 00:00') - - create(:zone, origin: 'ee') - - create(:domain, id: 1, delete_time: Time.zone.parse('04.07.2010 23:59')) - create(:domain, id: 2, delete_time: Time.zone.parse('05.07.2010 00:00')) - create(:domain, id: 3, delete_time: Time.zone.parse('05.07.2010 00:01')) - end - - it 'returns domains with delete time in the past' do - expect(described_class.delete_candidates.ids).to eq([1]) - end - end - describe '::uses_zone?', db: true do let!(:zone) { create(:zone, origin: 'domain.tld') } diff --git a/spec/presenters/domain_presenter_spec.rb b/spec/presenters/domain_presenter_spec.rb index c83ca58ca..ff4fc2841 100644 --- a/spec/presenters/domain_presenter_spec.rb +++ b/spec/presenters/domain_presenter_spec.rb @@ -44,7 +44,7 @@ RSpec.describe DomainPresenter do subject(:delete_date) { presenter.delete_date } context 'when present' do - let(:domain) { instance_double(Domain, delete_time: '05.07.2010') } + let(:domain) { instance_double(Domain, delete_at: '05.07.2010') } it 'returns localized date' do expect(view).to receive(:l).with('05.07.2010', format: :date).and_return('delete date') @@ -53,7 +53,7 @@ RSpec.describe DomainPresenter do end context 'when absent' do - let(:domain) { instance_double(Domain, delete_time: nil) } + let(:domain) { instance_double(Domain, delete_at: nil) } specify { expect(delete_date).to be_nil } end diff --git a/test/integration/epp/domain/domain_delete_test.rb b/test/integration/epp/domain/domain_delete_test.rb index 61cd7d6f3..438e20eeb 100644 --- a/test/integration/epp/domain/domain_delete_test.rb +++ b/test/integration/epp/domain/domain_delete_test.rb @@ -1,6 +1,10 @@ require 'test_helper' class EppDomainDeleteTest < ApplicationIntegrationTest + def setup + @domain = domains(:shop) + end + def test_bypasses_domain_and_registrant_and_contacts_validation request_xml = <<-XML @@ -27,7 +31,9 @@ class EppDomainDeleteTest < ApplicationIntegrationTest end def test_discarded_domain_cannot_be_deleted - domains(:shop).discard + travel_to Time.zone.parse('2010-07-05 10:30') + @domain.delete_at = Time.zone.parse('2010-07-05 10:00') + @domain.discard request_xml = <<-XML @@ -51,5 +57,6 @@ class EppDomainDeleteTest < ApplicationIntegrationTest post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames' end assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code] + travel_back end end diff --git a/test/integration/epp/domain/domain_update_test.rb b/test/integration/epp/domain/domain_update_test.rb index f1db1b087..26996c63f 100644 --- a/test/integration/epp/domain/domain_update_test.rb +++ b/test/integration/epp/domain/domain_update_test.rb @@ -1,6 +1,10 @@ require 'test_helper' class EppDomainUpdateTest < ApplicationIntegrationTest + def setup + @domain = domains(:shop) + end + def test_update_domain request_xml = <<-XML @@ -21,13 +25,16 @@ class EppDomainUpdateTest < ApplicationIntegrationTest XML post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames' - assert_equal 'f0ff7d17b0', domains(:shop).transfer_code + @domain.reload + assert_equal 'f0ff7d17b0', @domain.transfer_code assert_equal '1000', 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_updated - domains(:shop).discard + travel_to Time.zone.parse('2010-07-05 10:30') + @domain.delete_at = Time.zone.parse('2010-07-05 10:00') + @domain.discard request_xml = <<-XML @@ -44,5 +51,6 @@ class EppDomainUpdateTest < ApplicationIntegrationTest post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames' assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code] + travel_back end end diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index d399b6753..e54c65b16 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -1,12 +1,17 @@ require 'test_helper' class EppDomainTransferRequestTest < ApplicationIntegrationTest - setup do + def setup @domain = domains(:shop) @new_registrar = registrars(:goodnames) + @original_transfer_wait_time = Setting.transfer_wait_time Setting.transfer_wait_time = 0 end + def teardown + Setting.transfer_wait_time = @original_transfer_wait_time + end + def test_transfers_domain_at_once post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] @@ -75,14 +80,17 @@ class EppDomainTransferRequestTest < ApplicationIntegrationTest assert_equal '2304', Nokogiri::XML(response.body).at_css('result')[:code] end - def test_discarded_domain - @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) + 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 post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } @domain.reload assert_equal registrars(:bestnames), @domain.registrar assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code] + travel_back end def test_same_registrar diff --git a/test/integration/tasks/discard_domain_test.rb b/test/integration/tasks/discard_domain_test.rb new file mode 100644 index 000000000..0da7014c7 --- /dev/null +++ b/test/integration/tasks/discard_domain_test.rb @@ -0,0 +1,51 @@ +require 'test_helper' + +class DiscardDomainTaskTest < TaskTestCase + setup do + travel_to Time.zone.parse('2010-07-05 08:00') + @domain = domains(:shop) + end + + def test_discard_domains_with_past_delete_at + @domain.update!(delete_at: Time.zone.parse('2010-07-05 07:59')) + Rake::Task['domain:discard'].execute + @domain.reload + assert @domain.discarded? + end + + def test_ignore_domains_with_delete_at_in_the_future_or_now + @domain.update!(delete_at: Time.zone.parse('2010-07-05 08:00')) + Rake::Task['domain:discard'].execute + @domain.reload + refute @domain.discarded? + end + + def test_ignore_already_discarded_domains + @domain.update!(delete_at: Time.zone.parse('2010-07-05 07:59')) + @domain.discard + + job_count = lambda do + QueJob.where("args->>0 = '#{@domain.id}'", job_class: DomainDeleteJob.name).count + end + + assert_no_difference job_count, 'A domain should not be discarded again' do + Rake::Task['domain:discard'].execute + end + end + + def test_ignore_domains_with_server_delete_prohibited_status + @domain.update!(delete_at: Time.zone.parse('2010-07-05 07:59'), + statuses: [DomainStatus::SERVER_DELETE_PROHIBITED]) + Rake::Task['domain:discard'].execute + @domain.reload + refute @domain.discarded? + end + + def test_show_results + @domain.update!(delete_at: Time.zone.parse('2010-07-05 07:59')) + $stdout = StringIO.new + + Rake::Task['domain:discard'].execute + assert_equal "shop.test is discarded\nDiscarded total: 1\n", $stdout.string + end +end \ No newline at end of file diff --git a/test/models/domain/deletable_test.rb b/test/models/domain/deletable_test.rb deleted file mode 100644 index dbec7bc7f..000000000 --- a/test/models/domain/deletable_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'test_helper' - -class DomainDeletableTest < ActiveSupport::TestCase - setup do - @domain = domains(:shop) - end - - def test_discard - refute @domain.discarded? - @domain.discard - @domain.reload - assert @domain.discarded? - end -end diff --git a/test/models/domain/discardable_test.rb b/test/models/domain/discardable_test.rb new file mode 100644 index 000000000..0181a6bb4 --- /dev/null +++ b/test/models/domain/discardable_test.rb @@ -0,0 +1,63 @@ +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/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 706af1ef0..646a34015 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -1,7 +1,7 @@ require 'test_helper' class DomainForceDeleteTest < ActiveSupport::TestCase - def setup + setup do @domain = domains(:shop) end @@ -74,7 +74,7 @@ class DomainForceDeleteTest < ActiveSupport::TestCase end def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) assert_raises StandardError do @domain.schedule_force_delete end diff --git a/test/system/admin_area/contact_versions_test.rb b/test/system/admin_area/contact_versions_test.rb index 10d20615a..8130706b6 100644 --- a/test/system/admin_area/contact_versions_test.rb +++ b/test/system/admin_area/contact_versions_test.rb @@ -21,8 +21,8 @@ class ContactVersionsTest < ApplicationSystemTestCase VALUES (75, 'test_registrar', 'test123', 'test@test.com', 'EE', 'TEST123', 'test123', 'en'); - INSERT INTO contacts (id, code, auth_info, registrar_id) - VALUES (75, 'test_code', '8b4d462aa04194ca78840a', 75); + INSERT INTO contacts (id, code, email, auth_info, registrar_id) + VALUES (75, 'test_code', 'test@inbox.test', '8b4d462aa04194ca78840a', 75); INSERT INTO log_contacts (item_type, item_id, event, whodunnit, object, object_changes, created_at, session, children, ident_updated_at, uuid) diff --git a/test/system/admin_area/domain_versions_test.rb b/test/system/admin_area/domain_versions_test.rb index 6c375cefe..dae7592c8 100644 --- a/test/system/admin_area/domain_versions_test.rb +++ b/test/system/admin_area/domain_versions_test.rb @@ -21,8 +21,8 @@ class DomainVersionsTest < ApplicationSystemTestCase VALUES (54, 'test_registrar', 'test123', 'test@test.com', 'EE', 'TEST123', 'test123', 'en'); - INSERT INTO contacts (id, code, auth_info, registrar_id) - VALUES (54, 'test_code', '8b4d462aa04194ca78840a', 54); + INSERT INTO contacts (id, code, email, auth_info, registrar_id) + VALUES (54, 'test_code', 'test@inbox.test', '8b4d462aa04194ca78840a', 54); INSERT INTO domains (id, registrar_id, valid_to, registrant_id, transfer_code) diff --git a/test/system/admin_area/domains/details_test.rb b/test/system/admin_area/domains/details_test.rb index 31a46a19b..04cdb06e3 100644 --- a/test/system/admin_area/domains/details_test.rb +++ b/test/system/admin_area/domains/details_test.rb @@ -7,9 +7,14 @@ class AdminAreaDomainDetailsTest < ApplicationSystemTestCase end def test_discarded_domain_has_corresponding_label + travel_to Time.zone.parse('2010-07-05 10:30') + @domain.delete_at = Time.zone.parse('2010-07-05 10:00') + visit admin_domain_url(@domain) assert_no_css 'span.label.label-warning', text: 'deleteCandidate' + @domain.discard + visit admin_domain_url(@domain) assert_css 'span.label.label-warning', text: 'deleteCandidate' end diff --git a/test/system/admin_area/domains/force_delete_test.rb b/test/system/admin_area/domains/force_delete_test.rb index 525e2de4c..561e4d47a 100644 --- a/test/system/admin_area/domains/force_delete_test.rb +++ b/test/system/admin_area/domains/force_delete_test.rb @@ -56,7 +56,7 @@ class AdminAreaDomainForceDeleteTest < ApplicationSystemTestCase end def test_force_delete_procedure_cannot_be_scheduled_on_a_discarded_domain - @domain.discard + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) visit edit_admin_domain_url(@domain) assert_no_button 'Schedule force delete' diff --git a/test/system/admin_area/domains_test.rb b/test/system/admin_area/domains_test.rb index 538de2604..cd7a8f10a 100644 --- a/test/system/admin_area/domains_test.rb +++ b/test/system/admin_area/domains_test.rb @@ -3,11 +3,29 @@ require 'test_helper' class AdminDomainsTestTest < ApplicationSystemTestCase setup do sign_in users(:admin) + @domain = domains(:shop) + end + + teardown do + travel_back end def test_shows_details - domain = domains(:shop) - visit admin_domain_path(domain) - assert_field nil, with: domain.transfer_code + visit admin_domain_path(@domain) + assert_field nil, with: @domain.transfer_code + end + + def test_keep_a_domain + travel_to Time.zone.parse('2010-07-05 10:30') + @domain.delete_at = Time.zone.parse('2010-07-05 10:00') + @domain.discard + + visit edit_admin_domain_url(@domain) + click_link_or_button 'Remove deleteCandidate status' + @domain.reload + + assert_not @domain.discarded? + assert_text 'deleteCandidate status has been removed' + assert_no_link 'Remove deleteCandidate status' end end