Extract domain transferable module

#660
This commit is contained in:
Artur Beljajev 2018-01-21 18:29:42 +02:00
parent 5716016192
commit 340e61804b
5 changed files with 40 additions and 32 deletions

View file

@ -0,0 +1,18 @@
module Concerns::Domain::Transferable
extend ActiveSupport::Concern
included do
after_initialize :generate_auth_info, if: :new_record?
end
def transfer(new_registrar)
self.registrar = new_registrar
generate_auth_info
end
private
def generate_auth_info
self.auth_info = SecureRandom.hex
end
end

View file

@ -6,6 +6,7 @@ class Domain < ActiveRecord::Base
include Concerns::Domain::Activatable include Concerns::Domain::Activatable
include Concerns::Domain::ForceDelete include Concerns::Domain::ForceDelete
include Concerns::Domain::Deletable include Concerns::Domain::Deletable
include Concerns::Domain::Transferable
has_paper_trail class_name: "DomainVersion", meta: { children: :children_log } has_paper_trail class_name: "DomainVersion", meta: { children: :children_log }
@ -79,9 +80,7 @@ class Domain < ActiveRecord::Base
self.status_notes = {} if status_notes.nil? self.status_notes = {} if status_notes.nil?
end end
before_create :generate_auth_info
before_create -> { self.reserved = in_reserved_list?; nil } before_create -> { self.reserved = in_reserved_list?; nil }
before_save :manage_automatic_statuses before_save :manage_automatic_statuses
before_save :touch_always_version before_save :touch_always_version
def touch_always_version def touch_always_version
@ -497,19 +496,6 @@ class Domain < ActiveRecord::Base
Registrant.find_by(id: pending_json['new_registrant_id']) Registrant.find_by(id: pending_json['new_registrant_id'])
end end
def generate_auth_info
return if auth_info.present?
generate_auth_info!
end
# rubocop:disable Lint/Loop
def generate_auth_info!
begin
self.auth_info = SecureRandom.hex
end while self.class.exists?(auth_info: auth_info)
end
# rubocop:enable Lint/Loop
def set_graceful_expired def set_graceful_expired
self.outzone_at = expire_time + self.class.expire_warning_period self.outzone_at = expire_time + self.class.expire_warning_period
self.delete_at = outzone_at + self.class.redemption_grace_period self.delete_at = outzone_at + self.class.redemption_grace_period
@ -672,11 +658,6 @@ class Domain < ActiveRecord::Base
pending_json['new_registrant_id'] pending_json['new_registrant_id']
end end
def transfer(new_registrar)
self.registrar = new_registrar
regenerate_auth_info
end
def self.to_csv def self.to_csv
CSV.generate do |csv| CSV.generate do |csv|
csv << column_names csv << column_names
@ -710,11 +691,5 @@ class Domain < ActiveRecord::Base
def self.uses_zone?(zone) def self.uses_zone?(zone)
exists?(["name ILIKE ?", "%.#{zone.origin}"]) exists?(["name ILIKE ?", "%.#{zone.origin}"])
end end
private
def regenerate_auth_info
generate_auth_info!
end
end end
# rubocop: enable Metrics/ClassLength # rubocop: enable Metrics/ClassLength

View file

@ -722,7 +722,7 @@ class Epp::Domain < Domain
if dt.approved? if dt.approved?
transfer_contacts(current_user.registrar_id) transfer_contacts(current_user.registrar_id)
dt.notify_losing_registrar(old_contact_codes, old_registrant_code) dt.notify_losing_registrar(old_contact_codes, old_registrant_code)
generate_auth_info! generate_auth_info
self.registrar = current_user.registrar self.registrar = current_user.registrar
end end

View file

@ -538,11 +538,6 @@ RSpec.describe Domain do
expect(domain.errors[:base]).to include('Required parameter missing; reserved>pw element required for reserved domains') expect(domain.errors[:base]).to include('Required parameter missing; reserved>pw element required for reserved domains')
end end
it 'generates auth info' do
d = create(:domain)
expect(d.auth_info).to_not be_empty
end
it 'manages statuses automatically' do it 'manages statuses automatically' do
d = build(:domain) d = build(:domain)

View file

@ -5,6 +5,26 @@ class DomainTest < ActiveSupport::TestCase
@domain = domains(:shop) @domain = domains(:shop)
end end
def test_validates
assert @domain.valid?
end
def test_generates_random_auth_info_if_new
domain = Domain.new
another_domain = Domain.new
refute_empty domain.auth_info
refute_empty another_domain.auth_info
refute_equal domain.auth_info, another_domain.auth_info
end
def test_does_not_regenerate_auth_info_if_persisted
original_auth_info = @domain.auth_info
@domain.save!
@domain.reload
assert_equal original_auth_info, @domain.auth_info
end
def test_transfers_domain def test_transfers_domain
old_auth_info = @domain.auth_info old_auth_info = @domain.auth_info
new_registrar = registrars(:goodnames) new_registrar = registrars(:goodnames)