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
@@ -18,9 +18,9 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.require_paths = ['lib']
20
20
 
21
- s.add_dependency 'deface'
22
21
  s.add_dependency 'bootstrap-datepicker-rails'
22
+ s.add_dependency 'deface'
23
23
 
24
- s.add_development_dependency 'rubocop'
25
24
  s.add_development_dependency 'rdoc'
25
+ s.add_development_dependency 'rubocop', '0.51.0'
26
26
  end
@@ -1,120 +1,23 @@
1
1
  module ExpireHostsNotifications
2
2
  class << self
3
-
4
- def admin_email
5
- [(Setting[:host_expiry_email_recipients] || Setting[:administrator])]
6
- end
7
-
8
- def days_to_delete_after_expired
9
- Setting[:days_to_delete_after_host_expiration].to_i
10
- end
11
-
12
- def catch_delivery_errors(message, hosts = [])
13
- yield
14
- rescue => error
15
- message = _('%{message} for Hosts %{hosts}') % {:message => message, :hosts => hosts.map(&:name).to_sentence}
16
- Foreman::Logging.exception(message, error)
17
- end
18
-
19
- # This method to deliver deleted host details to its owner
20
3
  def delete_expired_hosts
21
- deletable_hosts = Host.expired_past_grace_period
22
- failed_delete_hosts = []
23
- deleted_hosts = []
24
- deletable_hosts.each do |deletable_host|
25
- Rails.logger.info "Deleting expired host #{deletable_host}"
26
- deletable_host.audit_comment = _('Destroyed since it got expired on %s') % deletable_host.expired_on
27
- if deletable_host.destroy
28
- deleted_hosts << deletable_host
29
- else
30
- failed_delete_hosts << deletable_host
31
- end
32
- end
33
- unless deleted_hosts.empty?
34
- ExpireHostsNotifications.hosts_by_user(deleted_hosts).each do |user_id, hosts_hash|
35
- catch_delivery_errors(_('Failed to deliver deleted hosts notification'), deleted_hosts) do
36
- ExpireHostsMailer.deleted_hosts_notification(hosts_hash['email'], hosts_hash['hosts']).deliver_now
37
- end
38
- end
39
- end
40
- return if failed_delete_hosts.empty?
41
- catch_delivery_errors(_('Failed to deliver deleted hosts notification failed status'), failed_delete_hosts) do
42
- ExpireHostsMailer.failed_to_delete_hosts_notification(self.admin_email, failed_delete_hosts).deliver_now
43
- end
4
+ ForemanExpireHosts::Action::DeleteExpiredHosts.new.engage
44
5
  end
45
6
 
46
7
  def stop_expired_hosts
47
- stoppable_hosts = Host.expired
48
- failed_stop_hosts = []
49
- stopped_hosts = []
50
- stoppable_hosts.each do |stoppable_host|
51
- next unless stoppable_host.supports_power_and_running?
52
- Rails.logger.info "Powering down expired host in grace period #{stoppable_host}"
53
- host_status = begin
54
- stoppable_host.power.stop
55
- rescue
56
- false
57
- end
58
- if host_status
59
- stopped_hosts << stoppable_host
60
- else
61
- failed_stop_hosts << stoppable_host
62
- end
63
- end
64
- unless stopped_hosts.empty?
65
- delete_date = (Date.today + self.days_to_delete_after_expired.to_i)
66
- hosts_by_user(stopped_hosts).each do |user_id, hosts_hash|
67
- catch_delivery_errors(_('Failed to deliver stopped hosts notification'), stopped_hosts) do
68
- ExpireHostsMailer.stopped_hosts_notification(hosts_hash['email'], delete_date, hosts_hash['hosts']).deliver_now
69
- end
70
- end
71
- end
72
- return if failed_stop_hosts.empty?
73
- catch_delivery_errors(_('Failed to deliver stopped hosts notification failed status'), failed_stop_hosts) do
74
- ExpireHostsMailer.failed_to_stop_hosts_notification(self.admin_email, failed_stop_hosts).deliver_now
75
- end
8
+ ForemanExpireHosts::Action::StopExpiredHosts.new.engage
76
9
  end
77
10
 
78
11
  def deliver_expiry_warning_notification(num = 1) # notify1_days_before_expiry
79
12
  return unless [1, 2].include?(num)
80
13
  days_before_expiry = Setting["notify#{num}_days_before_host_expiry"].to_i
81
14
  expiry_date = (Date.today + days_before_expiry)
82
- notifiable_hosts = Host.with_expire_date(expiry_date)
83
- return if notifiable_hosts.empty?
84
- hosts_by_user(notifiable_hosts).each do |user_id, hosts_hash|
85
- catch_delivery_errors(_('Failed to deliver expiring hosts notification'), notifiable_hosts) do
86
- ExpireHostsMailer.expiry_warning_notification(hosts_hash['email'], expiry_date, hosts_hash['hosts']).deliver_now
87
- end
88
- end
89
- end
15
+ notifiable_hosts = Host.with_expire_date(expiry_date).preload(:owner)
90
16
 
91
- def hosts_by_user(hosts)
92
- emails = self.admin_email
93
- hosts_hash = {}
94
- hosts.each do |host|
95
- if host.owner_type == 'User'
96
- unless hosts_hash.key?(host.owner_id.to_s)
97
- email_recipients = emails + [host.owner.mail]
98
- hosts_hash[host.owner_id.to_s] = { 'id' => host.owner_id, 'name' => host.owner.name, 'email' => email_recipients, 'hosts' => [] }
99
- end
100
- hosts_hash[host.owner_id.to_s]['hosts'] << host
101
- elsif host.owner_type == 'Usergroup'
102
- host.owner.users.each do |owner|
103
- unless hosts_hash.key?(owner.id.to_s)
104
- email_recipients = emails + [owner.mail]
105
- hosts_hash[owner.id.to_s] = { 'id' => owner.id, 'name' => owner.name, 'email' => email_recipients, 'hosts' => [] }
106
- end
107
- hosts_hash[owner.id.to_s]['hosts'] << host
108
- end
109
- else
110
- email = (!emails.empty? ? emails : [Setting[:administrator]])
111
- unless hosts_hash.key?(owner.id.to_s)
112
- hosts_hash['admin'] = { 'id' => nil, 'name' => 'Admin', 'email' => email, 'hosts' => [] }
113
- end
114
- hosts_hash['admin']['hosts'] << host
115
- end
116
- end
117
- hosts_hash
17
+ ForemanExpireHosts::Notification::ExpiryWarning.new(
18
+ :hosts => notifiable_hosts,
19
+ :expiry_date => expiry_date
20
+ ).deliver
118
21
  end
119
22
  end
120
23
  end
@@ -9,6 +9,7 @@ module ForemanExpireHosts
9
9
  config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
10
10
  config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
11
11
  config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
12
+ config.autoload_paths += Dir["#{config.root}/app/services"]
12
13
 
13
14
  # Add any db migrations
14
15
  initializer 'foreman_plugin_template.load_app_instance_data' do |app|
@@ -21,22 +22,21 @@ module ForemanExpireHosts
21
22
  require_dependency File.expand_path('../../../app/models/setting/expire_hosts.rb', __FILE__) if (Setting.table_exists? rescue(false))
22
23
  end
23
24
 
24
- initializer 'foreman_expire_hosts.register_plugin', :before => :finisher_hook do |app|
25
+ initializer 'foreman_expire_hosts.register_plugin', :before => :finisher_hook do |_app|
25
26
  Foreman::Plugin.register :foreman_expire_hosts do
26
- requires_foreman '>= 1.15'
27
+ requires_foreman '>= 1.16'
27
28
  register_custom_status HostStatus::ExpirationStatus
28
29
 
29
30
  # strong parameters
30
31
  parameter_filter Host::Managed, :expired_on
31
32
 
