mirror of
https://github.com/internetee/registry.git
synced 2025-06-06 20:55:44 +02:00
parent
296442e330
commit
487613db1e
14 changed files with 424 additions and 84 deletions
38
app/models/concerns/contact/archivable.rb
Normal file
38
app/models/concerns/contact/archivable.rb
Normal file
|
@ -0,0 +1,38 @@
|
|||
module Concerns
|
||||
module Contact
|
||||
module Archivable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
class_attribute :inactivity_period, instance_predicate: false, instance_writer: false
|
||||
self.inactivity_period = Setting.orphans_contacts_in_months.months
|
||||
end
|
||||
|
||||
class_methods do
|
||||
def archivable
|
||||
unlinked.find_each.select(&:archivable?)
|
||||
end
|
||||
end
|
||||
|
||||
def archivable?
|
||||
inactive?
|
||||
end
|
||||
|
||||
def archive
|
||||
raise 'Contact cannot be archived' unless archivable?
|
||||
destroy!
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def inactive?
|
||||
if DomainVersion.was_contact_linked?(self)
|
||||
DomainVersion.contact_unlinked_more_than?(contact: self,
|
||||
period: inactivity_period)
|
||||
else
|
||||
created_at <= inactivity_period.ago
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -5,6 +5,7 @@ class Contact < ActiveRecord::Base
|
|||
include Concerns::Contact::Transferable
|
||||
include Concerns::Contact::Identical
|
||||
include Concerns::Contact::Disclosable
|
||||
include Concerns::Contact::Archivable
|
||||
|
||||
belongs_to :original, class_name: self.name
|
||||
belongs_to :registrar, required: true
|
||||
|
@ -144,61 +145,17 @@ class Contact < ActiveRecord::Base
|
|||
res.reduce([]) { |o, v| o << { id: v[:id], display_key: "#{v.name} (#{v.code})" } }
|
||||
end
|
||||
|
||||
def find_orphans
|
||||
where('
|
||||
NOT EXISTS(
|
||||
select 1 from domains d where d.registrant_id = contacts.id
|
||||
) AND NOT EXISTS(
|
||||
select 1 from domain_contacts dc where dc.contact_id = contacts.id
|
||||
)
|
||||
')
|
||||
end
|
||||
|
||||
def find_linked
|
||||
where('
|
||||
EXISTS(
|
||||
select 1 from domains d where d.registrant_id = contacts.id
|
||||
) OR EXISTS(
|
||||
select 1 from domain_contacts dc where dc.contact_id = contacts.id
|
||||
)
|
||||
')
|
||||
end
|
||||
|
||||
def filter_by_states in_states
|
||||
states = Array(in_states).dup
|
||||
scope = all
|
||||
|
||||
# all contacts has state ok, so no need to filter by it
|
||||
scope = scope.where("NOT contacts.statuses && ?::varchar[]", "{#{(STATUSES - [OK, LINKED]).join(',')}}") if states.delete(OK)
|
||||
scope = scope.find_linked if states.delete(LINKED)
|
||||
scope = scope.linked if states.delete(LINKED)
|
||||
scope = scope.where("contacts.statuses @> ?::varchar[]", "{#{states.join(',')}}") if states.any?
|
||||
scope
|
||||
end
|
||||
|
||||
# To leave only new ones we need to check
|
||||
# if contact was at any time used in domain.
|
||||
# This can be checked by domain history.
|
||||
# This can be checked by saved relations in children attribute
|
||||
def destroy_orphans
|
||||
STDOUT << "#{Time.zone.now.utc} - Destroying orphaned contacts\n" unless Rails.env.test?
|
||||
|
||||
counter = Counter.new
|
||||
find_orphans.find_each do |contact|
|
||||
ver_scope = []
|
||||
%w(admin_contacts tech_contacts registrant).each do |type|
|
||||
ver_scope << "(children->'#{type}')::jsonb <@ json_build_array(#{contact.id})::jsonb"
|
||||
end
|
||||
next if DomainVersion.where("created_at > ?", Time.now - Setting.orphans_contacts_in_months.to_i.months).where(ver_scope.join(" OR ")).any?
|
||||
next if contact.linked?
|
||||
|
||||
contact.destroy
|
||||
counter.next
|
||||
STDOUT << "#{Time.zone.now.utc} Contact.destroy_orphans: ##{contact.id} (#{contact.name})\n" unless Rails.env.test?
|
||||
end
|
||||
|
||||
STDOUT << "#{Time.zone.now.utc} - Successfully destroyed #{counter} orphaned contacts\n" unless Rails.env.test?
|
||||
end
|
||||
|
||||
def admin_statuses
|
||||
[
|
||||
SERVER_UPDATE_PROHIBITED,
|
||||
|
@ -257,6 +214,23 @@ class Contact < ActiveRecord::Base
|
|||
.country.alpha2)
|
||||
end
|
||||
|
||||
def linked
|
||||
sql = <<-SQL
|
||||
EXISTS(SELECT 1 FROM domains WHERE domains.registrant_id = contacts.id) OR
|
||||
EXISTS(SELECT 1 FROM domain_contacts WHERE domain_contacts.contact_id =
|
||||
contacts.id)
|
||||
SQL
|
||||
|
||||
where(sql)
|
||||
end
|
||||
|
||||
def unlinked
|
||||
where('NOT EXISTS(SELECT 1 FROM domains WHERE domains.registrant_id = contacts.id)
|
||||
AND
|
||||
NOT EXISTS(SELECT 1 FROM domain_contacts WHERE domain_contacts.contact_id =
|
||||
contacts.id)')
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def registrant_user_indirect_contacts(registrant_user)
|
||||
|
@ -557,4 +531,4 @@ class Contact < ActiveRecord::Base
|
|||
def deletable?
|
||||
!linked?
|
||||
end
|
||||
end
|
||||
end
|
14
app/models/inactive_contacts.rb
Normal file
14
app/models/inactive_contacts.rb
Normal file
|
@ -0,0 +1,14 @@
|
|||
class InactiveContacts
|
||||
attr_reader :contacts
|
||||
|
||||
def initialize(contacts = Contact.archivable)
|
||||
@contacts = contacts
|
||||
end
|
||||
|
||||
def archive
|
||||
contacts.each do |contact|
|
||||
contact.archive
|
||||
yield contact if block_given?
|
||||
end
|
||||
end
|
||||
end
|
|
@ -5,4 +5,41 @@ class DomainVersion < PaperTrail::Version
|
|||
self.sequence_name = :log_domains_id_seq
|
||||
|
||||
scope :deleted, -> { where(event: 'destroy') }
|
||||
end
|
||||
|
||||
def self.was_contact_linked?(contact)
|
||||
sql = <<-SQL
|
||||
SELECT
|
||||
COUNT(*)
|
||||
FROM
|
||||
#{table_name}
|
||||
WHERE
|
||||
(children->'registrant') @> '#{contact.id}'
|
||||
OR
|
||||
(children->'admin_contacts') @> '#{contact.id}'
|
||||
OR
|
||||
(children->'tech_contacts') @> '#{contact.id}'
|
||||
SQL
|
||||
|
||||
count_by_sql(sql).nonzero?
|
||||
end
|
||||
|
||||
def self.contact_unlinked_more_than?(contact:, period:)
|
||||
sql = <<-SQL
|
||||
SELECT
|
||||
COUNT(*)
|
||||
FROM
|
||||
#{table_name}
|
||||
WHERE
|
||||
created_at < TIMESTAMP WITH TIME ZONE '#{period.ago}'
|
||||
AND (
|
||||
(children->'registrant') @> '#{contact.id}'
|
||||
OR
|
||||
(children->'admin_contacts') @> '#{contact.id}'
|
||||
OR
|
||||
(children->'tech_contacts') @> '#{contact.id}'
|
||||
)
|
||||
SQL
|
||||
|
||||
count_by_sql(sql).nonzero?
|
||||
end
|
||||
end
|
|
@ -18,7 +18,7 @@ if @cron_group == 'registry'
|
|||
end
|
||||
|
||||
every 6.months, at: '12:01am' do
|
||||
runner 'Contact.destroy_orphans'
|
||||
rake 'contacts:archive'
|
||||
end
|
||||
|
||||
every :day, at: '12:10am' do
|
||||
|
|
14
lib/tasks/contacts/archive.rake
Normal file
14
lib/tasks/contacts/archive.rake
Normal file
|
@ -0,0 +1,14 @@
|
|||
namespace :contacts do
|
||||
desc 'Archives inactive contacts'
|
||||
|
||||
task archive: :environment do
|
||||
inactive_contacts = InactiveContacts.new
|
||||
archived_contacts = inactive_contacts.archive
|
||||
|
||||
archived_contacts.each do |contact|
|
||||
puts "Contact ##{contact.id} (code: #{contact.code}) is archived"
|
||||
end
|
||||
|
||||
puts "Archived total: #{archived_contacts.count}"
|
||||
end
|
||||
end
|
|
@ -185,34 +185,6 @@ RSpec.describe Contact do
|
|||
end
|
||||
end
|
||||
|
||||
describe Contact, '.destroy_orphans' do
|
||||
before do
|
||||
create(:zone, origin: 'ee')
|
||||
@contact_1 = create(:contact, code: 'asd12')
|
||||
@contact_2 = create(:contact, code: 'asd13')
|
||||
end
|
||||
|
||||
it 'destroys orphans' do
|
||||
Contact.find_orphans.count.should == 2
|
||||
Contact.destroy_orphans
|
||||
Contact.find_orphans.count.should == 0
|
||||
end
|
||||
|
||||
it 'should find one orphan' do
|
||||
create(:domain, registrant: Registrant.find(@contact_1.id))
|
||||
Contact.find_orphans.count.should == 1
|
||||
Contact.find_orphans.last.should == @contact_2
|
||||
end
|
||||
|
||||
it 'should find no orphans' do
|
||||
create(:domain, registrant: Registrant.find(@contact_1.id), admin_contacts: [@contact_2])
|
||||
cc = Contact.count
|
||||
Contact.find_orphans.count.should == 0
|
||||
Contact.destroy_orphans
|
||||
Contact.count.should == cc
|
||||
end
|
||||
end
|
||||
|
||||
RSpec.describe Contact do
|
||||
it { is_expected.to alias_attribute(:kind, :ident_type) }
|
||||
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
class ContactMailerPreview < ActionMailer::Preview
|
||||
def email_changed
|
||||
# Replace with `Contact.in_use` once https://github.com/internetee/registry/pull/1146 is merged
|
||||
contact = Contact.where('EXISTS(SELECT 1 FROM domains WHERE domains.registrant_id = contacts.id)
|
||||
OR
|
||||
EXISTS(SELECT 1 FROM domain_contacts WHERE domain_contacts.contact_id =
|
||||
contacts.id)')
|
||||
|
||||
contact = Contact.linked
|
||||
contact = contact.where.not(email: nil, country_code: nil, code: nil).first
|
||||
|
||||
ContactMailer.email_changed(contact: contact, old_email: 'old@inbox.test')
|
||||
|
|
81
test/models/contact/archivable_test.rb
Normal file
81
test/models/contact/archivable_test.rb
Normal file
|
@ -0,0 +1,81 @@
|
|||
require 'test_helper'
|
||||
|
||||
class ArchivableContactTest < ActiveSupport::TestCase
|
||||
setup do
|
||||
@contact = contacts(:john)
|
||||
end
|
||||
|
||||
def test_contact_is_archivable_when_it_was_linked_and_inactivity_period_has_passed
|
||||
DomainVersion.stub(:was_contact_linked?, true) do
|
||||
DomainVersion.stub(:contact_unlinked_more_than?, true) do
|
||||
assert @contact.archivable?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_contact_is_archivable_when_it_was_never_linked_and_inactivity_period_has_passed
|
||||
Contact.inactivity_period = 1.second
|
||||
@contact.created_at = Time.zone.parse('2010-07-05 00:00:00')
|
||||
travel_to Time.zone.parse('2010-07-05 00:00:01')
|
||||
|
||||
DomainVersion.stub(:was_contact_linked?, false) do
|
||||
assert @contact.archivable?
|
||||
end
|
||||
end
|
||||
|
||||
def test_contact_is_not_archivable_when_it_was_never_linked_and_inactivity_period_has_not_passed
|
||||
Contact.inactivity_period = 1.second
|
||||
@contact.created_at = Time.zone.parse('2010-07-05')
|
||||
travel_to Time.zone.parse('2010-07-05')
|
||||
|
||||
DomainVersion.stub(:contact_unlinked_more_than?, false) do
|
||||
assert_not @contact.archivable?
|
||||
end
|
||||
end
|
||||
|
||||
def test_contact_is_not_archivable_when_it_was_ever_linked_but_linked_within_inactivity_period
|
||||
DomainVersion.stub(:was_contact_linked?, true) do
|
||||
DomainVersion.stub(:contact_unlinked_more_than?, false) do
|
||||
assert_not @contact.archivable?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_archives_contact
|
||||
contact = archivable_contact
|
||||
|
||||
assert_difference 'Contact.count', -1 do
|
||||
contact.archive
|
||||
end
|
||||
end
|
||||
|
||||
def test_unarchivable_contact_cannot_be_archived
|
||||
contact = unarchivable_contact
|
||||
|
||||
e = assert_raises do
|
||||
contact.archive
|
||||
end
|
||||
assert_equal 'Contact cannot be archived', e.message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def archivable_contact
|
||||
contact = contacts(:john)
|
||||
Contact.inactivity_period = 0.seconds
|
||||
DomainVersion.delete_all
|
||||
|
||||
other_contact = contacts(:william)
|
||||
assert_not_equal other_contact, contact
|
||||
Domain.update_all(registrant_id: other_contact)
|
||||
|
||||
DomainContact.delete_all
|
||||
|
||||
contact
|
||||
end
|
||||
|
||||
def unarchivable_contact
|
||||
Contact.inactivity_period = 99.years
|
||||
@contact
|
||||
end
|
||||
end
|
|
@ -133,6 +133,52 @@ class ContactTest < ActiveSupport::TestCase
|
|||
assert_not @contact.deletable?
|
||||
end
|
||||
|
||||
def test_linked_scope_returns_contact_that_acts_as_registrant
|
||||
domains(:shop).update!(registrant: @contact.becomes(Registrant))
|
||||
assert Contact.linked.include?(@contact), 'Contact should be included'
|
||||
end
|
||||
|
||||
def test_linked_scope_returns_contact_that_acts_as_admin_contact
|
||||
domains(:shop).admin_contacts = [@contact]
|
||||
assert Contact.linked.include?(@contact), 'Contact should be included'
|
||||
end
|
||||
|
||||
def test_linked_scope_returns_contact_that_acts_as_tech_contact
|
||||
domains(:shop).tech_contacts = [@contact]
|
||||
assert Contact.linked.include?(@contact), 'Contact should be included'
|
||||
end
|
||||
|
||||
def test_linked_scope_skips_unlinked_contact
|
||||
contact = unlinked_contact
|
||||
assert_not Contact.linked.include?(contact), 'Contact should be excluded'
|
||||
end
|
||||
|
||||
def test_unlinked_scope_returns_unlinked_contact
|
||||
contact = unlinked_contact
|
||||
assert Contact.unlinked.include?(contact), 'Contact should be included'
|
||||
end
|
||||
|
||||
def test_unlinked_scope_skips_contact_that_is_linked_as_registrant
|
||||
contact = unlinked_contact
|
||||
domains(:shop).update_columns(registrant_id: contact.becomes(Registrant))
|
||||
|
||||
assert Contact.unlinked.exclude?(contact), 'Contact should be excluded'
|
||||
end
|
||||
|
||||
def test_unlinked_scope_skips_contact_that_is_linked_as_admin_contact
|
||||
contact = unlinked_contact
|
||||
domains(:shop).admin_contacts = [contact]
|
||||
|
||||
assert Contact.unlinked.exclude?(contact), 'Contact should be excluded'
|
||||
end
|
||||
|
||||
def test_unlinked_scope_skips_contact_that_is_linked_as_tech_contact
|
||||
contact = unlinked_contact
|
||||
domains(:shop).tech_contacts = [contact]
|
||||
|
||||
assert Contact.unlinked.exclude?(contact), 'Contact should be excluded'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def make_contact_free_of_domains_where_it_acts_as_a_registrant(contact)
|
||||
|
@ -142,8 +188,12 @@ class ContactTest < ActiveSupport::TestCase
|
|||
end
|
||||
|
||||
def unlinked_contact
|
||||
Domain.update_all(registrant_id: contacts(:william))
|
||||
other_contact = contacts(:william)
|
||||
assert_not_equal @contact, other_contact
|
||||
Domain.update_all(registrant_id: other_contact)
|
||||
|
||||
DomainContact.delete_all
|
||||
contacts(:john)
|
||||
|
||||
@contact
|
||||
end
|
||||
end
|
13
test/models/inactive_contacts_test.rb
Normal file
13
test/models/inactive_contacts_test.rb
Normal file
|
@ -0,0 +1,13 @@
|
|||
require 'test_helper'
|
||||
|
||||
class InactiveContactsTest < ActiveSupport::TestCase
|
||||
def test_archives_inactive_contacts
|
||||
contact_mock = Minitest::Mock.new
|
||||
contact_mock.expect(:archive, nil)
|
||||
|
||||
inactive_contacts = InactiveContacts.new([contact_mock])
|
||||
inactive_contacts.archive
|
||||
|
||||
assert_mock contact_mock
|
||||
end
|
||||
end
|
105
test/models/version/domain_version_test.rb
Normal file
105
test/models/version/domain_version_test.rb
Normal file
|
@ -0,0 +1,105 @@
|
|||
require 'test_helper'
|
||||
|
||||
class DomainVersionTest < ActiveSupport::TestCase
|
||||
setup do
|
||||
@domain_version = log_domains(:one)
|
||||
@contact = contacts(:john)
|
||||
end
|
||||
|
||||
def test_was_contact_linked_returns_true_when_contact_was_used_as_registrant
|
||||
@domain_version.update!(children: { admin_contacts: [],
|
||||
tech_contacts: [],
|
||||
registrant: [@contact.id] })
|
||||
|
||||
assert DomainVersion.was_contact_linked?(@contact)
|
||||
end
|
||||
|
||||
def test_was_contact_linked_returns_true_when_contact_was_used_as_admin_contact
|
||||
@domain_version.update!(children: { admin_contacts: [@contact.id],
|
||||
tech_contacts: [],
|
||||
registrant: [] })
|
||||
|
||||
assert DomainVersion.was_contact_linked?(@contact)
|
||||
end
|
||||
|
||||
def test_was_contact_linked_returns_true_when_contact_was_used_as_tech_contact
|
||||
@domain_version.update!(children: { admin_contacts: [],
|
||||
tech_contacts: [@contact.id],
|
||||
registrant: [] })
|
||||
|
||||
assert DomainVersion.was_contact_linked?(@contact)
|
||||
end
|
||||
|
||||
def test_was_contact_linked_returns_false_when_contact_was_not_used
|
||||
@domain_version.update!(children: { admin_contacts: [],
|
||||
tech_contacts: [],
|
||||
registrant: [] })
|
||||
|
||||
assert_not DomainVersion.was_contact_linked?(@contact)
|
||||
end
|
||||
|
||||
def test_contact_unlinked_more_than_returns_true_when_contact_was_linked_as_registrant_more_than_given_period
|
||||
@domain_version.update!(created_at: Time.zone.parse('2010-07-04 00:00:00'),
|
||||
children: { admin_contacts: [],
|
||||
tech_contacts: [],
|
||||
registrant: [@contact.id] })
|
||||
travel_to Time.zone.parse('2010-07-05 00:00:01')
|
||||
|
||||
assert DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
|
||||
def test_contact_unlinked_more_than_given_period_as_admin_contact
|
||||
@domain_version.update!(created_at: Time.zone.parse('2010-07-04 00:00:00'),
|
||||
children: { admin_contacts: [1, @contact.id],
|
||||
tech_contacts: [],
|
||||
registrant: [] })
|
||||
travel_to Time.zone.parse('2010-07-05 00:00:01')
|
||||
|
||||
assert DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
|
||||
def test_contact_unlinked_more_than_given_period_as_tech_contact
|
||||
@domain_version.update!(created_at: Time.zone.parse('2010-07-04 00:00:00'),
|
||||
children: { admin_contacts: [],
|
||||
tech_contacts: [1, @contact.id],
|
||||
registrant: [] })
|
||||
travel_to Time.zone.parse('2010-07-05 00:00:01')
|
||||
|
||||
assert DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
|
||||
def test_contact_linked_within_given_period_as_registrant
|
||||
@domain_version.update!(created_at: Time.zone.parse('2010-07-05'),
|
||||
children: { admin_contacts: [],
|
||||
tech_contacts: [],
|
||||
registrant: [@contact.id] })
|
||||
travel_to Time.zone.parse('2010-07-05')
|
||||
|
||||
assert_not DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
|
||||
def test_contact_linked_within_given_period_as_admin_contact
|
||||
@domain_version.update!(created_at: Time.zone.parse('2010-07-05'),
|
||||
children: { admin_contacts: [1, @contact.id],
|
||||
tech_contacts: [],
|
||||
registrant: [] })
|
||||
travel_to Time.zone.parse('2010-07-05')
|
||||
|
||||
assert_not DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
|
||||
def test_contact_linked_within_given_period_as_tech_contact
|
||||
@domain_version.update!(created_at: Time.zone.parse('2010-07-05'),
|
||||
children: { admin_contacts: [],
|
||||
tech_contacts: [1, @contact.id],
|
||||
registrant: [] })
|
||||
travel_to Time.zone.parse('2010-07-05')
|
||||
|
||||
assert_not DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
|
||||
def test_contact_was_never_linked
|
||||
DomainVersion.delete_all
|
||||
assert_not DomainVersion.contact_unlinked_more_than?(contact: @contact, period: 1.day)
|
||||
end
|
||||
end
|
46
test/tasks/contacts/archive_test.rb
Normal file
46
test/tasks/contacts/archive_test.rb
Normal file
|
@ -0,0 +1,46 @@
|
|||
require 'test_helper'
|
||||
|
||||
class ArchiveContactsTaskTest < ActiveSupport::TestCase
|
||||
def test_archives_inactive_contacts
|
||||
eliminate_effect_of_all_contacts_except(archivable_contact)
|
||||
|
||||
assert_difference 'Contact.count', -1 do
|
||||
capture_io { run_task }
|
||||
end
|
||||
end
|
||||
|
||||
def test_output
|
||||
contact = archivable_contact
|
||||
eliminate_effect_of_all_contacts_except(contact)
|
||||
|
||||
expected_output = "Contact ##{contact.id} (code: #{contact.code}) is archived\n" \
|
||||
"Archived total: 1\n"
|
||||
assert_output(expected_output) { run_task }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def archivable_contact
|
||||
contact = contacts(:john)
|
||||
Contact.inactivity_period = 0.seconds
|
||||
DomainVersion.delete_all
|
||||
|
||||
other_contact = contacts(:william)
|
||||
assert_not_equal other_contact, contact
|
||||
Domain.update_all(registrant_id: other_contact)
|
||||
|
||||
DomainContact.delete_all
|
||||
|
||||
contact
|
||||
end
|
||||
|
||||
def eliminate_effect_of_all_contacts_except(contact)
|
||||
Contact.connection.disable_referential_integrity do
|
||||
Contact.delete_all("id != #{contact.id}")
|
||||
end
|
||||
end
|
||||
|
||||
def run_task
|
||||
Rake::Task['contacts:archive'].execute
|
||||
end
|
||||
end
|
|
@ -33,6 +33,7 @@ class ActiveSupport::TestCase
|
|||
|
||||
ActiveRecord::Migration.check_pending!
|
||||
fixtures :all
|
||||
set_fixture_class log_domains: DomainVersion
|
||||
|
||||
teardown do
|
||||
travel_back
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue