From 34eca9d6afa577110c50c533135a9fca2e1e9c58 Mon Sep 17 00:00:00 2001 From: FloWalchs Date: Fri, 24 Apr 2026 19:53:00 +0000 Subject: [PATCH 3/3] Add tests for detailed issue notification events --- test/functional/settings_controller_test.rb | 51 +++++ test/unit/journal_observer_test.rb | 232 ++++++++++++++++++-- test/unit/lib/redmine/notifiable_test.rb | 4 +- 3 files changed, 267 insertions(+), 20 deletions(-) diff --git a/test/functional/settings_controller_test.rb b/test/functional/settings_controller_test.rb index ef17883ec..bc1e79aba 100644 --- a/test/functional/settings_controller_test.rb +++ b/test/functional/settings_controller_test.rb @@ -80,6 +80,57 @@ class SettingsControllerTest < Redmine::ControllerTest assert_equal 'Test footer', Setting.emails_footer end + def test_get_notifications_settings_with_issue_cf_updated_details + with_settings(:notified_events => %w(issue_attr_updated), :notified_event_issue_cf_updated_details => ['2', '6']) do + get :edit, params: { tab: 'notifications' } + end + assert_response :success + assert_select 'input[type=checkbox][name="settings[notified_events][]"][value="issue_attr_updated"]' + assert_select 'input[type=checkbox][value="issue_cf_updated"]:not([checked])', 1 + assert_select 'input[type=hidden][name="settings[notified_event_issue_cf_updated_details][]"]' + assert_select 'select[name="settings[notified_event_issue_cf_updated_details][]"]' do + assert_select 'option[selected=selected][value="2"]' + assert_select 'option[selected=selected][value="6"]' + end + end + + def test_get_notifications_settings_displays_issue_update_detail_controls + get :edit, params: { tab: 'notifications' } + assert_response :success + + assert_select 'input[type=checkbox][name="settings[notified_events][]"][value="issue_attr_updated"]' + assert_select 'input[type=checkbox][name="settings[notified_events][]"][value="issue_relation_updated"]' + assert_select 'input[type=checkbox][name="settings[notified_events][]"][value="issue_cf_updated"]' + + assert_select 'input[type=checkbox][value="issue_attr_updated"]:not([checked])' + assert_select 'input[type=checkbox][value="issue_relation_updated"]:not([checked])' + assert_select 'input[type=checkbox][value="issue_cf_updated"]:not([checked])' + + assert_select 'select[name="settings[notified_event_issue_attr_updated_details][]"]' + assert_select 'input[type=hidden][name="settings[notified_event_issue_attr_updated_details][]"]' + assert_select 'select[name="settings[notified_event_issue_attr_updated_details][]"] option', minimum: 8 + assert_select 'option[value="status_id"]' + assert_select 'option[value="priority_id"]' + assert_select 'option[value="assigned_to_id"]' + assert_select 'option[value="subject"]' + assert_select 'select[name="settings[notified_event_issue_attr_updated_details][]"] option[selected]', 0 + + assert_select 'select[name="settings[notified_event_issue_relation_updated_details][]"]' + assert_select 'input[type=hidden][name="settings[notified_event_issue_relation_updated_details][]"]' + assert_select 'select[name="settings[notified_event_issue_relation_updated_details][]"] option', minimum: 6 + assert_select 'option[value="relates"]' + assert_select 'option[value="blocks"]' + assert_select 'option[value="follows"]' + assert_select 'select[name="settings[notified_event_issue_relation_updated_details][]"] option[selected]', 0 + + assert_select 'select[name="settings[notified_event_issue_cf_updated_details][]"]' + assert_select 'input[type=hidden][name="settings[notified_event_issue_cf_updated_details][]"]' + assert_select 'select[name="settings[notified_event_issue_cf_updated_details][]"] option', minimum: 1 + assert_select 'select[name="settings[notified_event_issue_cf_updated_details][]"] option[value]' + assert_select 'select[name="settings[notified_event_issue_cf_updated_details][]"] option', /Database|Searchable|Custom/i + assert_select 'select[name="settings[notified_event_issue_cf_updated_details][]"] option[selected]', 0 + end + def test_edit_commit_update_keywords with_settings :commit_update_keywords => [ {"keywords" => "fixes, resolves", "status_id" => "3"}, diff --git a/test/unit/journal_observer_test.rb b/test/unit/journal_observer_test.rb index 8189d836a..2814042d1 100644 --- a/test/unit/journal_observer_test.rb +++ b/test/unit/journal_observer_test.rb @@ -84,94 +84,131 @@ class JournalObserverTest < ActiveSupport::TestCase assert_equal 0, ActionMailer::Base.deliveries.size end - def test_create_should_send_email_notification_with_issue_status_updated + def test_create_should_send_email_notification_with_issue_attr_updated_details_status issue = Issue.first user = User.first issue.init_journal(user) issue.status = IssueStatus.last - with_settings :notified_events => %w(issue_status_updated) do + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => %w(status_id)) do assert issue.save end assert_equal 2, ActionMailer::Base.deliveries.size end - def test_create_should_not_send_email_notification_without_issue_status_updated + def test_create_should_send_email_notification_with_issue_attr_updated issue = Issue.first user = User.first issue.init_journal(user) issue.status = IssueStatus.last - with_settings :notified_events => [] do + with_settings(:notified_events => %w(issue_attr_updated), :notified_event_issue_attr_updated_details => []) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_create_should_not_send_email_notification_without_issue_attr_updated_details_status + issue = Issue.first + user = User.first + issue.init_journal(user) + issue.status = IssueStatus.last + + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => []) do assert issue.save end assert_equal 0, ActionMailer::Base.deliveries.size end - def test_create_without_status_update_should_not_send_email_notification_with_issue_status_updated + def test_create_without_status_update_should_not_send_email_notification_with_issue_attr_updated_details_status issue = Issue.first user = User.first issue.init_journal(user) issue.subject = "No status update" - with_settings :notified_events => %w(issue_status_updated) do + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => %w(status_id)) do assert issue.save end assert_equal 0, ActionMailer::Base.deliveries.size end - def test_create_should_send_email_notification_with_issue_assignee_updated + def test_create_should_send_email_notification_with_issue_attr_updated_details_assignee issue = Issue.generate!(:assigned_to_id => 2) ActionMailer::Base.deliveries.clear user = User.first issue.init_journal(user) issue.assigned_to = User.find(3) - with_settings :notified_events => %w(issue_assigned_to_updated) do + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => %w(assigned_to_id)) do assert issue.save end assert_equal 2, ActionMailer::Base.deliveries.size end - def test_create_should_not_send_email_notification_without_issue_assignee_updated + def test_create_should_send_email_notification_with_issue_attr_updated_assignee issue = Issue.generate!(:assigned_to_id => 2) ActionMailer::Base.deliveries.clear user = User.first issue.init_journal(user) issue.assigned_to = User.find(3) - with_settings :notified_events => [] do + with_settings(:notified_events => %w(issue_attr_updated), :notified_event_issue_attr_updated_details => []) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_create_should_not_send_email_notification_without_issue_attr_updated_details_assignee + issue = Issue.generate!(:assigned_to_id => 2) + ActionMailer::Base.deliveries.clear + user = User.first + issue.init_journal(user) + issue.assigned_to = User.find(3) + + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => []) do assert issue.save end assert_equal 0, ActionMailer::Base.deliveries.size end - def test_create_should_send_email_notification_with_issue_priority_updated + def test_create_should_send_email_notification_with_issue_attr_updated_details_priority issue = Issue.first user = User.first issue.init_journal(user) issue.priority = IssuePriority.last - with_settings :notified_events => %w(issue_priority_updated) do + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => %w(priority_id)) do assert issue.save end assert_equal 2, ActionMailer::Base.deliveries.size end - def test_create_should_not_send_email_notification_without_issue_priority_updated + def test_create_should_send_email_notification_with_issue_attr_updated_priority issue = Issue.first user = User.first issue.init_journal(user) issue.priority = IssuePriority.last - with_settings :notified_events => [] do + with_settings(:notified_events => %w(issue_attr_updated), :notified_event_issue_attr_updated_details => []) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_create_should_not_send_email_notification_without_issue_attr_updated_details_priority + issue = Issue.first + user = User.first + issue.init_journal(user) + issue.priority = IssuePriority.last + + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => []) do assert issue.save end assert_equal 0, ActionMailer::Base.deliveries.size end - def test_create_should_send_email_notification_with_issue_fixed_version_updated - with_settings :notified_events => %w(issue_fixed_version_updated) do + def test_create_should_send_email_notification_with_issue_attr_updated_details_fixed_version + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => %w(fixed_version_id)) do user = User.find_by_login('jsmith') issue = issues(:issues_001) issue.init_journal(user) @@ -182,8 +219,20 @@ class JournalObserverTest < ActiveSupport::TestCase end end - def test_create_should_not_send_email_notification_without_issue_fixed_version_updated - with_settings :notified_events => [] do + def test_create_should_send_email_notification_with_issue_attr_updated_fixed_version + with_settings(:notified_events => %w(issue_attr_updated), :notified_event_issue_attr_updated_details => []) do + user = User.find_by_login('jsmith') + issue = issues(:issues_001) + issue.init_journal(user) + issue.fixed_version = versions(:versions_003) + + assert issue.save + assert_equal 2, ActionMailer::Base.deliveries.size + end + end + + def test_create_should_not_send_email_notification_without_issue_attr_updated_details_fixed_version + with_settings(:notified_events => [], :notified_event_issue_attr_updated_details => []) do user = User.find_by_login('jsmith') issue = issues(:issues_001) issue.init_journal(user) @@ -223,4 +272,151 @@ class JournalObserverTest < ActiveSupport::TestCase assert_equal 0, ActionMailer::Base.deliveries.size end end + + def test_notify_on_issue_relation_updated_with_selected_relation_type + issue = Issue.first + other_issue = Issue.generate!(:assigned_to_id => 2) + user = User.first + issue.init_journal(user) + + with_settings(notified_events: [], notified_event_issue_relation_updated_details: %w(relates)) do + IssueRelation.create!( + issue_from: issue, + issue_to: other_issue, + relation_type: 'relates' + ) + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_notify_on_issue_relation_updated_when_event_enabled + issue = Issue.first + other_issue = Issue.generate!(:assigned_to_id => 2) + user = User.first + issue.init_journal(user) + + with_settings(:notified_events => %w(issue_relation_updated), :notified_event_issue_attr_updated_details => []) do + IssueRelation.create!( + issue_from: issue, + issue_to: other_issue, + relation_type: 'relates' + ) + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_do_not_notify_on_issue_relation_updated_with_unselected_relation_type + issue = Issue.first + other_issue = Issue.generate!(:assigned_to_id => 2) + user = User.first + issue.init_journal(user) + + with_settings(notified_events: [], notified_event_issue_relation_updated_details: %w(blocks follows)) do + IssueRelation.create!( + issue_from: issue, + issue_to: other_issue, + relation_type: 'relates' + ) + end + assert_equal 0, ActionMailer::Base.deliveries.size + end + + def test_notify_on_issue_relation_updated_with_selected_relation_type_follows + issue = Issue.first + other_issue = Issue.generate!(:assigned_to_id => 2) + user = User.first + issue.init_journal(user) + + with_settings(notified_events: [], notified_event_issue_relation_updated_details: %w(blocks follows)) do + IssueRelation.create!( + issue_from: issue, + issue_to: other_issue, + relation_type: 'follows' + ) + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_notify_on_issue_custom_field_updated_with_selected_custom_field + issue = Issue.first + user = User.first + cf = IssueCustomField.find_by!(field_format: 'string') + issue.init_journal(user) + issue.custom_field_values = { cf.id => 'New value' } + + with_settings(:notified_events => [], :notified_event_issue_cf_updated_details => [cf.id.to_s]) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_notify_on_issue_custom_field_updated_when_event_enabled + issue = Issue.first + user = User.first + cf = IssueCustomField.find_by!(field_format: 'string') + issue.init_journal(user) + issue.custom_field_values = { cf.id => 'Changed value' } + + with_settings(notified_events: %w(issue_cf_updated), notified_event_issue_cf_updated_details: []) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_do_not_notify_on_issue_custom_field_updated_with_unselected_custom_field + issue = Issue.first + user = User.first + cf1 = IssueCustomField.find_by!(field_format: 'string') + cf2 = IssueCustomField.create!( + name: 'Second CF', + field_format: 'string', + is_for_all: true, + trackers: Tracker.all + ) + issue.init_journal(user) + issue.custom_field_values = { cf2.id => 'Ignored value' } + + with_settings(notified_events: [], notified_event_issue_cf_updated_details: [cf1.id.to_s]) do + assert issue.save + end + assert_equal 0, ActionMailer::Base.deliveries.size + end + + def test_notify_on_issue_custom_field_updated_with_other_selected_custom_field + issue = Issue.first + user = User.first + cf1 = IssueCustomField.find_by!(field_format: 'string') + cf2 = IssueCustomField.create!( + name: 'Second CF', + field_format: 'string', + is_for_all: true, + trackers: Tracker.all + ) + issue.init_journal(user) + issue.custom_field_values = { cf2.id => 'Relevant value' } + + with_settings(notified_events: [], notified_event_issue_cf_updated_details: [cf2.id.to_s]) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end + + def test_notify_on_issue_custom_field_updated_with_multiple_selected_custom_fields + issue = Issue.first + user = User.first + cf1 = IssueCustomField.find_by!(field_format: 'string') + cf2 = IssueCustomField.create!( + name: 'Second CF', + field_format: 'string', + is_for_all: true, + trackers: Tracker.all + ) + issue.init_journal(user) + issue.custom_field_values = { cf2.id => 'Matching value' } + + with_settings(notified_events: [], notified_event_issue_cf_updated_details: [cf1.id.to_s, cf2.id.to_s]) do + assert issue.save + end + assert_equal 2, ActionMailer::Base.deliveries.size + end end diff --git a/test/unit/lib/redmine/notifiable_test.rb b/test/unit/lib/redmine/notifiable_test.rb index ee424663e..be5f25a27 100644 --- a/test/unit/lib/redmine/notifiable_test.rb +++ b/test/unit/lib/redmine/notifiable_test.rb @@ -24,8 +24,8 @@ class Redmine::NotifiableTest < ActiveSupport::TestCase end def test_all - %w(issue_added issue_updated issue_note_added issue_status_updated - issue_assigned_to_updated issue_priority_updated issue_fixed_version_updated issue_attachment_added news_added + %w(issue_added issue_updated issue_note_added issue_attachment_added + issue_attr_updated issue_relation_updated issue_cf_updated news_added news_comment_added document_added file_added message_posted wiki_content_added wiki_content_updated).each do |notifiable| -- 2.43.0