foreman_expire_hosts 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +28 -2
  3. data/.rubocop_todo.yml +10 -47
  4. data/README.md +1 -0
  5. data/app/controllers/concerns/foreman_expire_hosts/host_controller_extensions.rb +11 -13
  6. data/app/helpers/concerns/foreman_expire_hosts/audits_helper_extensions.rb +2 -2
  7. data/app/helpers/concerns/foreman_expire_hosts/hosts_helper_extensions.rb +8 -11
  8. data/app/mailers/expire_hosts_mailer.rb +72 -20
  9. data/app/models/concerns/foreman_expire_hosts/host_ext.rb +3 -3
  10. data/app/models/host_status/expiration_status.rb +1 -1
  11. data/app/models/setting/expire_hosts.rb +2 -2
  12. data/app/services/foreman_expire_hosts/action/base.rb +57 -0
  13. data/app/services/foreman_expire_hosts/action/delete_expired_hosts.rb +23 -0
  14. data/app/services/foreman_expire_hosts/action/stop_expired_hosts.rb +37 -0
  15. data/app/services/foreman_expire_hosts/expiry_edit_authorizer.rb +21 -0
  16. data/app/services/foreman_expire_hosts/notification/base.rb +71 -0
  17. data/app/services/foreman_expire_hosts/notification/deleted_hosts.rb +15 -0
  18. data/app/services/foreman_expire_hosts/notification/expiry_warning.rb +26 -0
  19. data/app/services/foreman_expire_hosts/notification/failed_deleted_hosts.rb +15 -0
  20. data/app/services/foreman_expire_hosts/notification/failed_stopped_hosts.rb +15 -0
  21. data/app/services/foreman_expire_hosts/notification/stopped_hosts.rb +26 -0
  22. data/app/services/foreman_expire_hosts/safe_destroy.rb +23 -0
  23. data/app/services/foreman_expire_hosts/ui_notifications/hosts/base.rb +68 -0
  24. data/app/services/foreman_expire_hosts/ui_notifications/hosts/expiry_warning.rb +28 -0
  25. data/app/services/foreman_expire_hosts/ui_notifications/hosts/stopped_host.rb +11 -0
  26. data/app/views/expire_hosts_mailer/expiry_warning_notification.html.erb +4 -1
  27. data/app/views/expire_hosts_mailer/stopped_hosts_notification.html.erb +4 -1
  28. data/db/seeds.d/80_expire_hosts_ui_notification.rb +30 -0
  29. data/foreman_expire_hosts.gemspec +2 -2
  30. data/lib/expire_hosts_notifications.rb +7 -104
  31. data/lib/foreman_expire_hosts/engine.rb +14 -8
  32. data/lib/foreman_expire_hosts/version.rb +1 -1
  33. data/lib/tasks/expired_hosts.rake +7 -5
  34. data/test/factories/foreman_expire_hosts_factories.rb +1 -1
  35. data/test/functional/concerns/hosts_controller_extensions_test.rb +8 -6
  36. data/test/lib/expire_hosts_notifications_test.rb +128 -32
  37. data/test/test_plugin_helper.rb +8 -3
  38. data/test/unit/concerns/host_extensions_test.rb +17 -17
  39. data/test/unit/expire_hosts_mailer_test.rb +47 -27
  40. data/test/unit/expiry_edit_authorizer_test.rb +55 -0
  41. data/test/unit/host_status/expiration_status_test.rb +1 -1
  42. data/test/unit/safe_destroy_test.rb +26 -0
  43. metadata +30 -11
@@ -2,9 +2,14 @@
2
2
  require 'test_helper'
3
3
  require 'database_cleaner'
4
4
 
5
- # Add plugin to FactoryGirl's paths
6
- FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
7
- FactoryGirl.reload
5
+ # Add plugin to FactoryBot's paths
6
+ FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
7
+ FactoryBot.reload
8
+
9
+ # load notification seeds.
10
+ require File.join(
11
+ File.dirname(__FILE__), '..', 'db', 'seeds.d', '80_expire_hosts_ui_notification'
12
+ )
8
13
 
9
14
  # Foreman's setup doesn't handle cleaning up for Minitest::Spec
10
15
  DatabaseCleaner.strategy = :transaction
@@ -4,7 +4,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
4
4
  EXPIRATION_SCOPES = ['expiring', 'expired', 'expiring_today', 'expired_past_grace_period'].freeze
5
5
 
6
6
  setup do
7
- User.current = FactoryGirl.build(:user, :admin)
7
+ User.current = FactoryBot.build(:user, :admin)
8
8
  setup_settings