32
- security_block :hosts do
33
- permission :edit_hosts, {:hosts => [:select_multiple_expiration, :update_multiple_expiration]}
34
- end
35
-
36
33
  security_block :foreman_expire_hosts do
37
34
  permission :edit_host_expiry,
38
35
  {},
39
36
  :resource_type => 'Host'
37
+ permission :edit_hosts,
38
+ { :hosts => [:select_multiple_expiration, :update_multiple_expiration] },
39
+ :resource_type => 'Host'
40
40
  end
41
41
  end
42
42
  end
@@ -45,13 +45,19 @@ module ForemanExpireHosts
45
45
  begin
46
46
  Host::Managed.send :include, ForemanExpireHosts::HostExt
47
47
  HostsHelper.send :include, ForemanExpireHosts::HostsHelperExtensions
48
- HostsController.send :include, ForemanExpireHosts::HostControllerExtensions
48
+ HostsController.send :prepend, ForemanExpireHosts::HostControllerExtensions
49
49
  AuditsHelper.send :include, ForemanExpireHosts::AuditsHelperExtensions
50
- rescue => e
50
+ rescue StandardError => e
51
51
  Rails.logger.warn "ForemanExpireHosts: skipping engine hook (#{e})"
52
52
  end
53
53
  end
54
54
 
55
+ rake_tasks do
56
+ Rake::Task['db:seed'].enhance do
57
+ ForemanExpireHosts::Engine.load_seed
58
+ end
59
+ end
60
+
55
61
  # Precompile any JS or CSS files under app/assets/
56
62
  # If requiring files from each other, list them explicitly here to avoid precompiling the same
57
63
  # content twice.
@@ -1,3 +1,3 @@
1
1
  module ForemanExpireHosts
2
- VERSION = '3.0.0'.freeze
2
+ VERSION = '4.0.0'.freeze
3
3
  end
@@ -2,10 +2,12 @@
2
2
  namespace :expired_hosts do
3
3
  desc 'Delete all expired hosts, send notification email about expiring hosts'
4
4
  task :deliver_notifications => :environment do
5
- ExpireHostsNotifications.delete_expired_hosts
6
- ExpireHostsNotifications.stop_expired_hosts
7
- ExpireHostsNotifications.deliver_expiry_warning_notification(1)
8
- ExpireHostsNotifications.deliver_expiry_warning_notification(2)
5
+ User.as_anonymous_admin do
6
+ ExpireHostsNotifications.delete_expired_hosts
7
+ ExpireHostsNotifications.stop_expired_hosts
8
+ ExpireHostsNotifications.deliver_expiry_warning_notification(1)
9
+ ExpireHostsNotifications.deliver_expiry_warning_notification(2)
10
+ end
9
11
  end
10
12
  end
11
13
 
@@ -30,7 +32,7 @@ namespace :foreman_expire_hosts do
30
32
  "#{ForemanExpireHosts::Engine.root}/lib/**/*.rb",
31
33
  "#{ForemanExpireHosts::Engine.root}/test/**/*.rb"]
32
34
  end
33
- rescue
35
+ rescue StandardError
34
36
  puts 'Rubocop not loaded.'
35
37
  end
36
38
 
@@ -1,4 +1,4 @@
1
- FactoryGirl.modify do
1
+ FactoryBot.modify do
2
2
  factory :host do
3
3
  trait :without_validation do
4
4
  # Turn off validation so we can create a host with an expiry date in the past
@@ -40,11 +40,11 @@ class HostsControllerTest < ActionController::TestCase
40
40
  end
41
41
 
42
42
  describe 'updating a host' do
43
- let(:host) { FactoryGirl.create(:host) }
43
+ let(:host) { FactoryBot.create(:host) }
44
44
 
45
45
  test 'should add expiration date to host' do
46
46
  expiration_date = Date.today + 14
47
- put :update, { :id => host.name, :host => {:expired_on => expiration_date} }, set_session_user
47
+ put :update, { :id => host.name, :host => { :expired_on => expiration_date } }, set_session_user
48
48
  h = Host.find(host.id)
