From d243ba36ced7746ae298633603bcfc3b226e346c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 6 May 2026 04:47:12 -0400 Subject: [PATCH] Add admin area spec for email subscriptions management (#38912) --- .../admin/email_subscriptions_controller.rb | 2 +- .../email_subscriptions/_accounts.html.haml | 3 +- .../email_subscription_policy_spec.rb | 20 ++++++++ .../additional_footer_texts_spec.rb | 24 ++++++++++ .../admin/email_subscriptions/setups_spec.rb | 29 ++++++++++++ spec/system/admin/email_subscriptions_spec.rb | 47 +++++++++++++++++++ 6 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 spec/policies/email_subscription_policy_spec.rb create mode 100644 spec/system/admin/email_subscriptions/additional_footer_texts_spec.rb create mode 100644 spec/system/admin/email_subscriptions/setups_spec.rb create mode 100644 spec/system/admin/email_subscriptions_spec.rb diff --git a/app/controllers/admin/email_subscriptions_controller.rb b/app/controllers/admin/email_subscriptions_controller.rb index 39a32909dfa..af71eb70123 100644 --- a/app/controllers/admin/email_subscriptions_controller.rb +++ b/app/controllers/admin/email_subscriptions_controller.rb @@ -6,7 +6,7 @@ class Admin::EmailSubscriptionsController < Admin::BaseController @enabled = Setting.email_subscriptions @roles = UserRole.where('permissions & ? != 0', UserRole::FLAGS[:manage_email_subscriptions] | UserRole::FLAGS[:administrator]) - @accounts = Account.local.joins(:email_subscriptions).where.associated(:email_subscriptions).includes(:user) + @accounts = Account.local.where.associated(:email_subscriptions).includes(:user) end def disable diff --git a/app/views/admin/email_subscriptions/_accounts.html.haml b/app/views/admin/email_subscriptions/_accounts.html.haml index d560d417dbd..456455af4e2 100644 --- a/app/views/admin/email_subscriptions/_accounts.html.haml +++ b/app/views/admin/email_subscriptions/_accounts.html.haml @@ -39,6 +39,7 @@ %td.valign-middle = account.email_subscriptions.count %td.valign-middle - = l account.last_status_at + - if account.last_status_at.present? + = l account.last_status_at %td.valign-middle.align-end = link_to material_symbol('chevron_right'), admin_account_path(account.id), class: 'table-icon-link' diff --git a/spec/policies/email_subscription_policy_spec.rb b/spec/policies/email_subscription_policy_spec.rb new file mode 100644 index 00000000000..cdccf0a18b3 --- /dev/null +++ b/spec/policies/email_subscription_policy_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe EmailSubscriptionPolicy do + subject { described_class } + + let(:admin) { Fabricate(:admin_user).account } + let(:account) { Fabricate(:account) } + + permissions :index?, :enable?, :disable?, :purge? do + context 'when admin' do + it { is_expected.to permit(admin, EmailSubscription) } + end + + context 'when not admin' do + it { is_expected.to_not permit(account, EmailSubscription) } + end + end +end diff --git a/spec/system/admin/email_subscriptions/additional_footer_texts_spec.rb b/spec/system/admin/email_subscriptions/additional_footer_texts_spec.rb new file mode 100644 index 00000000000..9da22fb1529 --- /dev/null +++ b/spec/system/admin/email_subscriptions/additional_footer_texts_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Email Subscriptions Footer Texts' do + let(:user) { Fabricate(:admin_user) } + + before { sign_in user } + + describe 'Updated the email footer additional text' do + it 'updates the text and redirects to subscriptions page' do + visit admin_email_subscriptions_additional_footer_text_path + expect(page) + .to have_title(I18n.t('admin.email_subscriptions.additional_footer_texts.show.title')) + + fill_in 'form_admin_settings_email_footer_text', with: 'More text' + + expect { click_on submit_button } + .to change(Setting, :email_footer_text).to('More text') + expect(page) + .to have_title(I18n.t('admin.email_subscriptions.index.title')) + end + end +end diff --git a/spec/system/admin/email_subscriptions/setups_spec.rb b/spec/system/admin/email_subscriptions/setups_spec.rb new file mode 100644 index 00000000000..a0d23849c36 --- /dev/null +++ b/spec/system/admin/email_subscriptions/setups_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Email Subscriptions Setup' do + let(:user) { Fabricate(:admin_user) } + + before { sign_in user } + + describe 'Enabling the email subscription feature' do + it 'enables the feature and redirects to subscriptions page' do + visit admin_email_subscriptions_setup_path + expect(page) + .to have_title(I18n.t('admin.email_subscriptions.index.title')) + + check 'form_email_subscriptions_confirmation_agreement_privacy_and_terms' + check 'form_email_subscriptions_confirmation_agreement_email_volume' + + expect { submit_form } + .to change(Setting, :email_subscriptions).to(true) + expect(page) + .to have_title(I18n.t('admin.email_subscriptions.index.title')) + end + + def submit_form + click_on I18n.t('admin.email_subscriptions.setups.show.enable_feature') + end + end +end diff --git a/spec/system/admin/email_subscriptions_spec.rb b/spec/system/admin/email_subscriptions_spec.rb new file mode 100644 index 00000000000..0530cea150e --- /dev/null +++ b/spec/system/admin/email_subscriptions_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Email Subscriptions' do + let(:user) { Fabricate(:admin_user) } + + before { sign_in user } + + describe 'Viewing the subscriptions index page' do + before do + Fabricate.create :email_subscription # Create a sub show that purge is shown + end + + context 'when feature enabled' do + before { Setting.email_subscriptions = true } + + it 'shows subscription related details and manages the setting', :inline_jobs do + visit admin_email_subscriptions_path + expect(page) + .to have_title(I18n.t('admin.email_subscriptions.index.title')) + .and have_text(I18n.t('admin.email_subscriptions.compliance_settings.title')) + + expect { click_on I18n.t('admin.email_subscriptions.danger_zone.erase_all_data.action') } + .to change(EmailSubscription, :count).to(0) + expect(page) + .to have_text(I18n.t('admin.email_subscriptions.purged_msg')) + + expect { click_on I18n.t('admin.email_subscriptions.danger_zone.disable_feature.action') } + .to change(Setting, :email_subscriptions).to(false) + expect(page) + .to have_text(I18n.t('admin.email_subscriptions.disabled_msg')) + end + end + + context 'when feature disabled' do + before { Setting.email_subscriptions = false } + + it 'shows subscription related details' do + visit admin_email_subscriptions_path + expect(page) + .to have_title(I18n.t('admin.email_subscriptions.index.title')) + .and have_text(I18n.t('admin.email_subscriptions.index.disabled.description')) + end + end + end +end