9
9
  end
10
10
 
@@ -14,7 +14,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
14
14
  end
15
15
 
16
16
  test 'should not require expired on' do
17
- host = FactoryGirl.build(:host)
17
+ host = FactoryBot.build(:host)
18
18
  assert host.valid?, "Should be valid without expiration date: : #{host.errors.messages}"
19
19
  end
20
20
  end
@@ -25,7 +25,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
25
25
  end
26
26
 
27
27
  test 'should require expired on' do
28
- host = FactoryGirl.build(:host)
28
+ host = FactoryBot.build(:host)
29
29
  refute host.valid?, "Can not be valid without expiration date: #{host.errors.messages}"
30
30
  assert_includes host.errors.messages.keys, :expired_on
31
31
  end
@@ -33,8 +33,8 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
33
33
 
34
34
  context 'changing expiration date for user owned host' do
35
35
  setup do
36
- @user = FactoryGirl.create(:user)
37
- @host = FactoryGirl.create(:host, :expired, :owner => @user)
36
+ @user = FactoryBot.create(:user)
37
+ @host = FactoryBot.create(:host, :expired, :owner => @user)
38
38
  end
39
39
 
40
40
  test 'admin should be able to change expiration date' do
@@ -43,7 +43,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
43
43
  end
44
44
 
45
45
  test 'user should not be able to change expiration date' do
46
- as_user FactoryGirl.build(:user) do
46
+ as_user FactoryBot.build(:user) do
47
47
  @host.expired_on = Date.today + 5
48
48
  refute_valid @host
49
49
  end
@@ -67,13 +67,13 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
67
67
  end
68
68
 
69
69
  context 'changing expiration date for user' do
70
- let(:host) { FactoryGirl.create(:host, :managed) }
70
+ let(:host) { FactoryBot.create(:host, :managed) }
71
71
 
72
72
  context 'with edit_host_expiry permission' do
73
- let(:permission) { Permission.find_by_name('edit_host_expiry') }
74
- let(:filter) { FactoryGirl.create(:filter, :permissions => [permission]) }
75
- let(:role) { FactoryGirl.create(:role, :filters => [filter]) }
76
- let(:user) { FactoryGirl.create(:user, :organizations => [host.organization], :locations => [host.location], :roles => [role]) }
73
+ let(:permission) { Permission.find_by(name: 'edit_host_expiry') }
74
+ let(:filter) { FactoryBot.create(:filter, :permissions => [permission]) }
75
+ let(:role) { FactoryBot.create(:role, :filters => [filter]) }
76
+ let(:user) { FactoryBot.create(:user, :organizations => [host.organization], :locations => [host.location], :roles => [role]) }
77
77
 
78
78
  test 'user can change expiry date' do
79
79
  as_user user do
@@ -83,7 +83,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
83
83
  end
84
84
 
85
85
  context 'without edit_host_expiry permission' do
86
- let(:user) { FactoryGirl.build(:user, :organizations => [host.organization], :locations => [host.location]) }
86
+ let(:user) { FactoryBot.build(:user, :organizations => [host.organization], :locations => [host.location]) }
87
87
 
88
88
  test 'user can not change expiry date' do
89
89
  as_user user do
@@ -95,7 +95,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
95
95
 
96
96
  context 'a host without expiration' do
97
97
  setup do
98
- @host = FactoryGirl.build(:host)
98
+ @host = FactoryBot.build(:host)
99
99
  end
100
100
 
101
101
  test 'should not expire' do
@@ -125,7 +125,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
125
125
 
126
126
  context 'a expired host' do
127
127
  setup do
128
- @host = FactoryGirl.build(:host, :expired)
128
+ @host = FactoryBot.build(:host, :expired)
129
129
  end
130
130
 
131
131
  test 'should expire' do
@@ -155,7 +155,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
155
155
 
156
156
  context 'a host expiring today' do
157
157
  setup do
158
- @host = FactoryGirl.build(:host, :expires_today)
158
+ @host = FactoryBot.build(:host, :expires_today)
159
159
  end
160
160
 
161
161
  test 'should expire' do
@@ -186,7 +186,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
186
186
 
187
187
  context 'a host expiring in a year' do
188
188
  setup do
189
- @host = FactoryGirl.build(:host, :expires_in_a_year)
189
+ @host = FactoryBot.build(:host, :expires_in_a_year)
190
190
  end
191
191
 
192
192
  test 'should expire' do
@@ -217,7 +217,7 @@ class ForemanExpireHostsHostExtTest < ActiveSupport::TestCase
217
217
 
