Merge branch 'master' into registry-661

This commit is contained in:
Artur Beljajev 2018-02-26 16:10:20 +02:00
commit 03b6f1df91
18 changed files with 147 additions and 224 deletions

6
.reek
View file

@ -144,7 +144,6 @@ DuplicateMethodCall:
- Admin::DomainsController#build_associations
- Admin::DomainsController#index
- Admin::DomainsController#normalize_search_parameters
- Admin::DomainsController#schedule_force_delete
- Admin::EppLogsController#index
- Admin::EppLogsController#set_default_dates
- Admin::LegalDocumentsController#show
@ -474,7 +473,6 @@ IrresponsibleModule:
- Registrar::ApplicationHelper
- DomainDeleteConfirmEmailJob
- DomainDeleteConfirmJob
- DomainDeleteForcedEmailJob
- DomainDeleteJob
- DomainExpireEmailJob
- DomainUpdateConfirmJob
@ -623,7 +621,6 @@ TooManyStatements:
- Admin::DomainVersionsController#show
- Admin::DomainsController#index
- Admin::DomainsController#normalize_search_parameters
- Admin::DomainsController#schedule_force_delete
- Admin::DomainsController#update
- Admin::EppLogsController#index
- Admin::InvoicesController#create
@ -852,7 +849,6 @@ UtilityFunction:
- ApplicationHelper#plain_username
- ApplicationHelper#unstable_env
- DomainDeleteConfirmEmailJob#logger
- DomainDeleteForcedEmailJob#logger
- DomainExpireEmailJob#run
- RegenerateRegistrarWhoisesJob#run
- RegistrantChangeConfirmEmailJob#logger
@ -891,8 +887,6 @@ FeatureEnvy:
- DomainDeleteConfirmEmailJob#run
- DomainDeleteConfirmJob#raise_errors!
- DomainDeleteConfirmJob#run
- DomainDeleteForcedEmailJob#log
- DomainDeleteForcedEmailJob#run
- DomainDeleteJob#run
- DomainUpdateConfirmJob#raise_errors!
- DomainUpdateConfirmJob#run

View file

@ -0,0 +1,13 @@
(function() {
let container = document.querySelector('.domain-edit-force-delete-dialog');
let toggle = container.querySelector('[data-dependent-content-toggle]');
let dependentContent = container.querySelector('.email-template-row');
if (!toggle) {
return;
}
toggle.addEventListener('change', function() {
dependentContent.hidden = !this.checked;
});
})();

View file

@ -0,0 +1,39 @@
module Admin
module Domains
class ForceDeleteController < BaseController
def create
authorize! :manage, domain
domain.transaction do
domain.schedule_force_delete
domain.registrar.messages.create!(body: t('force_delete_set_on_domain', domain_name: domain.name))
if notify_by_email?
DomainDeleteMailer.forced(domain: domain,
registrar: domain.registrar,
registrant: domain.registrant,
template_name: params[:template_name]).deliver_now
end
end
redirect_to edit_admin_domain_url(domain), notice: t('.scheduled')
end
def destroy
authorize! :manage, domain
domain.cancel_force_delete
redirect_to edit_admin_domain_url(domain), notice: t('.cancelled')
end
private
def domain
@domain ||= Domain.find(params[:domain_id])
end
def notify_by_email?
ActiveRecord::Type::Boolean.new.type_cast_from_user(params[:notify_by_email])
end
end
end
end

View file

@ -62,28 +62,6 @@ module Admin
end
end
def schedule_force_delete
raise 'Template param cannot be empty' if params[:template_name].blank?
@domain.transaction do
@domain.schedule_force_delete
@domain.registrar.messages.create!(body: I18n.t('force_delete_set_on_domain', domain_name: @domain.name))
DomainDeleteForcedEmailJob.enqueue(@domain.id, params[:template_name])
end
redirect_to edit_admin_domain_path(@domain), notice: t('.scheduled')
end
def cancel_force_delete
if @domain.cancel_force_delete
flash[:notice] = t('.cancelled')
else
flash.now[:alert] = I18n.t('failed_to_update_domain')
end
redirect_to edit_admin_domain_path(@domain)
end
def versions
@domain = Domain.where(id: params[:domain_id]).includes({ versions: :item }).first
@versions = @domain.versions

View file