49
49
  assert_equal expiration_date, h.expired_on
50
50
  end
@@ -53,16 +53,18 @@ class HostsControllerTest < ActionController::TestCase
53
53
  describe 'setting expiration date on multiple hosts' do
54
54
  before do
55
55
  as_admin do
56
- @hosts = FactoryGirl.create_list(:host, 2, :with_puppet)
56
+ @hosts = FactoryBot.create_list(:host, 2, :with_puppet)
57
57
  end
58
58
  @request.env['HTTP_REFERER'] = hosts_path
59
59
  end
60
60
 
61
61
  test 'show a host selection' do
62
62
  host_ids = @hosts.map(&:id)
63
- xhr :post, :select_multiple_expiration, {:host_ids => host_ids}, set_session_user
63
+ xhr :post, :select_multiple_expiration, { :host_ids => host_ids }, set_session_user
64
64
  assert_response :success
65
- assert response.body =~ /#{@hosts.first.name}.*#{@hosts.last.name}/m
65
+ @hosts.each do |host|
66
+ assert response.body =~ /#{host.name}/m
67
+ end
66
68
  end
67
69
 
68
70
  test 'should set expiration date' do
@@ -90,7 +92,7 @@ class HostsControllerTest < ActionController::TestCase
90
92
  assert_empty flash[:error]
91
93
 
92
94
  @hosts.each do |host|
93
- assert_equal nil, host.reload.expired_on
95
+ assert_nil host.reload.expired_on
94
96
  end
95
97
  end
96
98
  end
@@ -1,76 +1,172 @@
1
1
  require 'test_plugin_helper'
2
+ require 'notifications_test_helper'
2
3
 
3
4
  class ExpireHostsNotificationsTest < ActiveSupport::TestCase
5
+ include NotificationBlueprintSeeds
6
+
4
7
  setup do
5
8
  setup_settings
6
- @owner = FactoryGirl.create(:user, :with_mail)
9
+ ActionMailer::Base.deliveries.clear
7
10
  end
8
11
 
12
+ let(:user) { FactoryBot.create(:user, :with_usergroup, :with_mail) }
13
+ let(:usergroup) { user.usergroups.first }
14
+
9
15
  context '#delete_expired_hosts' do
10
- setup do
11
- @hosts = FactoryGirl.create_list(:host, 2, :expired, :owner => @owner)
12
- @unaffected_hosts = FactoryGirl.create_list(:host, 2, :owner => @owner)
16
+ context 'with single owner' do
17
+ setup do
18
+ FactoryBot.create_list(:host, 2, :expired, :owner => user)
19
+ FactoryBot.create_list(:host, 2, :owner => user)
20
+ end
21
+
22
+ test 'should delete expired hosts' do
23
+ assert_difference 'Host.count', -2 do
24
+ ExpireHostsNotifications.delete_expired_hosts
25
+ end
26
+ assert_equal 1, ActionMailer::Base.deliveries.count
27
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Deleted expired hosts'
28
+ end
13
29
  end
14
30
 
15
- test 'should delete expired hosts' do
16
- ExpireHostsMailer.expects(:deleted_hosts_notification).once
17
- assert_difference 'Host.count', -2 do
31
+ context 'with usergroup owner' do
32
+ setup do
33
+ FactoryBot.create_list(:host, 2, :expired, :owner => usergroup)
34
+ FactoryBot.create_list(:host, 2, :owner => usergroup)
35
+ end
36
+
37
+ test 'should delete expired hosts' do
38
+ assert_difference 'Host.count', -2 do
39
+ ExpireHostsNotifications.delete_expired_hosts
40
+ end
41
+ assert_equal 1, ActionMailer::Base.deliveries.count
42
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Deleted expired hosts'
43
+ end
44
+ end
45
+
46
+ context 'without owner' do
47
+ setup do
48
+ FactoryBot.create_list(:host, 2, :expired, :without_owner)
49
+ FactoryBot.create_list(:host, 2, :without_owner)
50
+ end
51
+
52
+ test 'should delete expired hosts' do
53
+ assert_difference 'Host.count', -2 do
54
+ ExpireHostsNotifications.delete_expired_hosts
55
+ end
56
+ assert_equal 1, ActionMailer::Base.deliveries.count
57
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Deleted expired hosts'
58
+ end
59
+ end
60
+
61
+ context 'with additional recipients' do
62
+ setup do
63
+ Setting[:host_expiry_email_recipients] = 'test@example.com, test2.example.com'
64
+ FactoryBot.create_list(:host, 2, :expired, :owner => user)
65
+ end
66
+
67
+ test 'should deliver notification to additional recipients' do
18
68
  ExpireHostsNotifications.delete_expired_hosts