218
218
  context 'a host in grace period' do
219
219
  setup do
220
- @host = FactoryGirl.build(:host, :expired_grace)
220
+ @host = FactoryBot.build(:host, :expired_grace)
221
221
  end
222
222
 
223
223
  test 'should expire' do
@@ -3,62 +3,82 @@ require 'test_plugin_helper'
3
3
  class ExpireHostMailerTest < ActionMailer::TestCase
4
4
  setup do
5
5
  setup_settings
6
- @emails = ['test@example.com']
7
- @hosts = FactoryGirl.create_list(:host, 2, :managed)
8
6
  end
9
7
 
8
+ let(:recipient) { FactoryBot.create(:user, :with_mail) }
9
+ let(:hosts) { FactoryBot.create_list(:host, 2, :managed) }
10
+
10
11
  context 'deleted hosts notification' do
11
- setup do
12
- @mail = ExpireHostsMailer.deleted_hosts_notification(@emails, @hosts).deliver_now
13
- end
12
+ let(:mail) { ExpireHostsMailer.deleted_hosts_notification(recipient, hosts).deliver_now }
14
13
 
15
14
  test 'subject should be set' do
16
- refute_nil @mail.subject
17
- assert_includes @mail.subject, 'Deleted expired hosts in Foreman'
15
+ assert_includes mail.subject, 'Deleted expired hosts in Foreman'
16
+ end
17
+
18
+ test 'recipient should be user mail address' do
19
+ assert_equal [recipient.mail], mail.to
18
20
  end
19
21
  end
20
22
 
21
23
  context 'failed to delete hosts notification' do
22
- setup do
23
- @mail = ExpireHostsMailer.failed_to_delete_hosts_notification(@emails, @hosts).deliver_now
24
- end
24
+ let(:mail) { ExpireHostsMailer.failed_to_delete_hosts_notification(recipient, hosts).deliver_now }
25
25
 
26
26
  test 'subject should be set' do
27
- refute_nil @mail.subject
28
- assert_includes @mail.subject, 'Failed to delete expired hosts in Foreman'
27
+ assert_includes mail.subject, 'Failed to delete expired hosts in Foreman'
29
28
  end
30
29
  end
31
30
 
32
31
  context 'stopped hosts notification' do
33
- setup do
34
- @mail = ExpireHostsMailer.stopped_hosts_notification(@emails, Date.today, @hosts).deliver_now
35
- end
32
+ let(:mail) { ExpireHostsMailer.stopped_hosts_notification(recipient, Date.today, hosts).deliver_now }
36
33
 
37
34
  test 'subject should be set' do
38
- refute_nil @mail.subject
39
- assert_includes @mail.subject, 'Stopped expired hosts in Foreman'
35
+ assert_includes mail.subject, 'Stopped expired hosts in Foreman'
36
+ end
37
+
38
+ test 'should show mitigation text if authorized' do
39
+ ForemanExpireHosts::ExpiryEditAuthorizer.any_instance.stubs(:authorized?).returns(true)
40
+ assert_includes mail.body.to_s, 'Please change their expiry date'
41
+ end
42
+
43
+ test 'should not show mitigation text if not authorized' do
44
+ ForemanExpireHosts::ExpiryEditAuthorizer.any_instance.stubs(:authorized?).returns(false)
45
+ assert_not_includes mail.body.to_s, 'Please change their expiry date'
40
46
  end
41
47
  end
42
48
 
43
49
  context 'failed to stop hosts notification' do
44
- setup do
45
- @mail = ExpireHostsMailer.failed_to_stop_hosts_notification(@emails, @hosts).deliver_now
46
- end
50
+ let(:mail) { ExpireHostsMailer.failed_to_stop_hosts_notification(recipient, hosts).deliver_now }
47
51
 
48
52
  test 'subject should be set' do
49
- refute_nil @mail.subject
50
- assert_includes @mail.subject, 'Failed to stop expired hosts in Foreman'
53
+ assert_includes mail.subject, 'Failed to stop expired hosts in Foreman'
51
54
  end
52
55
  end
53
56
 
54
57
  context 'expiry warning notification' do
55
- setup do
56
- @mail = ExpireHostsMailer.expiry_warning_notification(@emails, Date.today, @hosts).deliver_now
57
- end
58
+ let(:mail) { ExpireHostsMailer.expiry_warning_notification(recipient, Date.today, hosts).deliver_now }
58
59
 
59
60
  test 'subject should be set' do