@ -1,23 +0,0 @@
class DomainDeleteForcedEmailJob < Que::Job
def run(domain_id, template_name)
domain = Domain.find(domain_id)
log(domain)
DomainDeleteMailer.forced(domain: domain,
registrar: domain.registrar,
registrant: domain.registrant,
template_name: template_name).deliver_now
end
private
def log(domain)
message = "Send DomainDeleteMailer#forced email for domain #{domain.name} (##{domain.id})" \
" to #{domain.primary_contact_emails.join(', ')}"
logger.info(message)
end
def logger
Rails.logger
end
end

View file

@ -41,7 +41,7 @@ class DomainPresenter
def force_delete_toggle_btn
if !domain.force_delete_scheduled?
view.content_tag(:a, view.t('admin.domains.force_delete_toggle_btn.schedule'),
class: 'btn btn-danger',
class: 'btn btn-default',
data: {
toggle: 'modal',
target: '.domain-edit-force-delete-dialog',
@ -49,9 +49,9 @@ class DomainPresenter
)
else
view.link_to(view.t('admin.domains.force_delete_toggle_btn.cancel'),
view.cancel_force_delete_admin_domain_path(domain),
method: :patch,
data: { confirm: view.t('admin.domains.force_delete_toggle_btn.cancel_confim') },
view.admin_domain_force_delete_path(domain),
method: :delete,
data: { confirm: view.t('admin.domains.force_delete_toggle_btn.cancel_confirm') },
class: 'btn btn-primary')
end
end

View file

@ -8,19 +8,27 @@
<h4 class="modal-title"><%= t '.title' %></h4>
</div>
<div class="modal-body">
<div class="row">
<%= form_tag schedule_force_delete_admin_domain_path, method: :patch,
id: 'domain-force-delete-form', class: 'form-horizontal' do %>
<div class="form-group">
<label class="col-sm-2 control-label"><%= t '.template' %>:</label>
<div class="col-sm-9">
<%= select_tag 'template_name', options_for_select(templates), class: 'form-control' %>
</div>
<%= form_tag admin_domain_force_delete_path(domain), id: 'domain-force-delete-form',
class: 'modal-body form-horizontal' do %>
<div class="form-group">
<div class="col-md-9">
<div class="checkbox">
<label>
<%= check_box_tag 'notify_by_email', 1, true,
data: { dependent_content_toggle: true } %>
<%= t '.notify_by_email' %>
</label>
</div>
<% end %>
</div>
</div>
</div>
<div class="form-group email-template-row">
<label class="col-md-3 control-label"><%= t '.email_template' %></label>
<div class="col-md-9">
<%= select_tag 'template_name', options_for_select(templates), class: 'form-control' %>
</div>
</div>
<% end %>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><%= t '.close_btn' %></button>

View file

@ -17,4 +17,4 @@
<hr>
<%= render 'form' %>
<%= render 'force_delete_dialog', templates: force_delete_templates %>
<%= render 'force_delete_dialog', domain: @domain, templates: force_delete_templates %>

View file

@ -14,16 +14,11 @@ en:
force_delete_dialog:
title: Force delete
template: Template
notify_by_email: Notify registrant and administrative contacts by email
email_template: Email template
close_btn: Close dialog
submit_btn: Force delete domain
schedule_force_delete:
scheduled: Force delete procedure has been scheduled
cancel_force_delete:
cancelled: Force delete procedure has been cancelled
versions:
time: Time
registrant: Registrant
@ -48,4 +43,4 @@ en:
force_delete_toggle_btn:
schedule: Schedule force delete
cancel: Cancel force delete
cancel_confim: Are you sure you want cancel force delete procedure?
cancel_confirm: Are you sure you want cancel force delete procedure?

View file

@ -0,0 +1,9 @@
en:
admin:
domains:
force_delete:
create:
scheduled: Force delete procedure has been scheduled
destroy:
cancelled: Force delete procedure has been cancelled

View file

@ -297,16 +297,12 @@ en:
add_another: 'Add another'
domain_updated: 'Domain updated!'
failed_to_update_domain: 'Failed to update domain'
failed_to_create_contact: 'Failed to create contact'
contact_deleted: 'Contact deleted'
failed_to_delete_contact: 'Failed to delete contact'
edit_contact: 'Edit contact'
failed_to_update_contact: 'Failed to update contact'
contact_updated: 'Contact updated'
search: 'Search'
reg_no: 'Reg. no'
status: 'Status'
eedirekt: 'EEDirekt'
contact: 'Contact'
credit_balance: 'Credit balance'
starting_balance: 'Starting balance'
@ -317,8 +313,6 @@ en:
welcome: 'Welcome!'
edit_statuses: 'Edit statuses'
contact_list: 'Contact list'
create_new_contact: 'Create new contact'
history: 'History'
new_registrar: 'New registrar'
@ -331,14 +325,11 @@ en:
users: 'Users'
user_details: 'User details'
edit_user: 'Edit user'
back_to_user: 'Back to user'
certificate_signing_req: 'Certificate signing request'
csr: 'CSR'
crt: 'CRT'
api_user_details: 'API user details'
edit_api_user: 'Edit API user'
back_to_api_user: 'Back to API user'
dnskey: 'DNS key'
@ -359,16 +350,12 @@ en:
transfer_requested: 'Transfer requested.'
message_was_not_found: 'Message was not found'
host_obj_is_not_allowed: 'hostObj object is not allowed'
zonefile: 'Zonefile'
only_one_parameter_allowed: 'Only one parameter allowed: %{param_1} or %{param_2}'
exactly_one_parameter_required: 'Exactly one parameter required: %{params}'
required_parameter_missing_choice: 'Required parameter missing: %{param_1} or %{param_2}'
ds_data_with_key_allowed: 'Allow DS data with key'
key_data_allowed: 'Allow key data'
ds_digest_type: 'DS digest type'
background_jobs: Background jobs
domains_history: Domains history
role: 'Role'
user: 'User'
customer_service: 'Customer service'
@ -387,7 +374,6 @@ en:
admin_contacts_max_count: 'Admin contacts maximum count'
tech_contacts_min_count: 'Tech contacts minimum count'
tech_contacts_max_count: 'Tech contacts maximum count'
action_failed_due_to_server_error: 'Action failed due to server error'
transfer_can_be_rejected_only_by_current_registrar: 'Transfer can be rejected only by current registrar'
request_command: 'Request command'
request_object: 'Request object'
@ -441,8 +427,6 @@ en:
sim_error: 'SIM application error'
internal_error: 'Internal error'
client_side_status_editing_error: 'Parameter value policy error. Client-side object status management not supported'
switch_to: Switch to
admin_menu: Admin
business_registry_service_not_available: "Business Registry service Ärireg is not available"
# DEPP

View file

@ -204,11 +204,7 @@ Rails.application.routes.draw do
resources :domain_versions, controller: 'domains', action: 'versions'
resources :pending_updates
resources :pending_deletes
member do
patch 'schedule_force_delete'
patch 'cancel_force_delete'
end
resource :force_delete, controller: 'domains/force_delete', only: %i[create destroy]
end
resources :domain_versions do

View file

@ -11,11 +11,6 @@ FactoryBot.define do
domain.tech_domain_contacts << FactoryBot.build(:tech_domain_contact)
end
factory :domain_without_force_delete do
force_delete_time nil
statuses []
end
factory :domain_discarded do
statuses [DomainStatus::DELETE_CANDIDATE]
end

View file

@ -1,33 +0,0 @@
require 'rails_helper'
RSpec.feature 'Force delete' do
context 'when domain has no force delete procedure' do
given!(:domain) { create(:domain_without_force_delete) }
scenario 'schedule' do
sign_in_to_admin_area
visit edit_admin_domain_url(domain)
click_link_or_button 'Force delete domain'
expect(page).to have_text('Force delete procedure has been scheduled')
end
end
context 'when domain has force delete procedure' do
given!(:domain) { create(:domain_without_force_delete) }
background do
domain.schedule_force_delete
end
scenario 'cancel' do
sign_in_to_admin_area
visit edit_admin_domain_url(domain)
click_link_or_button 'Cancel force delete'
expect(page).to have_text('Force delete procedure has been cancelled')
end
end
end

View file

@ -1,42 +0,0 @@
require 'rails_helper'
RSpec.describe DomainDeleteForcedEmailJob do
describe '#run' do
let(:domain) { instance_double(Domain) }
let(:message) { instance_double(ActionMailer::MessageDelivery) }
before :example do
expect(Domain).to receive(:find).and_return(domain)
allow(domain).to receive_messages(
id: 1,
name: 'test.com',
registrar: 'registrar',
registrant: 'registrant',
primary_contact_emails: %w(test@test.com test@test.com))
end
after :example do
domain_id = 1
template_name = 'removed_company'
described_class.enqueue(domain_id, template_name)
end
it 'creates log record' do
log_message = 'Send DomainDeleteMailer#forced email for domain test.com (#1) to test@test.com, test@test.com'
allow(DomainDeleteMailer).to receive(:forced).and_return(message)
allow(message).to receive(:deliver_now)
expect(Rails.logger).to receive(:info).with(log_message)
end
it 'sends email' do
expect(DomainDeleteMailer).to receive(:forced).with(domain: domain,
registrar: 'registrar',
registrant: 'registrant',
template_name: 'removed_company')
.and_return(message)
expect(message).to receive(:deliver_now)
end
end
end

View file

@ -114,41 +114,6 @@ RSpec.describe DomainPresenter do
end
end
describe '#force_delete_toggle_btn' do
let(:domain) { build_stubbed(:domain) }
context 'when force delete is not scheduled' do
before :example do
expect(domain).to receive(:force_delete_scheduled?).and_return(false)
end
it 'returns schedule button' do
html = view.content_tag(:a, 'Schedule force delete',
class: 'btn btn-danger',
data: {
toggle: 'modal',
target: '.domain-edit-force-delete-dialog',
})
expect(presenter.force_delete_toggle_btn).to eq(html)
end
end
context 'when force delete is scheduled' do
before :example do
expect(domain).to receive(:force_delete_scheduled?).and_return(true)
end
it 'returns cancel button' do
html = link_to('Cancel force delete',
view.cancel_force_delete_admin_domain_path(domain),
method: :patch,
data: { confirm: 'Are you sure you want cancel force delete procedure?' },
class: 'btn btn-primary')
expect(presenter.force_delete_toggle_btn).to eq(html)
end
end
end
domain_delegatable_attributes = %i(
name
transfer_code

View file

@ -1,13 +0,0 @@
require 'rails_helper'
RSpec.describe Admin::DomainsController do
describe 'routing' do
it 'routes to #schedule_force_delete' do
expect(patch: '/admin/domains/1/schedule_force_delete').to route_to('admin/domains#schedule_force_delete', id: '1')
end
it 'routes to #cancel_force_delete' do
expect(patch: '/admin/domains/1/cancel_force_delete').to route_to('admin/domains#cancel_force_delete', id: '1')
end
end
end

View file

@ -0,0 +1,58 @@
require 'test_helper'
class AdminAreaDomainForceDeleteTest < ActionDispatch::IntegrationTest
include ActionMailer::TestHelper
def setup
login_as users(:admin)
@domain = domains(:shop)
ActionMailer::Base.deliveries.clear
end
def test_schedules_domain_force_delete
refute @domain.force_delete_scheduled?
visit edit_admin_domain_url(@domain)
click_link_or_button 'Force delete domain'
@domain.reload
assert @domain.force_delete_scheduled?
assert_current_path edit_admin_domain_path(@domain)
assert_text 'Force delete procedure has been scheduled'
end
def test_notifies_registrar
assert_difference '@domain.registrar.messages.size' do
visit edit_admin_domain_url(@domain)
click_link_or_button 'Force delete domain'
end
end
def test_notifies_registrant_and_admin_contacts_by_email_by_default
assert_emails 1 do
visit edit_admin_domain_url(@domain)
click_link_or_button 'Force delete domain'
end
end
def test_allows_to_skip_notifying_registrant_and_admin_contacts_by_email
assert_no_emails do
visit edit_admin_domain_url(@domain)
uncheck 'notify_by_email'
click_link_or_button 'Force delete domain'
end
end
def test_cancels_scheduled_domain_force_delete
@domain.update_attribute(:statuses, [DomainStatus::FORCE_DELETE])
assert @domain.force_delete_scheduled?
visit edit_admin_domain_url(@domain)
click_link_or_button 'Cancel force delete'
@domain.reload
refute @domain.force_delete_scheduled?
assert_current_path edit_admin_domain_path(@domain)
assert_text 'Force delete procedure has been cancelled'
end
end