69
+ assert_equal 3, ActionMailer::Base.deliveries.count
70
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Deleted expired hosts'
71
+ assert_includes ActionMailer::Base.deliveries.flat_map(&:to), user.mail
72
+ assert_includes ActionMailer::Base.deliveries.flat_map(&:to), 'test@example.com'
73
+ assert_includes ActionMailer::Base.deliveries.flat_map(&:to), 'test2.example.com'
19
74
  end
20
75
  end
21
76
  end
22
77
 
23
78
  context '#stop_expired_hosts' do
79
+ let(:power_mock) { mock('power') }
80
+ let(:host) { FactoryBot.create(:host, :expired, :on_compute_resource, :owner => user) }
81
+ let(:blueprint) { NotificationBlueprint.find_by(name: 'expire_hosts_stopped_host') }
24
82
  setup do
25
- @power_mock = mock('power')
26
- @power_mock.stubs(:ready?).returns(true)
27
- @host = FactoryGirl.create(:host, :expired, :on_compute_resource, :owner => @owner)
28
- @host.unstub(:queue_compute)
29
- Host.any_instance.stubs(:power).returns(@power_mock)
30
- @unaffected_hosts = FactoryGirl.create_list(:host, 2, :owner => @owner)
83
+ power_mock.stubs(:ready?).returns(true)
84
+ host.unstub(:queue_compute)
85
+ Host.any_instance.stubs(:power).returns(power_mock)
86
+ FactoryBot.create_list(:host, 2, :owner => user)
31
87
  end
32
88
 
33
89
  test 'should stop expired hosts' do
34
- @power_mock.expects(:stop).returns(true)
35
- ExpireHostsMailer.expects(:stopped_hosts_notification).once
90
+ power_mock.expects(:stop).returns(true)
36
91
  ExpireHostsNotifications.stop_expired_hosts
92
+ assert_equal 1, ActionMailer::Base.deliveries.count
93
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Stopped expired hosts'
94
+ end
95
+
96
+ test 'should send a ui notification per stopped host' do
97
+ power_mock.expects(:stop).returns(true)
98
+ assert_difference('blueprint.notifications.count', 1) do
99
+ ExpireHostsNotifications.stop_expired_hosts
100
+ end
37
101
  end
38
102
 
39
103
  test 'should send failure message if host cannot be stopped' do
40
- @power_mock.expects(:stop).returns(false)
41
- ExpireHostsMailer.expects(:failed_to_stop_hosts_notification).once
104
+ power_mock.expects(:stop).returns(false)
42
105
  ExpireHostsNotifications.stop_expired_hosts
106
+ assert_equal 1, ActionMailer::Base.deliveries.count
107
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Failed to stop expired hosts'
43
108
  end
44
109
  end
45
110
 
46
111
  context '#deliver_expiry_warning_notification' do
112
+ let(:blueprint) { NotificationBlueprint.find_by(name: 'expire_hosts_expiry_warning') }
113
+ let(:hosts) { FactoryBot.create_list(:host, 2, :expires_in_a_week, :owner => user) }
114
+
47
115
  setup do
48
116
  Setting['notify1_days_before_host_expiry'] = 7
