From e653d8b56e84f6583e75de96a39f07b058980313 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 7 Nov 2016 23:12:19 +0200 Subject: [PATCH] Extract expirable concern from domain model #238 --- app/models/concerns/domain/expirable.rb | 31 +++++++++ app/models/domain.rb | 18 ++--- app/models/domain_cron.rb | 2 +- spec/models/concerns/domain/expirable_spec.rb | 65 +++++++++++++++++++ 4 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 app/models/concerns/domain/expirable.rb create mode 100644 spec/models/concerns/domain/expirable_spec.rb diff --git a/app/models/concerns/domain/expirable.rb b/app/models/concerns/domain/expirable.rb new file mode 100644 index 000000000..abfeed400 --- /dev/null +++ b/app/models/concerns/domain/expirable.rb @@ -0,0 +1,31 @@ +module Concerns::Domain::Expirable + extend ActiveSupport::Concern + + included do + alias_attribute :expire_time, :valid_to + end + + class_methods do + def expired + where("#{attribute_alias(:expire_time)} < ?", Time.zone.now) + end + end + + def registered? + !expired? + end + + def expired? + expire_time.past? + end + + def expirable? + return false if expire_time > Time.zone.now + + if statuses.include?(DomainStatus::EXPIRED) && outzone_at.present? && delete_at.present? + return false + end + + true + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 0b3f6cdea..479a3d453 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -3,6 +3,8 @@ class Domain < ActiveRecord::Base include UserEvents include Versions # version/domain_version.rb include Statuses + include Concerns::Domain::Expirable + has_paper_trail class_name: "DomainVersion", meta: { children: :children_log } attr_accessor :roles @@ -284,16 +286,6 @@ class Domain < ActiveRecord::Base domain_transfers.find_by(status: DomainTransfer::PENDING) end - def expirable? - return false if valid_to > Time.zone.now - - if statuses.include?(DomainStatus::EXPIRED) && outzone_at.present? && delete_at.present? - return false - end - - true - end - def server_holdable? return false if statuses.include?(DomainStatus::SERVER_HOLD) return false if statuses.include?(DomainStatus::SERVER_MANUAL_INZONE) @@ -310,7 +302,7 @@ class Domain < ActiveRecord::Base def renewable? if Setting.days_to_renew_domain_before_expire != 0 # if you can renew domain at days_to_renew before domain expiration - if (valid_to.to_date - Date.today) + 1 > Setting.days_to_renew_domain_before_expire + if (expire_time.to_date - Date.today) + 1 > Setting.days_to_renew_domain_before_expire return false end end @@ -597,7 +589,7 @@ class Domain < ActiveRecord::Base end def set_graceful_expired - self.outzone_at = valid_to + 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.statuses |= [DomainStatus::EXPIRED] end @@ -627,7 +619,7 @@ class Domain < ActiveRecord::Base when DomainStatus::SERVER_MANUAL_INZONE # removal causes server hold to set self.outzone_at = Time.zone.now if self.force_delete_at.present? when DomainStatus::DomainStatus::EXPIRED # removal causes server hold to set - self.outzone_at = self.valid_to + 15.day + self.outzone_at = self.expire_time + 15.day when DomainStatus::DomainStatus::SERVER_HOLD # removal causes server hold to set self.outzone_at = nil end diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index 549e3b1da..dd1faa10e 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -35,7 +35,7 @@ class DomainCron STDOUT << "#{Time.zone.now.utc} - Expiring domains\n" unless Rails.env.test? ::PaperTrail.whodunnit = "cron - #{__method__}" - domains = Domain.where('valid_to <= ?', Time.zone.now) + domains = Domain.expired marked = 0 real = 0 domains.each do |domain| diff --git a/spec/models/concerns/domain/expirable_spec.rb b/spec/models/concerns/domain/expirable_spec.rb new file mode 100644 index 000000000..4f29354f6 --- /dev/null +++ b/spec/models/concerns/domain/expirable_spec.rb @@ -0,0 +1,65 @@ +require 'rails_helper' + +RSpec.describe Domain, db: false do + it { is_expected.to alias_attribute(:expire_time, :valid_to) } + + describe '::expired', db: true do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + Fabricate(:zonefile_setting, origin: 'ee') + + Fabricate.create(:domain, id: 1, expire_time: Time.zone.parse('04.07.2010 23:59')) + Fabricate.create(:domain, id: 2, expire_time: Time.zone.parse('05.07.2010 00:00')) + Fabricate.create(:domain, id: 3, expire_time: Time.zone.parse('05.07.2010 00:01')) + end + + it 'returns expired domains' do + expect(described_class.expired.ids).to eq([1]) + end + end + + describe '#registered?' do + let(:domain) { described_class.new } + + context 'when not expired' do + before :example do + expect(domain).to receive(:expired?).and_return(false) + end + + specify { expect(domain).to be_registered } + end + + context 'when expired' do + before :example do + expect(domain).to receive(:expired?).and_return(true) + end + + specify { expect(domain).to_not be_registered } + end + end + + describe '#expired?' do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + end + + context 'when :expire_time is in the past' do + let(:domain) { described_class.new(expire_time: Time.zone.parse('04.07.2010 23:59')) } + + specify { expect(domain).to be_expired } + end + + context 'when :expire_time is now' do + let(:domain) { described_class.new(expire_time: Time.zone.parse('05.07.2010 00:00')) } + + specify { expect(domain).to_not be_expired } + end + + context 'when :expire_time is in the future' do + let(:domain) { described_class.new(expire_time: Time.zone.parse('05.07.2010 00:01')) } + + specify { expect(domain).to_not be_expired } + end + end +end