From 370ed3242620769bc70146456c716ff6504d9111 Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 2 Jan 2022 17:08:31 -0600 Subject: [PATCH] emails: fix exception when disabling dmail notifications. Fix an `undefined method 'find' for Maintenance::User:Module` exception when disabling email notifications using the "Disable notifications" link in dmails. --- .../user/email_notifications_controller.rb | 8 ++-- .../user/email_notifications_controller.rb | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 test/functional/maintenance/user/email_notifications_controller.rb diff --git a/app/controllers/maintenance/user/email_notifications_controller.rb b/app/controllers/maintenance/user/email_notifications_controller.rb index ca61ec3a3..8b8d77cde 100644 --- a/app/controllers/maintenance/user/email_notifications_controller.rb +++ b/app/controllers/maintenance/user/email_notifications_controller.rb @@ -5,6 +5,8 @@ module Maintenance class EmailNotificationsController < ApplicationController class VerificationError < StandardError; end + respond_to :html, :json, :xml + before_action :validate_sig, :only => [:destroy] rescue_from VerificationError, with: :render_verification_error @@ -12,9 +14,9 @@ module Maintenance end def destroy - @user = User.find(params[:user_id]) - @user.receive_email_notifications = false - @user.save + @user = ::User.find(params[:user_id]) + @user.update!(receive_email_notifications: false) + respond_with(@user) end private diff --git a/test/functional/maintenance/user/email_notifications_controller.rb b/test/functional/maintenance/user/email_notifications_controller.rb new file mode 100644 index 000000000..e60526214 --- /dev/null +++ b/test/functional/maintenance/user/email_notifications_controller.rb @@ -0,0 +1,38 @@ +require "test_helper" + +module Maintenance + module User + class EmailNotificationsControllerTest < ActionDispatch::IntegrationTest + context "Email notifications" do + setup do + @user = create(:user, receive_email_notifications: true) + @verifier = ActiveSupport::MessageVerifier.new(Danbooru.config.email_key, digest: "SHA256", serializer: JSON) + @sig = @verifier.generate(@user.id.to_s) + end + + context "#show" do + should "render" do + get_auth maintenance_user_email_notification_path(user_id: @user.id), @user + assert_response :success + end + end + + context "#destroy" do + should "disable email notifications" do + delete_auth maintenance_user_email_notification_path(user_id: @user.id, sig: @sig), @user + + assert_response :success + assert_equal(false, @user.reload.receive_email_notifications) + end + + should "not disable email notifications when given an incorrect signature" do + delete_auth maintenance_user_email_notification_path(user_id: @user.id, sig: "foo"), @user + + assert_response 403 + assert_equal(true, @user.reload.receive_email_notifications) + end + end + end + end + end +end