49
- @hosts = FactoryGirl.create_list(:host, 2, :expires_in_a_week, :owner => @owner)
117
+ hosts
118
+ end
119
+
120
+ test 'should send a ui notification per host' do
121
+ assert_difference('blueprint.notifications.count', 2) do
122
+ ExpireHostsNotifications.deliver_expiry_warning_notification
123
+ end
124
+ hosts.each do |host|
125
+ notification = Notification.find_by(
126
+ notification_blueprint_id: blueprint.id,
127
+ subject_id: host.id,
128
+ subject_type: 'Host::Base'
129
+ )
130
+ assert_equal 1, notification.notification_recipients.where(user_id: user.id).count
131
+ end
132
+ end
133
+
134
+ test 'should redisplay read ui notification' do
135
+ ExpireHostsNotifications.deliver_expiry_warning_notification
136
+ notification = Notification.find_by(notification_blueprint_id: blueprint.id, subject_id: hosts.first.id)
137
+ assert_not_nil notification
138
+ assert_equal 1, NotificationRecipient.where(notification_id: notification.id).update_all(seen: true) # rubocop:disable Rails/SkipsModelValidations
139
+ ExpireHostsNotifications.deliver_expiry_warning_notification
140
+ assert_equal 1, NotificationRecipient.where(notification_id: notification.id, seen: false).count
50
141
  end
51
142
 
52
143
  test 'should send a single notification' do
53
- ExpireHostsMailer.expects(:expiry_warning_notification).once
54
144
  ExpireHostsNotifications.deliver_expiry_warning_notification
145
+ assert_equal 1, ActionMailer::Base.deliveries.count
146
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Expiring hosts in foreman'
55
147
  end
56
148
 
57
149
  test 'should send two notifications for two users' do
58
- owner2 = FactoryGirl.create(:user, :with_mail)
59
- FactoryGirl.create(:host, :expires_in_a_week, :owner => owner2)
60
- ExpireHostsMailer.expects(:expiry_warning_notification).twice
150
+ owner2 = FactoryBot.create(:user, :with_mail)
151
+ FactoryBot.create(:host, :expires_in_a_week, :owner => owner2)
61
152
  ExpireHostsNotifications.deliver_expiry_warning_notification
153
+ assert_equal 2, ActionMailer::Base.deliveries.count
154
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Expiring hosts in foreman'
155
+ assert_includes ActionMailer::Base.deliveries.last.subject, 'Expiring hosts in foreman'
62
156
  end
63
- end
64
157
 
65
- context '#catch_delivery_errors' do
66
- test 'should catch and log errors' do
67
- host1 = OpenStruct.new(:name => 'Alpha')
68
- host2 = OpenStruct.new(:name => 'Bravo')
69
- hosts = [host1, host2]
70
- Foreman::Logging.expects(:exception).with('failure for Hosts Alpha and Bravo', anything)
71
- ExpireHostsNotifications.catch_delivery_errors('failure', hosts) do
72
- raise 'Test'
73
- end
158
+ test 'should send three notifications for three users' do
159
+ user2 = FactoryBot.create(:user, :with_mail)
160
+ user3 = FactoryBot.create(:user, :with_mail, :usergroups => [usergroup])
161
+ FactoryBot.create(:host, :expires_in_a_week, :owner => user2)
162
+ FactoryBot.create(:host, :expires_in_a_week, :owner => usergroup)
163
+ ExpireHostsNotifications.deliver_expiry_warning_notification
164
+ assert_equal 3, ActionMailer::Base.deliveries.count
165
+ assert_includes ActionMailer::Base.deliveries.first.subject, 'Expiring hosts in foreman'
166
+ assert_includes ActionMailer::Base.deliveries.flat_map(&:to), user.mail
167
+ assert_includes ActionMailer::Base.deliveries.flat_map(&:to), user2.mail
168
+ assert_includes ActionMailer::Base.deliveries.flat_map(&:to), user3.mail
169
+ assert_equal 1, ActionMailer::Base.deliveries.flat_map(&:subject).uniq.count
74
170
  end
75
171
  end
76
172
  end