60
- refute_nil @mail.subject
61
- assert_includes @mail.subject, 'Expiring hosts in foreman'
61
+ assert_includes mail.subject, 'Expiring hosts in foreman'
62
+ end
63
+
64
+ test 'should show mitigation text if authorized' do
65
+ ForemanExpireHosts::ExpiryEditAuthorizer.any_instance.stubs(:authorized?).returns(true)
66
+ assert_includes mail.body.to_s, 'Please change their expiry date'
67
+ end
68
+
69
+ test 'should not show mitigation text if not authorized' do
70
+ ForemanExpireHosts::ExpiryEditAuthorizer.any_instance.stubs(:authorized?).returns(false)
71
+ assert_not_includes mail.body.to_s, 'Please change their expiry date'
72
+ end
73
+ end
74
+
75
+ context 'user without mail address' do
76
+ let(:recipient) { FactoryBot.create(:user) }
77
+ let(:mail) { ExpireHostsMailer.expiry_warning_notification(recipient, Date.today, hosts).deliver_now }
78
+
79
+ test 'mail is delivered to admin address' do
80
+ assert_nil recipient.mail
81
+ assert_equal ['root@some.host.fqdn'], mail.to
62
82
  end
63
83
  end
64
84
  end
@@ -0,0 +1,55 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanExpireHosts
4
+ class ExpiryEditAuthorizerTest < ActiveSupport::TestCase
5
+ let(:hosts) { FactoryBot.create_list(:host, 2) }
6
+ let(:authorizer) { ExpiryEditAuthorizer.new(hosts: hosts, user: user) }
7
+
8
+ context 'with admin user' do
9
+ let(:user) { FactoryBot.create(:user, :admin) }
10
+ test 'should be authorized' do
11
+ assert_equal true, authorizer.authorized?
12
+ end
13
+ end
14
+
15
+ context 'with limited permissions' do
16
+ let(:user_role) { FactoryBot.create(:user_user_role) }
17
+ let(:user) { user_role.owner }
18
+ let(:role) { user_role.role }
19
+ let(:edit_expiry_permission) { Permission.find_by(name: 'edit_host_expiry') }
20
+ let(:edit_permission) { Permission.find_by(name: 'edit_hosts') }
21
+
22
+ context 'with edit_hosts and edit_host_expiry permission' do
23
+ test 'should be authorized' do
24
+ FactoryBot.create(:filter, :role => role, :permissions => [edit_permission, edit_expiry_permission])
25
+ assert_equal true, authorizer.authorized?
26
+ end
27
+ end
28
+
29
+ context 'with edit_hosts and owner permission' do
30
+ setup do
31
+ setup_settings
32
+ FactoryBot.create(:filter, :role => role, :permissions => [edit_permission])
33
+ end
34
+ let(:hosts) { FactoryBot.create_list(:host, 2, :owner => user) }
35
+
36
+ test 'should be authorized if setting allows owner' do
37
+ Setting[:can_owner_modify_host_expiry_date] = true
38
+ assert_equal true, authorizer.authorized?
39
+ end
40
+
41
+ test 'should not be authorized if setting does not allow owner' do
42
+ Setting[:can_owner_modify_host_expiry_date] = false
43
+ assert_equal false, authorizer.authorized?
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'with unauthorized user' do
49
+ let(:user) { FactoryBot.create(:user) }
50
+ test 'should not be authorized' do
51
+ assert_equal false, authorizer.authorized?
52
+ end
53
+ end
54
+ end
55
+ end
@@ -2,7 +2,7 @@ require 'test_plugin_helper'
2
2
 
3
3
  class ExpirationStatusTest < ActiveSupport::TestCase
4
4
  def setup
5
- @host = FactoryGirl.build(:host)
5
+ @host = FactoryBot.build(:host)
6
6
  @status = HostStatus::ExpirationStatus.new(:host => @host)
7
7
  end
8
8
 
@@ -0,0 +1,26 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanExpireHosts
4
+ class SafeDestroyTest < ActiveSupport::TestCase
5
+ class HostWithFailingCallbacks < ActiveRecord::Base
6
+ self.table_name = 'hosts'
7
+ self.inheritance_column = nil
8
+
9
+ before_destroy :cancel
10
+
11
+ private
12
+
13
+ def cancel
14
+ false
15
+ end
16
+ end
17
+
18
+ describe 'model with failing callbacks' do
19
+ test 'return false on record delete' do
20
+ h = HostWithFailingCallbacks.create!(:name => 'test')
21
+ assert_equal false, SafeDestroy.new(h).destroy!
22
+ assert_equal 1, HostWithFailingCallbacks.all.count
23
+ end
24
+ end
25
+ end
26
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_expire_hosts
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nagarjuna Rachaneni
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-24 00:00:00.000000000 Z
12
+ date: 2017-12-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: deface
15
+ name: bootstrap-datepicker-rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - ">="
@@ -26,7 +26,7 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: bootstrap-datepicker-rails
29
+ name: deface
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
@@ -40,7 +40,7 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: rubocop
43
+ name: rdoc
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ">="
@@ -54,19 +54,19 @@ dependencies:
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
- name: rdoc
57
+ name: rubocop
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - '='
61
61
  - !ruby/object:Gem::Version
62
- version: '0'
62
+ version: 0.51.0
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ">="
67
+ - - '='
68
68
  - !ruby/object:Gem::Version
69
- version: '0'
69
+ version: 0.51.0
70
70
  description: This Plugin will add new column expired_on to hosts to limit the lifetime
71
71
  of a host.
72
72
  email:
@@ -99,6 +99,20 @@ files:
99
99
  - app/overrides/add_expired_on_field_to_host_show.rb
100
100
  - app/overrides/add_js_to_host_index.rb
101
101
  - app/overrides/deleted_expired_host_comment_in_audits.rb
102
+ - app/services/foreman_expire_hosts/action/base.rb
103
+ - app/services/foreman_expire_hosts/action/delete_expired_hosts.rb
104
+ - app/services/foreman_expire_hosts/action/stop_expired_hosts.rb
105
+ - app/services/foreman_expire_hosts/expiry_edit_authorizer.rb
106
+ - app/services/foreman_expire_hosts/notification/base.rb
107
+ - app/services/foreman_expire_hosts/notification/deleted_hosts.rb
108
+ - app/services/foreman_expire_hosts/notification/expiry_warning.rb
109
+ - app/services/foreman_expire_hosts/notification/failed_deleted_hosts.rb
110
+ - app/services/foreman_expire_hosts/notification/failed_stopped_hosts.rb
111
+ - app/services/foreman_expire_hosts/notification/stopped_hosts.rb
112
+ - app/services/foreman_expire_hosts/safe_destroy.rb
113
+ - app/services/foreman_expire_hosts/ui_notifications/hosts/base.rb
114
+ - app/services/foreman_expire_hosts/ui_notifications/hosts/expiry_warning.rb
115
+ - app/services/foreman_expire_hosts/ui_notifications/hosts/stopped_host.rb
102
116
  - app/views/expire_hosts_mailer/_hosts_table.html.erb
103
117
  - app/views/expire_hosts_mailer/deleted_hosts_notification.html.erb
104
118
  - app/views/expire_hosts_mailer/expiry_warning_notification.html.erb
@@ -110,6 +124,7 @@ files:
110
124
  - app/views/hosts/select_multiple_expiration.html.erb
111
125
  - config/routes.rb
112
126
  - db/migrate/20150427101516_add_expiry_on_to_hosts.rb
127
+ - db/seeds.d/80_expire_hosts_ui_notification.rb
113
128
  - foreman_expire_hosts.gemspec
114
129
  - lib/expire_hosts_notifications.rb
115
130
  - lib/foreman_expire_hosts.rb
@@ -122,7 +137,9 @@ files:
122
137
  - test/test_plugin_helper.rb
123
138
  - test/unit/concerns/host_extensions_test.rb
124
139
  - test/unit/expire_hosts_mailer_test.rb
140
+ - test/unit/expiry_edit_authorizer_test.rb
125
141
  - test/unit/host_status/expiration_status_test.rb
142
+ - test/unit/safe_destroy_test.rb
126
143
  homepage: https://github.com/theforeman/foreman_expire_hosts
127
144
  licenses:
128
145
  - GPL-3.0
@@ -143,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
160
  version: '0'
144
161
  requirements: []
145
162
  rubyforge_project:
146
- rubygems_version: 2.6.11
163
+ rubygems_version: 2.6.12
147
164
  signing_key:
148
165
  specification_version: 4
149
166
  summary: Foreman plugin for limiting host lifetime
@@ -154,4 +171,6 @@ test_files:
154
171
  - test/test_plugin_helper.rb
155
172
  - test/unit/concerns/host_extensions_test.rb
156
173
  - test/unit/expire_hosts_mailer_test.rb
174
+ - test/unit/expiry_edit_authorizer_test.rb
157
175
  - test/unit/host_status/expiration_status_test.rb
176
+ - test/unit/safe_destroy_test.rb