diff --git a/app/controllers/admin/settings/base_controller.rb b/app/controllers/admin/settings/base_controller.rb index 3fbc35833..6604e4192 100644 --- a/app/controllers/admin/settings/base_controller.rb +++ b/app/controllers/admin/settings/base_controller.rb @@ -1,37 +1,21 @@ module Admin module Settings class BaseController < Admin::ApplicationController - MISMATCH_ERROR = "The confirmation key does not match".freeze - - before_action :extra_authorization_and_confirmation, only: [:create] + before_action :authorize_super_admin def create result = upsert_config(settings_params) if result.success? Audit::Logger.log(:internal, current_user, params.dup) - redirect_to admin_config_path, notice: "Successfully updated settings." + render json: { message: "Successfully updated settings." }, status: :ok else - redirect_to admin_config_path, alert: "😭 #{result.errors.to_sentence}" + render json: { error: result.errors.to_sentence }, status: :unprocessable_entity end end private - def extra_authorization_and_confirmation - not_authorized unless current_user.has_role?(:super_admin) - raise_confirmation_mismatch_error unless confirmation_text_valid? - end - - def confirmation_text_valid? - params.require(:confirmation) == - "My username is @#{current_user.username} and this action is 100% safe and appropriate." - end - - def raise_confirmation_mismatch_error - raise ActionController::BadRequest.new, MISMATCH_ERROR - end - # Override this method if you need to call a custom class for upserting. # Ideally such a class eventually calls out to Settings::Upsert and returns # the result of that service. @@ -46,6 +30,10 @@ module Admin .require(:"settings_#{authorization_resource.name.demodulize.underscore}") .permit(*authorization_resource.keys) end + + def authorize_super_admin + raise Pundit::NotAuthorizedError unless current_user.has_role?(:super_admin) + end end end end diff --git a/app/controllers/admin/settings/general_settings_controller.rb b/app/controllers/admin/settings/general_settings_controller.rb index 8118af29a..5d9b20586 100644 --- a/app/controllers/admin/settings/general_settings_controller.rb +++ b/app/controllers/admin/settings/general_settings_controller.rb @@ -12,9 +12,9 @@ module Admin result = ::Settings::General::Upsert.call(settings_params) if result.success? Audit::Logger.log(:internal, current_user, params.dup) - redirect_to admin_config_path, notice: "Successfully updated settings." + render json: { message: "Successfully updated settings." }, status: :ok else - redirect_to admin_config_path, alert: "😭 #{result.errors.to_sentence}" + render json: { error: result.errors.to_sentence }, status: :unprocessable_entity end end diff --git a/app/controllers/admin/settings/smtp_settings_controller.rb b/app/controllers/admin/settings/smtp_settings_controller.rb index 8f80230a0..b3a79769d 100644 --- a/app/controllers/admin/settings/smtp_settings_controller.rb +++ b/app/controllers/admin/settings/smtp_settings_controller.rb @@ -1,6 +1,8 @@ module Admin module Settings class SMTPSettingsController < Admin::Settings::BaseController + private + def authorization_resource ::Settings::SMTP end diff --git a/app/javascript/admin/controllers/config_controller.js b/app/javascript/admin/controllers/config_controller.js index 837ee51ce..dfd25ec48 100644 --- a/app/javascript/admin/controllers/config_controller.js +++ b/app/javascript/admin/controllers/config_controller.js @@ -93,6 +93,37 @@ export default class ConfigController extends Controller { } } + displaySnackbar(message) { + return document.dispatchEvent( + new CustomEvent('snackbar:add', { + detail: { message }, + }), + ); + } + + async updateConfigurationSettings(event) { + event.preventDefault(); + try { + const body = new FormData(event.target); + const response = await fetch(event.target.action, { + method: 'POST', + headers: { + Accept: 'application/json', + 'X-CSRF-Token': document.querySelector("meta[name='csrf-token']") + ?.content, + }, + body, + credentials: 'same-origin', + }); + + const outcome = await response.json(); + + this.displaySnackbar(outcome.message ?? outcome.error); + } catch (err) { + this.displaySnackbar(err.message); + } + } + // GENERAL FUNCTIONS END // EMAIL AUTH FUNCTIONS START @@ -158,7 +189,7 @@ export default class ConfigController extends Controller { enableOrEditAuthProvider(event) { event.preventDefault(); - const {providerName} = event.target.dataset; + const { providerName } = event.target.dataset; const enabledIndicator = document.getElementById( `${providerName}-enabled-indicator`, ); @@ -177,7 +208,7 @@ export default class ConfigController extends Controller { disableAuthProvider(event) { event.preventDefault(); - const {providerName} = event.target.dataset; + const { providerName } = event.target.dataset; const enabledIndicator = document.getElementById( `${providerName}-enabled-indicator`, ); @@ -200,8 +231,8 @@ export default class ConfigController extends Controller { activateAuthProviderModal(event) { event.preventDefault(); - const {providerName} = event.target.dataset; - const {providerOfficialName} = event.target.dataset; + const { providerName } = event.target.dataset; + const { providerOfficialName } = event.target.dataset; this.configModalAnchorTarget.innerHTML = adminModal({ title: this.authProviderModalTitle(providerOfficialName), body: this.authProviderModalBody(providerOfficialName), @@ -218,7 +249,7 @@ export default class ConfigController extends Controller { disableAuthProviderFromModal(event) { event.preventDefault(); - const {providerName} = event.target.dataset; + const { providerName } = event.target.dataset; const authEnableButton = document.getElementById( `${providerName}-auth-btn`, ); @@ -254,7 +285,7 @@ export default class ConfigController extends Controller { hideAuthProviderSettings(event) { event.preventDefault(); - const {providerName} = event.target.dataset; + const { providerName } = event.target.dataset; document .getElementById(`${providerName}-auth-settings`) .classList.add('hidden'); @@ -342,7 +373,7 @@ export default class ConfigController extends Controller { event.preventDefault(); this.activateMissingKeysModal(this.enabledProvidersWithMissingKeys()); } else { - event.target.submit(); + this.updateConfigurationSettings(event); } } diff --git a/app/views/admin/settings/_form_submission.html.erb b/app/views/admin/settings/_form_submission.html.erb deleted file mode 100644 index 761f89da4..000000000 --- a/app/views/admin/settings/_form_submission.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -<% if current_user.has_role?(:super_admin) %> -
-
- <%= label_tag :confirmation_update, "Confirmation update", class: "crayons-field__label" %> -

Type the sentence: <%= @confirmation_text %>

-
- <%= text_field_tag :confirmation, nil, class: "crayons-textfield flex-1 mr-2", placeholder: "Confirmation text", autocomplete: "off", required: true, pattern: @confirmation_text %> - <%= f.submit "Update Settings", class: "crayons-btn align-self-start" %> -
-
-
-<% end %> diff --git a/app/views/admin/settings/_update_setting_button.html.erb b/app/views/admin/settings/_update_setting_button.html.erb new file mode 100644 index 000000000..c466434c5 --- /dev/null +++ b/app/views/admin/settings/_update_setting_button.html.erb @@ -0,0 +1,3 @@ +<% if current_user.has_role?(:super_admin) %> + <%= f.submit "Update Settings", class: "crayons-btn mt-4", data: { disable_with: false } %> +<% end %> diff --git a/app/views/admin/settings/forms/_api_tokens.html.erb b/app/views/admin/settings/forms/_api_tokens.html.erb index 9a1cc2264..5c910f5da 100644 --- a/app/views/admin/settings/forms/_api_tokens.html.erb +++ b/app/views/admin/settings/forms/_api_tokens.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -25,8 +27,8 @@ value: Settings::General.video_encoder_key, placeholder: Constants::Settings::General::DETAILS[:video_encoder_key][:placeholder] %>
- <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_authentication.html.erb b/app/views/admin/settings/forms/_authentication.html.erb index 3d8332173..54b6d8d52 100644 --- a/app/views/admin/settings/forms/_authentication.html.erb +++ b/app/views/admin/settings/forms/_authentication.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::Authentication.new, url: admin_settings_authentications_path, html: { data: { action: "submit->config#configUpdatePrecheck", "config-target": "authSectionForm", testid: "authSectionForm" } }) do |f| %> +<%= form_for(Settings::Authentication.new, + url: admin_settings_authentications_path, + html: { data: { action: "submit->config#configUpdatePrecheck", "config-target": "authSectionForm", testid: "authSectionForm" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -208,7 +210,7 @@ Changing authentication keys will not take effect until this Forem instance is restarted.
- <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_campaign.html.erb b/app/views/admin/settings/forms/_campaign.html.erb index 531067860..bfda2107f 100644 --- a/app/views/admin/settings/forms/_campaign.html.erb +++ b/app/views/admin/settings/forms/_campaign.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::Campaign.new, url: admin_settings_campaigns_path) do |f| %> +<%= form_for(Settings::Campaign.new, + url: admin_settings_campaigns_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -81,9 +83,8 @@ value: Settings::Campaign.articles_expiry_time, placeholder: Constants::Settings::Campaign::DETAILS[:articles_expiry_time][:placeholder] %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_community.html.erb b/app/views/admin/settings/forms/_community.html.erb index 1d1253ad5..50ed186a6 100644 --- a/app/views/admin/settings/forms/_community.html.erb +++ b/app/views/admin/settings/forms/_community.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::Community.new, url: admin_settings_communities_path) do |f| %> +<%= form_for(Settings::Community.new, + url: admin_settings_communities_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -71,8 +73,8 @@ value: Settings::Community.staff_user_id, placeholder: Constants::Settings::Community::DETAILS[:staff_user_id][:placeholder] %>
- <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_credits.html.erb b/app/views/admin/settings/forms/_credits.html.erb index 531b948a7..239e82152 100644 --- a/app/views/admin/settings/forms/_credits.html.erb +++ b/app/views/admin/settings/forms/_credits.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -42,9 +44,8 @@ value: Settings::General.credit_prices_in_cents[:xlarge] %>
<% end %> - - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_email_digest_frequency.html.erb b/app/views/admin/settings/forms/_email_digest_frequency.html.erb index 780616d28..461e24f97 100644 --- a/app/views/admin/settings/forms/_email_digest_frequency.html.erb +++ b/app/views/admin/settings/forms/_email_digest_frequency.html.erb @@ -1,4 +1,9 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path, html: { data: { testid: "emailDigestSectionForm" } }) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { + action: "submit->config#updateConfigurationSettings", + testid: "emailDigestSectionForm" + } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -17,9 +22,8 @@ value: Settings::General.periodic_email_digest, placeholder: Constants::Settings::General::DETAILS[:periodic_email_digest][:placeholder] %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_google_analytics.html.erb b/app/views/admin/settings/forms/_google_analytics.html.erb index dae0d53d4..fc49736a0 100644 --- a/app/views/admin/settings/forms/_google_analytics.html.erb +++ b/app/views/admin/settings/forms/_google_analytics.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -16,9 +18,8 @@ class: "crayons-textfield", value: Settings::General.ga_tracking_id %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_images.html.erb b/app/views/admin/settings/forms/_images.html.erb index b7ea21091..cbc538bc6 100644 --- a/app/views/admin/settings/forms/_images.html.erb +++ b/app/views/admin/settings/forms/_images.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -57,9 +59,8 @@
<% end %> - - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_mandatory.html.erb b/app/views/admin/settings/forms/_mandatory.html.erb index 1b7a370cb..fde7cb6d7 100644 --- a/app/views/admin/settings/forms/_mandatory.html.erb +++ b/app/views/admin/settings/forms/_mandatory.html.erb @@ -1,4 +1,4 @@ -<%= form_with(url: admin_settings_mandatory_settings_path, local: true, data: { testid: "getStartedSectionForm" }) do |f| %> +<%= form_with(url: admin_settings_mandatory_settings_path, data: { action: "submit->config#updateConfigurationSettings", testid: "getStartedSectionForm" }) do |f| %>
<% Settings::Mandatory::MAPPINGS.each do |config_key, settings_model| %> @@ -40,18 +40,6 @@ <% end %> <% end %> - - <% if current_user.has_role?(:super_admin) %> -
-
- <%= label_tag :confirmation_update, "Confirmation update", class: "crayons-field__label" %> -

Type the sentence: <%= @confirmation_text %>

-
- <%= text_field_tag :confirmation, nil, class: "crayons-textfield flex-1 mr-2", placeholder: "Confirmation text", autocomplete: "off", required: true, pattern: @confirmation_text %> - <%= f.submit "Update Settings", class: "crayons-btn align-self-start" %> -
-
-
- <% end %>
+ <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_mascot.html.erb b/app/views/admin/settings/forms/_mascot.html.erb index 7269d63fa..a5f571883 100644 --- a/app/views/admin/settings/forms/_mascot.html.erb +++ b/app/views/admin/settings/forms/_mascot.html.erb @@ -1,4 +1,9 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path, html: { data: { testid: "mascotSectionForm" } }) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { + action: "submit->config#updateConfigurationSettings", + testid: "mascotSectionForm" + } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -32,8 +37,8 @@
- <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_meta_keywords.html.erb b/app/views/admin/settings/forms/_meta_keywords.html.erb index 3d56f6a8d..1f464508a 100644 --- a/app/views/admin/settings/forms/_meta_keywords.html.erb +++ b/app/views/admin/settings/forms/_meta_keywords.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -23,9 +25,8 @@
<% end %> <% end %> - - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_monetization.html.erb b/app/views/admin/settings/forms/_monetization.html.erb index 8d8545fdd..c107013e4 100644 --- a/app/views/admin/settings/forms/_monetization.html.erb +++ b/app/views/admin/settings/forms/_monetization.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -36,9 +38,8 @@ value: Settings::General.payment_pointer, placeholder: Constants::Settings::General::DETAILS[:payment_pointer][:placeholder] %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_newsletter.html.erb b/app/views/admin/settings/forms/_newsletter.html.erb index efa6e3769..6a71f6894 100644 --- a/app/views/admin/settings/forms/_newsletter.html.erb +++ b/app/views/admin/settings/forms/_newsletter.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -48,9 +50,8 @@ class: "crayons-textfield", value: Settings::General.mailchimp_community_moderators_id %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_onboarding.html.erb b/app/views/admin/settings/forms/_onboarding.html.erb index fa2747bd5..b835d670e 100644 --- a/app/views/admin/settings/forms/_onboarding.html.erb +++ b/app/views/admin/settings/forms/_onboarding.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -41,9 +43,8 @@

- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_rate_limit.html.erb b/app/views/admin/settings/forms/_rate_limit.html.erb index c3f925e36..b5c1ae8a3 100644 --- a/app/views/admin/settings/forms/_rate_limit.html.erb +++ b/app/views/admin/settings/forms/_rate_limit.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::RateLimit.new, url: admin_settings_rate_limits_path) do |f| %> +<%= form_for(Settings::RateLimit.new, + url: admin_settings_rate_limits_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -40,13 +42,15 @@ value: Settings::RateLimit.spam_trigger_terms.join(","), placeholder: Constants::Settings::RateLimit::DETAILS[:spam_trigger_terms][:placeholder] %>
- <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -79,9 +83,8 @@
<% end %> <% end %> - - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_smtp.html.erb b/app/views/admin/settings/forms/_smtp.html.erb index ba642444b..3a7650be8 100644 --- a/app/views/admin/settings/forms/_smtp.html.erb +++ b/app/views/admin/settings/forms/_smtp.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::SMTP.new, url: admin_settings_smtp_settings_path) do |f| %> +<%= form_for(Settings::SMTP.new, + url: admin_settings_smtp_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { header: "SMTP Settings", state: "collapse", target: "smtpSettingsBodyContainer", expanded: false } %> @@ -15,8 +17,8 @@
<% end %> - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_sponsors.html.erb b/app/views/admin/settings/forms/_sponsors.html.erb index 286e2c621..3024b13be 100644 --- a/app/views/admin/settings/forms/_sponsors.html.erb +++ b/app/views/admin/settings/forms/_sponsors.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -17,9 +19,8 @@ value: Settings::General.sponsor_headline, placeholder: Constants::Settings::General::DETAILS[:sponsor_headline][:placeholder] %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_tags.html.erb b/app/views/admin/settings/forms/_tags.html.erb index 47ce0be73..18d91789e 100644 --- a/app/views/admin/settings/forms/_tags.html.erb +++ b/app/views/admin/settings/forms/_tags.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::General.new, url: admin_settings_general_settings_path) do |f| %> +<%= form_for(Settings::General.new, + url: admin_settings_general_settings_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -18,9 +20,8 @@ placeholder: Constants::Settings::General::DETAILS[:sidebar_tags][:placeholder], pattern: "[a-z0-9,]+" %>
- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/app/views/admin/settings/forms/_user_experience.html.erb b/app/views/admin/settings/forms/_user_experience.html.erb index 5c0549da2..d8edd7fe2 100644 --- a/app/views/admin/settings/forms/_user_experience.html.erb +++ b/app/views/admin/settings/forms/_user_experience.html.erb @@ -1,4 +1,6 @@ -<%= form_for(Settings::UserExperience.new, url: admin_settings_user_experiences_path) do |f| %> +<%= form_for(Settings::UserExperience.new, + url: admin_settings_user_experiences_path, + html: { data: { action: "submit->config#updateConfigurationSettings" } }) do |f| %>
<%= render partial: "admin/shared/card_header", locals: { @@ -70,9 +72,8 @@

- - <%= render "form_submission", f: f %> + <%= render "update_setting_button", f: f %> <% end %> diff --git a/cypress/integration/seededFlows/adminFlows/config/authenticationSection.spec.js b/cypress/integration/seededFlows/adminFlows/config/authenticationSection.spec.js index 75d3f77e8..4b0fbcf99 100644 --- a/cypress/integration/seededFlows/adminFlows/config/authenticationSection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/authenticationSection.spec.js @@ -31,22 +31,22 @@ describe('Authentication Section', () => { .should('not.be.checked') .check(); - cy.get('@authSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); cy.get('@authSectionForm') .findByRole('button', { name: 'Update Settings' }) .click(); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); + cy.url().should('contains', '/admin/customization/config'); // Page reloaded so need to get a new reference to the form. cy.findByTestId('authSectionForm').as('authSectionForm'); - cy.findByText('Successfully updated settings.').should('be.visible'); - cy.get('@authSectionForm') .findByRole('heading', { name: 'Authentication' }) .click(); @@ -81,13 +81,7 @@ describe('Authentication Section', () => { cy.get('@authSectionForm').findByText('Authentication').click(); cy.get('#facebook-auth-btn').click(); - cy.get('@user').then(({ username }) => { - cy.get('@authSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - }); + cy.get('@authSectionForm').findByText('Update Settings').click(); cy.get('.crayons-modal__box__body > ul > li') @@ -107,13 +101,7 @@ describe('Authentication Section', () => { cy.get('#facebook-auth-btn').click(); cy.get('#settings_authentication_facebook_key').type('randomkey'); cy.get('#settings_authentication_facebook_secret').type('randomsecret'); - cy.get('@user').then(({ username }) => { - cy.get('@authSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - }); + cy.get('@authSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); @@ -127,5 +115,28 @@ describe('Authentication Section', () => { cy.findByLabelText('Facebook enabled').should('be.visible'); }); }); + + it('generates error message when update fails', () => { + cy.intercept('POST', 'admin/settings/authentications', { + error: 'some error msg', + }); + cy.get('@user').then(() => { + cy.visit('/admin/customization/config'); + cy.findByTestId('authSectionForm').as('authSectionForm'); + + cy.get('@authSectionForm').findByText('Authentication').click(); + cy.get('#facebook-auth-btn').click(); + cy.get('#settings_authentication_facebook_key').type('randomkey'); + cy.get('#settings_authentication_facebook_secret').type('randomsecret'); + + cy.get('@authSectionForm').findByText('Update Settings').click(); + + cy.url().should('contains', '/admin/customization/config'); + + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should('have.text', 'some error msg'); + }); + }); + }); }); }); diff --git a/cypress/integration/seededFlows/adminFlows/config/campaignSection.spec.js b/cypress/integration/seededFlows/adminFlows/config/campaignSection.spec.js index 8751047b6..013ce0819 100644 --- a/cypress/integration/seededFlows/adminFlows/config/campaignSection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/campaignSection.spec.js @@ -10,7 +10,7 @@ describe('Campaign Section', () => { describe('sidebar image setting', () => { it('rejects an invalid image URL', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.get('#new_settings_campaign').as('campaignSectionForm'); @@ -19,24 +19,21 @@ describe('Campaign Section', () => { .findByPlaceholderText('Used at the top of the campaign sidebar') .type('example.com/image.png'); - cy.get('@campaignSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@campaignSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText( - '😭 Validation failed: Sidebar image is not a valid URL', - ).should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Validation failed: Sidebar image is not a valid URL', + ); + }); }); }); it('accepts a valid image URL', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.get('#new_settings_campaign').as('campaignSectionForm'); @@ -45,17 +42,16 @@ describe('Campaign Section', () => { .findByPlaceholderText('Used at the top of the campaign sidebar') .type('https://example.com/image.png'); - cy.get('@campaignSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@campaignSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); // Page reloaded so need to get a new reference to the form. cy.get('#new_settings_campaign').as('campaignSectionForm'); diff --git a/cypress/integration/seededFlows/adminFlows/config/communitySection.spec.js b/cypress/integration/seededFlows/adminFlows/config/communitySection.spec.js index bb9984a87..fe88b1637 100644 --- a/cypress/integration/seededFlows/adminFlows/config/communitySection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/communitySection.spec.js @@ -10,7 +10,7 @@ describe('Community Content Section', () => { describe('community emoji setting', () => { it('rejects invalid input (no emoji)', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.get('#new_settings_community').as('communitySectionForm'); @@ -20,24 +20,21 @@ describe('Community Content Section', () => { .clear() .type('X'); - cy.get('@communitySectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@communitySectionForm').findByText('Update Settings').click(); - cy.url().should('contains', '/admin/customization/config'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Validation failed: Community emoji contains non-emoji characters or invalid emoji', + ); + }); - cy.findByText( - '😭 Validation failed: Community emoji contains non-emoji characters or invalid emoji', - ).should('be.visible'); + cy.url().should('contains', '/admin/customization/config'); }); }); it('accepts a valid emoji', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.get('#new_settings_community').as('communitySectionForm'); @@ -47,17 +44,16 @@ describe('Community Content Section', () => { .clear() .type('🌱'); - cy.get('@communitySectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@communitySectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); // Page reloaded so need to get a new reference to the form. cy.get('#new_settings_community').as('communitySectionForm'); diff --git a/cypress/integration/seededFlows/adminFlows/config/emailDigestFrequencySection.spec.js b/cypress/integration/seededFlows/adminFlows/config/emailDigestFrequencySection.spec.js index c5a80ac40..ad99f6943 100644 --- a/cypress/integration/seededFlows/adminFlows/config/emailDigestFrequencySection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/emailDigestFrequencySection.spec.js @@ -10,7 +10,7 @@ describe('Email digest frequency Section', () => { describe('email digest frequency settings', () => { it('can change the frequency', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.findByTestId('emailDigestSectionForm').as('emailDigestSectionForm'); @@ -23,12 +23,6 @@ describe('Email digest frequency Section', () => { .clear() .type('42'); - cy.get('@emailDigestSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@emailDigestSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); diff --git a/cypress/integration/seededFlows/adminFlows/config/getStartedSection.spec.js b/cypress/integration/seededFlows/adminFlows/config/getStartedSection.spec.js index 9bc38ae48..324525aa4 100644 --- a/cypress/integration/seededFlows/adminFlows/config/getStartedSection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/getStartedSection.spec.js @@ -10,7 +10,7 @@ describe('Get Started Section', () => { describe('Community name setting', () => { it('updates the community name', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.findByTestId('getStartedSectionForm').as('getStartedSectionForm'); @@ -20,17 +20,16 @@ describe('Get Started Section', () => { .clear() .type('Awesome community'); - cy.get('@getStartedSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@getStartedSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); // Page reloaded so need to get a new reference to the form. cy.findByTestId('getStartedSectionForm').as('getStartedSectionForm'); @@ -39,7 +38,7 @@ describe('Get Started Section', () => { }); it('updates the suggested tags', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.findByTestId('getStartedSectionForm').as('getStartedSectionForm'); @@ -49,21 +48,44 @@ describe('Get Started Section', () => { .clear() .type('much tag, so wow'); - cy.get('@getStartedSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, + cy.get('@getStartedSectionForm').findByText('Update Settings').click(); + + cy.url().should('contains', '/admin/customization/config'); + + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', ); + }); + + // Page reloaded so need to get a new reference to the form. + cy.findByTestId('getStartedSectionForm').as('getStartedSectionForm'); + cy.get('#suggested_tags').should('have.value', 'much tag, so wow'); + }); + }); + + it('generates error message when update fails', () => { + cy.intercept('POST', '/admin/settings/mandatory_settings', { + error: 'some error msg', + }); + cy.get('@user').then(() => { + cy.visit('/admin/customization/config'); + + cy.findByTestId('getStartedSectionForm').as('getStartedSectionForm'); + + cy.get('@getStartedSectionForm') + .get('#suggested_tags') + .clear() + .type('much tag, so wow'); cy.get('@getStartedSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); - - // Page reloaded so need to get a new reference to the form. - cy.findByTestId('getStartedSectionForm').as('getStartedSectionForm'); - cy.get('#suggested_tags').should('have.value', 'much tag,so wow'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should('have.text', 'some error msg'); + }); }); }); }); diff --git a/cypress/integration/seededFlows/adminFlows/config/mascotSection.spec.js b/cypress/integration/seededFlows/adminFlows/config/mascotSection.spec.js index 91d4f2ca8..e24cf1e1b 100644 --- a/cypress/integration/seededFlows/adminFlows/config/mascotSection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/mascotSection.spec.js @@ -10,7 +10,7 @@ describe('Mascot Section', () => { describe('mascot image setting', () => { it('rejects an invalid image URL', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.findByTestId('mascotSectionForm').as('mascotSectionForm'); @@ -20,24 +20,21 @@ describe('Mascot Section', () => { .clear() .type('notanimage'); - cy.get('@mascotSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@mascotSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText( - '😭 Validation failed: Mascot image url is not a valid URL', - ).should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Validation failed: Mascot image url is not a valid URL', + ); + }); }); }); it('accepts a valid image URL', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.findByTestId('mascotSectionForm').as('mascotSectionForm'); @@ -47,17 +44,16 @@ describe('Mascot Section', () => { .clear() .type('https://example.com/image.png'); - cy.get('@mascotSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@mascotSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); // Page reloaded so need to get a new reference to the form. cy.findByTestId('mascotSectionForm').as('mascotSectionForm'); diff --git a/cypress/integration/seededFlows/adminFlows/config/rateLimitSection.spec.js b/cypress/integration/seededFlows/adminFlows/config/rateLimitSection.spec.js index 6df1888a6..f9a5d0d3b 100644 --- a/cypress/integration/seededFlows/adminFlows/config/rateLimitSection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/rateLimitSection.spec.js @@ -10,7 +10,7 @@ describe('Campaign Section', () => { describe('rate limit settings', () => { it('can change for how many days a user is considered new', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.get('#new_settings_rate_limit').as('rateLimitSectionForm'); @@ -23,17 +23,16 @@ describe('Campaign Section', () => { .clear() .type('42'); - cy.get('@rateLimitSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@rateLimitSectionForm').findByText('Update Settings').click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); cy.get('#settings_rate_limit_user_considered_new_days').should( 'have.value', @@ -41,5 +40,32 @@ describe('Campaign Section', () => { ); }); }); + + it('generates error message when update fails', () => { + cy.intercept('POST', '/admin/settings/rate_limits', { + error: 'some error msg', + }); + cy.get('@user').then(() => { + cy.visit('/admin/customization/config'); + cy.get('#new_settings_rate_limit').as('rateLimitSectionForm'); + + cy.get('@rateLimitSectionForm') + .findByText('Rate limits and anti-spam') + .click(); + + cy.get('@rateLimitSectionForm') + .get('#settings_rate_limit_user_considered_new_days') + .clear() + .type('42'); + + cy.get('@rateLimitSectionForm').findByText('Update Settings').click(); + + cy.url().should('contains', '/admin/customization/config'); + + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should('have.text', 'some error msg'); + }); + }); + }); }); }); diff --git a/cypress/integration/seededFlows/adminFlows/config/userExperienceSection.spec.js b/cypress/integration/seededFlows/adminFlows/config/userExperienceSection.spec.js index 62ed80fd3..9d3dbe3be 100644 --- a/cypress/integration/seededFlows/adminFlows/config/userExperienceSection.spec.js +++ b/cypress/integration/seededFlows/adminFlows/config/userExperienceSection.spec.js @@ -10,7 +10,7 @@ describe('User experience Section', () => { describe('default font', () => { it('can change the default font', () => { - cy.get('@user').then(({ username }) => { + cy.get('@user').then(() => { cy.visit('/admin/customization/config'); cy.get('#new_settings_user_experience').as('userExperienceSectionForm'); @@ -22,19 +22,18 @@ describe('User experience Section', () => { // We need to use force here because the select is covered by another element. .select('open-dyslexic', { force: true }); - cy.get('@userExperienceSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${username} and this action is 100% safe and appropriate.`, - ); - cy.get('@userExperienceSectionForm') .findByText('Update Settings') .click(); cy.url().should('contains', '/admin/customization/config'); - cy.findByText('Successfully updated settings.').should('be.visible'); + cy.findByTestId('snackbar').within(() => { + cy.findByRole('alert').should( + 'have.text', + 'Successfully updated settings.', + ); + }); // Page reloaded so need to get a new reference to the form. cy.get('#new_settings_user_experience').as('userExperienceSectionForm'); diff --git a/cypress/integration/seededFlows/adminFlows/pages/landingPage.spec.js b/cypress/integration/seededFlows/adminFlows/pages/landingPage.spec.js index cde9d05f0..428b19e02 100644 --- a/cypress/integration/seededFlows/adminFlows/pages/landingPage.spec.js +++ b/cypress/integration/seededFlows/adminFlows/pages/landingPage.spec.js @@ -17,11 +17,6 @@ describe('Set a landing page from the admin portal', () => { .should('be.checked') .uncheck(); - cy.get('@userExperienceSectionForm') - .findByPlaceholderText('Confirmation text') - .type( - `My username is @${user.username} and this action is 100% safe and appropriate.`, - ); cy.get('@userExperienceSectionForm') .findByRole('button', { name: 'Update Settings' }) .click(); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 5bd18c7b8..33ace7b72 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -178,25 +178,22 @@ const DEFAULT_AUTH_CONFIG = { */ Cypress.Commands.add( 'updateAdminAuthConfig', - ( - username = 'admin_mcadmin', - { - inviteOnlyMode = false, - emailRegistration = true, - allowedEmailDomains, - publicEmailDomainList = false, - requireRecaptcha = false, - recaptchaSiteKey, - recaptchaSecretKey, - authProvidersToEnable, - facebookKey, - facebookSecret, - githubKey, - githubSecret, - twitterKey, - twitterSecret, - } = DEFAULT_AUTH_CONFIG, - ) => { + ({ + inviteOnlyMode = false, + emailRegistration = true, + allowedEmailDomains = '', + publicEmailDomainList = false, + requireRecaptcha = false, + recaptchaSiteKey = '', + recaptchaSecretKey = '', + authProvidersToEnable, + facebookKey = '', + facebookSecret = '', + githubKey = '', + githubSecret = '', + twitterKey = '', + twitterSecret = '', + } = DEFAULT_AUTH_CONFIG) => { return cy.request( 'POST', '/admin/settings/authentications', @@ -208,7 +205,7 @@ Cypress.Commands.add( publicEmailDomainList, )}&settings_authentication%5Brequire_captcha_for_email_password_registration%5D=${toPayload( requireRecaptcha, - )}&settings_authentication%5Brecaptcha_site_key%5D=${recaptchaSiteKey}&settings_authentication%5Brecaptcha_secret_key%5D=${recaptchaSecretKey}&settings_authentication%5Bauth_providers_to_enable%5D=${authProvidersToEnable}&settings_authentication%5Bfacebook_key%5D=${facebookKey}&settings_authentication%5Bfacebook_secret%5D=${facebookSecret}&settings_authentication%5Bgithub_key%5D=${githubKey}&settings_authentication%5Bgithub_secret%5D=${githubSecret}&settings_authentication%5Btwitter_key%5D=${twitterKey}&settings_authentication%5Btwitter_secret%5D=${twitterSecret}&confirmation=My+username+is+%40${username}+and+this+action+is+100%25+safe+and+appropriate.&commit=Update+Settings`, + )}&settings_authentication%5Brecaptcha_site_key%5D=${recaptchaSiteKey}&settings_authentication%5Brecaptcha_secret_key%5D=${recaptchaSecretKey}&settings_authentication%5Bauth_providers_to_enable%5D=${authProvidersToEnable}&settings_authentication%5Bfacebook_key%5D=${facebookKey}&settings_authentication%5Bfacebook_secret%5D=${facebookSecret}&settings_authentication%5Bgithub_key%5D=${githubKey}&settings_authentication%5Bgithub_secret%5D=${githubSecret}&settings_authentication%5Btwitter_key%5D=${twitterKey}&settings_authentication%5Btwitter_secret%5D=${twitterSecret}&commit=Update+Settings`, ); }, ); diff --git a/spec/requests/admin/configs_spec.rb b/spec/requests/admin/configs_spec.rb index 0aa10a7b0..b5142d0f0 100644 --- a/spec/requests/admin/configs_spec.rb +++ b/spec/requests/admin/configs_spec.rb @@ -4,9 +4,6 @@ RSpec.describe "/admin/customization/config", type: :request do let(:user) { create(:user) } let(:admin) { create(:user, :admin) } let(:super_admin) { create(:user, :super_admin) } - let(:confirmation_message) do - "My username is @#{super_admin.username} and this action is 100% safe and appropriate." - end describe "POST /admin/customization/config as a user" do before do @@ -25,22 +22,11 @@ RSpec.describe "/admin/customization/config", type: :request do sign_in(admin) end - it "does not allow user to update config if they have proper confirmation" do + it "does not allow user to update config" do expected_image_url = "https://dummyimage.com/300x300.png" expect do post admin_settings_general_settings_path, params: { - settings_general: { favicon_url: expected_image_url }, - confirmation: confirmation_message - } - end.to raise_error Pundit::NotAuthorizedError - end - - it "does not allow user to update config if they do not have proper confirmation" do - expected_image_url = "https://dummyimage.com/300x300.png" - expect do - post admin_settings_general_settings_path, params: { - settings_general: { favicon_url: expected_image_url }, - confirmation: "Not proper" + settings_general: { favicon_url: expected_image_url } } end.to raise_error Pundit::NotAuthorizedError end @@ -54,8 +40,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates settings admin action taken" do expect do post admin_settings_general_settings_path, params: { - settings_general: { health_check_token: "token" }, - confirmation: confirmation_message + settings_general: { health_check_token: "token" } } end.to change(Settings::General, :admin_action_taken_at) end @@ -64,16 +49,14 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the health_check_token" do token = rand(20).to_s post admin_settings_general_settings_path, params: { - settings_general: { health_check_token: token }, - confirmation: confirmation_message + settings_general: { health_check_token: token } } expect(Settings::General.health_check_token).to eq token end it "sets video_encoder_key" do post admin_settings_general_settings_path, params: { - settings_general: { video_encoder_key: "123abc" }, - confirmation: confirmation_message + settings_general: { video_encoder_key: "123abc" } } expect(Settings::General.video_encoder_key).to eq("123abc") end @@ -92,8 +75,7 @@ RSpec.describe "/admin/customization/config", type: :request do "#{provider}_key": "someKey", "#{provider}_secret": "someSecret", auth_providers_to_enable: provider - }, - confirmation: confirmation_message + } } expect(Settings::Authentication.providers).to eq([provider]) end @@ -105,8 +87,7 @@ RSpec.describe "/admin/customization/config", type: :request do "#{provider}_key": "someKey", "#{provider}_secret": "someSecret", auth_providers_to_enable: enabled - }, - confirmation: confirmation_message + } } expect(Settings::Authentication.providers).to eq([provider]) end @@ -119,8 +100,7 @@ RSpec.describe "/admin/customization/config", type: :request do "#{provider}_key": "someKey", "#{provider}_secret": "", auth_providers_to_enable: provider - }, - confirmation: confirmation_message + } } expect(Settings::Authentication.providers).to eq([]) end @@ -128,8 +108,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "enables proper domains to allow list" do proper_list = "dev.to, forem.com, forem.dev" post admin_settings_authentications_path, params: { - settings_authentication: { allowed_registration_email_domains: proper_list }, - confirmation: confirmation_message + settings_authentication: { allowed_registration_email_domains: proper_list } } expect(Settings::Authentication.allowed_registration_email_domains).to eq(%w[dev.to forem.com forem.dev]) end @@ -137,8 +116,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "allows 2-character domains" do proper_list = "dev.to, forem.com, 2u.com" post admin_settings_authentications_path, params: { - settings_authentication: { allowed_registration_email_domains: proper_list }, - confirmation: confirmation_message + settings_authentication: { allowed_registration_email_domains: proper_list } } expect(Settings::Authentication.allowed_registration_email_domains).to eq(%w[dev.to forem.com 2u.com]) end @@ -146,24 +124,21 @@ RSpec.describe "/admin/customization/config", type: :request do it "does not allow improper domain list" do impproper_list = "dev.to, foremcom, forem.dev" post admin_settings_authentications_path, params: { - settings_authentication: { allowed_registration_email_domains: impproper_list }, - confirmation: confirmation_message + settings_authentication: { allowed_registration_email_domains: impproper_list } } expect(Settings::Authentication.allowed_registration_email_domains).not_to eq(%w[dev.to foremcom forem.dev]) end it "enables display_email_domain_allow_list_publicly" do post admin_settings_authentications_path, params: { - settings_authentication: { display_email_domain_allow_list_publicly: true }, - confirmation: confirmation_message + settings_authentication: { display_email_domain_allow_list_publicly: true } } expect(Settings::Authentication.display_email_domain_allow_list_publicly).to be(true) end it "enables email authentication" do post admin_settings_authentications_path, params: { - settings_authentication: { allow_email_password_registration: true }, - confirmation: confirmation_message + settings_authentication: { allow_email_password_registration: true } } expect(Settings::Authentication.allow_email_password_registration).to be(true) expect(Settings::Authentication.allow_email_password_login).to be(true) @@ -171,8 +146,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "disables email authentication" do post admin_settings_authentications_path, params: { - settings_authentication: { allow_email_password_registration: false }, - confirmation: confirmation_message + settings_authentication: { allow_email_password_registration: false } } expect(Settings::Authentication.allow_email_password_registration).to be(false) expect(Settings::Authentication.allow_email_password_login).to be(true) @@ -180,16 +154,14 @@ RSpec.describe "/admin/customization/config", type: :request do it "enables invite-only-mode" do post admin_settings_authentications_path, params: { - settings_authentication: { invite_only_mode: true }, - confirmation: confirmation_message + settings_authentication: { invite_only_mode: true } } expect(Settings::Authentication.invite_only_mode).to be(true) end it "disables invite-only-mode & enables just email registration" do post admin_settings_authentications_path, params: { - settings_authentication: { invite_only_mode: false }, - confirmation: confirmation_message + settings_authentication: { invite_only_mode: false } } expect(Settings::Authentication.invite_only_mode).to be(false) end @@ -198,8 +170,7 @@ RSpec.describe "/admin/customization/config", type: :request do describe "Campaigns" do it "sets articles_expiry_time" do post admin_settings_campaigns_path, params: { - settings_campaign: { articles_expiry_time: 4 }, - confirmation: confirmation_message + settings_campaign: { articles_expiry_time: 4 } } expect(Settings::Campaign.articles_expiry_time).to eq(4) end @@ -210,8 +181,7 @@ RSpec.describe "/admin/customization/config", type: :request do allow(Settings::Community).to receive(:community_description).and_call_original description = "Hey hey #{rand(100)}" post admin_settings_communities_path, params: { - settings_community: { community_description: description }, - confirmation: confirmation_message + settings_community: { community_description: description } } expect(Settings::Community.community_description).to eq(description) end @@ -220,8 +190,7 @@ RSpec.describe "/admin/customization/config", type: :request do allow(Settings::Community).to receive(:community_emoji).and_call_original emoji = "🥐" post admin_settings_communities_path, params: { - settings_community: { community_emoji: emoji }, - confirmation: confirmation_message + settings_community: { community_emoji: emoji } } expect(Settings::Community.community_emoji).to eq(emoji) end @@ -231,8 +200,7 @@ RSpec.describe "/admin/customization/config", type: :request do not_an_emoji = "i love croissants" expect do post admin_settings_communities_path, params: { - settings_community: { community_emoji: not_an_emoji }, - confirmation: confirmation_message + settings_community: { community_emoji: not_an_emoji } } end.not_to change(Settings::Community, :community_emoji) end @@ -240,8 +208,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the community_name" do name_magoo = "Hey hey #{rand(100)}" post admin_settings_communities_path, params: { - settings_community: { community_name: name_magoo }, - confirmation: confirmation_message + settings_community: { community_name: name_magoo } } expect(Settings::Community.community_name).to eq(name_magoo) end @@ -249,8 +216,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the community_member_label" do name = "developer" post admin_settings_communities_path, params: { - settings_community: { member_label: name }, - confirmation: confirmation_message + settings_community: { member_label: name } } expect(Settings::Community.member_label).to eq(name) end @@ -258,8 +224,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the copyright_start_year" do year = "2018" post admin_settings_communities_path, params: { - settings_community: { copyright_start_year: year }, - confirmation: confirmation_message + settings_community: { copyright_start_year: year } } expect(Settings::Community.copyright_start_year).to eq(2018) end @@ -267,16 +232,14 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the tagline" do description = "Hey hey #{rand(100)}" post admin_settings_communities_path, params: { - settings_community: { tagline: description }, - confirmation: confirmation_message + settings_community: { tagline: description } } expect(Settings::Community.tagline).to eq(description) end it "updates the staff_user_id" do post admin_settings_communities_path, params: { - settings_community: { staff_user_id: 22 }, - confirmation: confirmation_message + settings_community: { staff_user_id: 22 } } expect(Settings::Community.staff_user_id).to eq(22) end @@ -285,8 +248,7 @@ RSpec.describe "/admin/customization/config", type: :request do describe "Emails" do it "does not update the default email address" do post admin_settings_general_settings_path, params: { - settings_general: { email_addresses: { default: "random@example.com" } }, - confirmation: confirmation_message + settings_general: { email_addresses: { default: "random@example.com" } } } expect(ForemInstance.email).not_to eq("random@example.com") @@ -296,28 +258,16 @@ RSpec.describe "/admin/customization/config", type: :request do describe "Email digest frequency" do it "updates periodic_email_digest" do post admin_settings_general_settings_path, params: { - settings_general: { periodic_email_digest: 1 }, - confirmation: confirmation_message + settings_general: { periodic_email_digest: 1 } } expect(Settings::General.periodic_email_digest).to eq(1) end - - it "rejects update without proper confirmation" do - expect do - post admin_settings_general_settings_path, params: { - settings_general: { periodic_email_digest: 6 }, - confirmation: "Incorrect yo!" - } - end.to raise_error ActionController::BadRequest - expect(Settings::General.periodic_email_digest).not_to eq(6) - end end describe "Google Analytics Reporting API v4" do it "updates ga_tracking_id" do post admin_settings_general_settings_path, params: { - settings_general: { ga_tracking_id: "abc" }, - confirmation: confirmation_message + settings_general: { ga_tracking_id: "abc" } } expect(Settings::General.ga_tracking_id).to eq("abc") end @@ -330,8 +280,7 @@ RSpec.describe "/admin/customization/config", type: :request do expected_image_url = "https://dummyimage.com/300x300.png" post admin_settings_general_settings_path, params: { - settings_general: { main_social_image: expected_image_url }, - confirmation: confirmation_message + settings_general: { main_social_image: expected_image_url } } expect(Settings::General.main_social_image).to eq(expected_image_url) end @@ -340,8 +289,7 @@ RSpec.describe "/admin/customization/config", type: :request do expected_image = "https://dummyimage.com/300x300" post admin_settings_general_settings_path, params: { - settings_general: { main_social_image: expected_image }, - confirmation: confirmation_message + settings_general: { main_social_image: expected_image } } expect(Settings::General.main_social_image).to eq(expected_image) end @@ -350,8 +298,7 @@ RSpec.describe "/admin/customization/config", type: :request do invalid_image_url = "![logo_lowres]https://dummyimage.com/300x300" expect do post admin_settings_general_settings_path, params: { - settings_general: { main_social_image: invalid_image_url }, - confirmation: confirmation_message + settings_general: { main_social_image: invalid_image_url } } end.not_to change(Settings::General, :main_social_image) end @@ -359,8 +306,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates favicon_url" do expected_image_url = "https://dummyimage.com/300x300.png" post admin_settings_general_settings_path, params: { - settings_general: { favicon_url: expected_image_url }, - confirmation: confirmation_message + settings_general: { favicon_url: expected_image_url } } expect(Settings::General.favicon_url).to eq(expected_image_url) end @@ -370,8 +316,7 @@ RSpec.describe "/admin/customization/config", type: :request do expected_image_url = "https://dummyimage.com/300x300.png" expect do post admin_settings_general_settings_path, params: { - settings_general: { logo_png: expected_image_url }, - confirmation: confirmation_message + settings_general: { logo_png: expected_image_url } } end.to change(Settings::General, :logo_png).from(expected_default_image_url).to(expected_image_url) end @@ -380,8 +325,7 @@ RSpec.describe "/admin/customization/config", type: :request do expected_image = "https://dummyimage.com/300x300" post admin_settings_general_settings_path, params: { - settings_general: { logo_png: expected_image }, - confirmation: confirmation_message + settings_general: { logo_png: expected_image } } expect(Settings::General.logo_png).to eq(expected_image) end @@ -390,8 +334,7 @@ RSpec.describe "/admin/customization/config", type: :request do invalid_image_url = "![logo_lowres]https://dummyimage.com/300x300.png" expect do post admin_settings_general_settings_path, params: { - settings_general: { logo_png: invalid_image_url }, - confirmation: confirmation_message + settings_general: { logo_png: invalid_image_url } } end.not_to change(Settings::General, :logo_png) end @@ -399,39 +342,17 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates logo_svg" do expected_image_url = "https://dummyimage.com/300x300.png" post admin_settings_general_settings_path, params: { - settings_general: { logo_svg: expected_image_url }, - confirmation: confirmation_message + settings_general: { logo_svg: expected_image_url } } expect(Settings::General.logo_svg).to eq(expected_image_url) end - - it "rejects update without proper confirmation" do - expected_image_url = "https://dummyimage.com/300x300.png" - expect do - post admin_settings_general_settings_path, params: { - settings_general: { logo_svg: expected_image_url }, - confirmation: "Incorrect yo!" - } - end.to raise_error ActionController::BadRequest - end - - it "rejects update without any confirmation" do - expected_image_url = "https://dummyimage.com/300x300.png" - expect do - post admin_settings_general_settings_path, params: { - settings_general: { logo_svg: expected_image_url }, - confirmation: "" - } - end.to raise_error ActionController::ParameterMissing - end end describe "Mascot" do it "updates the mascot_user_id" do expected_mascot_user_id = 2 post admin_settings_general_settings_path, params: { - settings_general: { mascot_user_id: expected_mascot_user_id }, - confirmation: confirmation_message + settings_general: { mascot_user_id: expected_mascot_user_id } } expect(Settings::General.mascot_user_id).to eq(expected_mascot_user_id) end @@ -441,8 +362,7 @@ RSpec.describe "/admin/customization/config", type: :request do expected_image_url = "https://dummyimage.com/300x300.png" expect do post admin_settings_general_settings_path, params: { - settings_general: { mascot_image_url: expected_image_url }, - confirmation: confirmation_message + settings_general: { mascot_image_url: expected_image_url } } end.to change(Settings::General, :mascot_image_url).from(expected_default_image_url).to(expected_image_url) end @@ -452,8 +372,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates meta keywords" do expected_keywords = { "default" => "software, people", "article" => "user, experience", "tag" => "bye" } post admin_settings_general_settings_path, params: { - settings_general: { meta_keywords: expected_keywords }, - confirmation: confirmation_message + settings_general: { meta_keywords: expected_keywords } } expect(Settings::General.meta_keywords[:default]).to eq("software, people") expect(Settings::General.meta_keywords[:article]).to eq("user, experience") @@ -464,8 +383,7 @@ RSpec.describe "/admin/customization/config", type: :request do describe "Monetization" do it "updates payment pointer" do post admin_settings_general_settings_path, params: { - settings_general: { payment_pointer: "$pay.yo" }, - confirmation: confirmation_message + settings_general: { payment_pointer: "$pay.yo" } } expect(Settings::General.payment_pointer).to eq("$pay.yo") end @@ -475,8 +393,7 @@ RSpec.describe "/admin/customization/config", type: :request do settings_general: { stripe_api_key: "sk_live_yo", stripe_publishable_key: "pk_live_haha" - }, - confirmation: confirmation_message + } } expect(Settings::General.stripe_api_key).to eq("sk_live_yo") expect(Settings::General.stripe_publishable_key).to eq("pk_live_haha") @@ -486,40 +403,35 @@ RSpec.describe "/admin/customization/config", type: :request do describe "Newsletter" do it "updates mailchimp_api_key" do post admin_settings_general_settings_path, params: { - settings_general: { mailchimp_api_key: "abc" }, - confirmation: confirmation_message + settings_general: { mailchimp_api_key: "abc" } } expect(Settings::General.mailchimp_api_key).to eq("abc") end it "updates mailchimp_newsletter_id" do post admin_settings_general_settings_path, params: { - settings_general: { mailchimp_newsletter_id: "abc" }, - confirmation: confirmation_message + settings_general: { mailchimp_newsletter_id: "abc" } } expect(Settings::General.mailchimp_newsletter_id).to eq("abc") end it "updates mailchimp_sustaining_members_id" do post admin_settings_general_settings_path, params: { - settings_general: { mailchimp_sustaining_members_id: "abc" }, - confirmation: confirmation_message + settings_general: { mailchimp_sustaining_members_id: "abc" } } expect(Settings::General.mailchimp_sustaining_members_id).to eq("abc") end it "updates mailchimp_tag_moderators_id" do post admin_settings_general_settings_path, params: { - settings_general: { mailchimp_tag_moderators_id: "abc" }, - confirmation: confirmation_message + settings_general: { mailchimp_tag_moderators_id: "abc" } } expect(Settings::General.mailchimp_tag_moderators_id).to eq("abc") end it "updates mailchimp_community_moderators_id" do post admin_settings_general_settings_path, params: { - settings_general: { mailchimp_community_moderators_id: "abc" }, - confirmation: confirmation_message + settings_general: { mailchimp_community_moderators_id: "abc" } } expect(Settings::General.mailchimp_community_moderators_id).to eq("abc") end @@ -530,24 +442,21 @@ RSpec.describe "/admin/customization/config", type: :request do expected_image_url = "https://dummyimage.com/300x300.png" post admin_settings_general_settings_path, params: { settings_general: - { onboarding_background_image: expected_image_url }, - confirmation: confirmation_message + { onboarding_background_image: expected_image_url } } expect(Settings::General.onboarding_background_image).to eq(expected_image_url) end it "removes space suggested_tags" do post admin_settings_general_settings_path, params: { - settings_general: { suggested_tags: "hey, haha,hoho, bobo fofo" }, - confirmation: confirmation_message + settings_general: { suggested_tags: "hey, haha,hoho, bobo fofo" } } expect(Settings::General.suggested_tags).to eq(%w[hey haha hoho bobofofo]) end it "downcases suggested_tags" do post admin_settings_general_settings_path, params: { - settings_general: { suggested_tags: "hey, haha,hoHo, Bobo Fofo" }, - confirmation: confirmation_message + settings_general: { suggested_tags: "hey, haha,hoHo, Bobo Fofo" } } expect(Settings::General.suggested_tags).to eq(%w[hey haha hoho bobofofo]) end @@ -556,8 +465,7 @@ RSpec.describe "/admin/customization/config", type: :request do post admin_settings_general_settings_path, params: { settings_general: { suggested_users: "piglet, tigger,eeyore, Christopher Robin, kanga,roo" - }, - confirmation: confirmation_message + } } expect(Settings::General.suggested_users).to eq(%w[piglet tigger eeyore christopherrobin kanga roo]) end @@ -566,8 +474,7 @@ RSpec.describe "/admin/customization/config", type: :request do post admin_settings_general_settings_path, params: { settings_general: { suggested_users: "piglet, tigger,EEYORE, Christopher Robin, KANGA,RoO" - }, - confirmation: confirmation_message + } } expect(Settings::General.suggested_users).to eq(%w[piglet tigger eeyore christopherrobin kanga roo]) end @@ -575,8 +482,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates prefer_manual_suggested_users to true" do prefer_manual = true post admin_settings_general_settings_path, params: { - settings_general: { prefer_manual_suggested_users: prefer_manual }, - confirmation: confirmation_message + settings_general: { prefer_manual_suggested_users: prefer_manual } } expect(Settings::General.prefer_manual_suggested_users).to eq(prefer_manual) end @@ -584,8 +490,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates prefer_manual_suggested_users to false" do prefer_manual = false post admin_settings_general_settings_path, params: { - settings_general: { prefer_manual_suggested_users: prefer_manual }, - confirmation: confirmation_message + settings_general: { prefer_manual_suggested_users: prefer_manual } } expect(Settings::General.prefer_manual_suggested_users).to eq(prefer_manual) end @@ -596,8 +501,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:follow_count_daily) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { follow_count_daily: 3 }, - confirmation: confirmation_message + settings_rate_limit: { follow_count_daily: 3 } } end.to change(Settings::RateLimit, :follow_count_daily).from(default_value).to(3) end @@ -606,8 +510,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:comment_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { comment_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { comment_creation: 3 } } end.to change(Settings::RateLimit, :comment_creation).from(default_value).to(3) end @@ -616,8 +519,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:mention_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { mention_creation: 10 }, - confirmation: confirmation_message + settings_rate_limit: { mention_creation: 10 } } end.to change(Settings::RateLimit, :mention_creation).from(default_value).to(10) end @@ -626,8 +528,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:published_article_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { published_article_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { published_article_creation: 3 } } end.to change(Settings::RateLimit, :published_article_creation).from(default_value).to(3) end @@ -636,8 +537,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:published_article_antispam_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { published_article_antispam_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { published_article_antispam_creation: 3 } } end.to change(Settings::RateLimit, :published_article_antispam_creation).from(default_value).to(3) end @@ -646,8 +546,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:organization_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { organization_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { organization_creation: 3 } } end.to change(Settings::RateLimit, :organization_creation).from(default_value).to(3) end @@ -656,8 +555,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:image_upload) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { image_upload: 3 }, - confirmation: confirmation_message + settings_rate_limit: { image_upload: 3 } } end.to change(Settings::RateLimit, :image_upload).from(default_value).to(3) end @@ -666,8 +564,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:email_recipient) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { email_recipient: 3 }, - confirmation: confirmation_message + settings_rate_limit: { email_recipient: 3 } } end.to change(Settings::RateLimit, :email_recipient).from(default_value).to(3) end @@ -676,8 +573,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:user_subscription_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { user_subscription_creation: 1 }, - confirmation: confirmation_message + settings_rate_limit: { user_subscription_creation: 1 } } end.to change(Settings::RateLimit, :user_subscription_creation).from(default_value).to(1) end @@ -686,8 +582,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:article_update) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { article_update: 3 }, - confirmation: confirmation_message + settings_rate_limit: { article_update: 3 } } end.to change(Settings::RateLimit, :article_update).from(default_value).to(3) end @@ -695,8 +590,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates user_update" do expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { user_update: 3 }, - confirmation: confirmation_message + settings_rate_limit: { user_update: 3 } } end.to change(Settings::RateLimit, :user_update).to(3) end @@ -705,8 +599,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:feedback_message_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { feedback_message_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { feedback_message_creation: 3 } } end.to change(Settings::RateLimit, :feedback_message_creation).from(default_value).to(3) end @@ -715,8 +608,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:listing_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { listing_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { listing_creation: 3 } } end.to change(Settings::RateLimit, :listing_creation).from(default_value).to(3) end @@ -725,8 +617,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:reaction_creation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { reaction_creation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { reaction_creation: 3 } } end.to change(Settings::RateLimit, :reaction_creation).from(default_value).to(3) end @@ -735,8 +626,7 @@ RSpec.describe "/admin/customization/config", type: :request do default_value = Settings::RateLimit.get_default(:send_email_confirmation) expect do post admin_settings_rate_limits_path, params: { - settings_rate_limit: { send_email_confirmation: 3 }, - confirmation: confirmation_message + settings_rate_limit: { send_email_confirmation: 3 } } end.to change(Settings::RateLimit, :send_email_confirmation).from(default_value).to(3) end @@ -744,8 +634,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates spam_trigger_terms" do spam_trigger_terms = "hey, pokemon go hack" post admin_settings_rate_limits_path, params: { - settings_rate_limit: { spam_trigger_terms: spam_trigger_terms }, - confirmation: confirmation_message + settings_rate_limit: { spam_trigger_terms: spam_trigger_terms } } expect(Settings::RateLimit.spam_trigger_terms).to eq(["hey", "pokemon go hack"]) end @@ -754,8 +643,7 @@ RSpec.describe "/admin/customization/config", type: :request do site_key = "hi-ho" secret_key = "lets-go" post admin_settings_authentications_path, params: { - settings_authentication: { recaptcha_site_key: site_key, recaptcha_secret_key: secret_key }, - confirmation: confirmation_message + settings_authentication: { recaptcha_site_key: site_key, recaptcha_secret_key: secret_key } } expect(Settings::Authentication.recaptcha_site_key).to eq site_key expect(Settings::Authentication.recaptcha_secret_key).to eq secret_key @@ -766,8 +654,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates social_media_handles" do expected_handle = { "facebook" => "tpd", "github" => "", "instagram" => "", "twitch" => "", "twitter" => "" } post admin_settings_general_settings_path, params: { - settings_general: { social_media_handles: expected_handle }, - confirmation: confirmation_message + settings_general: { social_media_handles: expected_handle } } expect(Settings::General.social_media_handles[:facebook]).to eq("tpd") expect(Settings::General.social_media_handles[:github]).to eq("") @@ -776,17 +663,10 @@ RSpec.describe "/admin/customization/config", type: :request do describe "twitter_hashtag" do twitter_hashtag = "#DEVCommunity" params = { - settings_general: { twitter_hashtag: twitter_hashtag }, confirmation: "Incorrect confirmation" + settings_general: { twitter_hashtag: twitter_hashtag } } - it "does not update the twitter hashtag without the correct confirmation text" do - expect do - post admin_settings_general_settings_path, params: params - end.to raise_error ActionController::BadRequest - end - it "updates the twitter hashtag" do - params["confirmation"] = confirmation_message post admin_settings_general_settings_path, params: params expect(Settings::General.twitter_hashtag.to_s).to eq twitter_hashtag end @@ -799,23 +679,23 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates appropriate SMTP configs" do expected_handle = { "address" => "smtp.example.com", "port" => "1234" } post admin_settings_smtp_settings_path, params: { - settings_smtp: expected_handle, - confirmation: confirmation_message + settings_smtp: expected_handle } expect(Settings::SMTP.address).to eq("smtp.example.com") expect(Settings::SMTP.port).to eq(1234) end it "unsets appropriate SMTP config, and apply default value if applicable" do - Settings::SMTP.address = "smtp.example.com" - Settings::SMTP.port = 12_345 + default_address = ApplicationConfig["SMTP_ADDRESS"].presence + default_port = (ApplicationConfig["SMTP_PORT"].presence || 25).to_i expected_handle = { "address" => "", "port" => "" } + post admin_settings_smtp_settings_path, params: { - settings_smtp: expected_handle, - confirmation: confirmation_message + settings_smtp: expected_handle } - expect(Settings::SMTP.address).to eq(nil) - expect(Settings::SMTP.port).to eq(25) + + expect(Settings::SMTP.address).to eq(default_address) + expect(Settings::SMTP.port).to eq(default_port) end end @@ -823,8 +703,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the sponsor_headline" do headline = "basic" post admin_settings_general_settings_path, params: { - settings_general: { sponsor_headline: headline }, - confirmation: confirmation_message + settings_general: { sponsor_headline: headline } } expect(Settings::General.sponsor_headline).to eq(headline) end @@ -833,24 +712,21 @@ RSpec.describe "/admin/customization/config", type: :request do describe "Tags" do it "removes space sidebar_tags" do post admin_settings_general_settings_path, params: { - settings_general: { sidebar_tags: "hey, haha,hoho, bobo fofo" }, - confirmation: confirmation_message + settings_general: { sidebar_tags: "hey, haha,hoho, bobo fofo" } } expect(Settings::General.sidebar_tags).to eq(%w[hey haha hoho bobofofo]) end it "downcases sidebar_tags" do post admin_settings_general_settings_path, params: { - settings_general: { sidebar_tags: "hey, haha,hoHo, Bobo Fofo" }, - confirmation: confirmation_message + settings_general: { sidebar_tags: "hey, haha,hoHo, Bobo Fofo" } } expect(Settings::General.sidebar_tags).to eq(%w[hey haha hoho bobofofo]) end it "creates tags if they do not exist" do post admin_settings_general_settings_path, params: { - settings_general: { sidebar_tags: "bobofogololo, spla, bla" }, - confirmation: confirmation_message + settings_general: { sidebar_tags: "bobofogololo, spla, bla" } } expect(Tag.find_by(name: "bobofogololo")).to be_valid end @@ -860,8 +736,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the feed_style" do feed_style = "basic" post admin_settings_user_experiences_path, params: { - settings_user_experience: { feed_style: feed_style }, - confirmation: confirmation_message + settings_user_experience: { feed_style: feed_style } } expect(Settings::UserExperience.feed_style).to eq(feed_style) end @@ -869,8 +744,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the feed_strategy" do feed_strategy = "optimized" post admin_settings_user_experiences_path, params: { - settings_user_experience: { feed_strategy: feed_strategy }, - confirmation: confirmation_message + settings_user_experience: { feed_strategy: feed_strategy } } expect(Settings::UserExperience.feed_strategy).to eq(feed_strategy) end @@ -878,8 +752,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the tag_feed_minimum_score" do tag_feed_minimum_score = 3 post admin_settings_user_experiences_path, params: { - settings_user_experience: { tag_feed_minimum_score: tag_feed_minimum_score }, - confirmation: confirmation_message + settings_user_experience: { tag_feed_minimum_score: tag_feed_minimum_score } } expect(Settings::UserExperience.tag_feed_minimum_score).to eq(tag_feed_minimum_score) end @@ -887,8 +760,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the home_feed_minimum_score" do home_feed_minimum_score = 5 post admin_settings_user_experiences_path, params: { - settings_user_experience: { home_feed_minimum_score: home_feed_minimum_score }, - confirmation: confirmation_message + settings_user_experience: { home_feed_minimum_score: home_feed_minimum_score } } expect(Settings::UserExperience.home_feed_minimum_score).to eq(home_feed_minimum_score) end @@ -896,8 +768,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates the brand color if proper hex" do hex = "#0a0a0a" # dark enough post admin_settings_user_experiences_path, params: { - settings_user_experience: { primary_brand_color_hex: hex }, - confirmation: confirmation_message + settings_user_experience: { primary_brand_color_hex: hex } } expect(Settings::UserExperience.primary_brand_color_hex).to eq(hex) end @@ -905,8 +776,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "does not update brand color if hex not contrasting enough" do hex = "#bd746f" # not dark enough post admin_settings_user_experiences_path, params: { - settings_user_experience: { primary_brand_color_hex: hex }, - confirmation: confirmation_message + settings_user_experience: { primary_brand_color_hex: hex } } expect(Settings::UserExperience.primary_brand_color_hex).not_to eq(hex) end @@ -914,8 +784,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "does not update brand color if hex not a hex with proper format" do hex = "0a0a0a" # dark enough, but not proper format post admin_settings_user_experiences_path, params: { - settings_user_experience: { primary_brand_color_hex: hex }, - confirmation: confirmation_message + settings_user_experience: { primary_brand_color_hex: hex } } expect(Settings::UserExperience.primary_brand_color_hex).not_to eq(hex) end @@ -923,8 +792,7 @@ RSpec.describe "/admin/customization/config", type: :request do it "updates public to true" do is_public = true post admin_settings_user_experiences_path, params: { - settings_user_experience: { public: is_public }, - confirmation: confirmation_message + settings_user_experience: { public: is_public } } expect(Settings::UserExperience.public).to eq(is_public) end @@ -933,8 +801,7 @@ RSpec.describe "/admin/customization/config", type: :request do allow(Settings::UserExperience).to receive(:public).and_return(false) is_public = false post admin_settings_user_experiences_path, params: { - settings_user_experience: { public: is_public }, - confirmation: confirmation_message + settings_user_experience: { public: is_public } } expect(Settings::UserExperience.public).to eq(is_public) end @@ -949,8 +816,7 @@ RSpec.describe "/admin/customization/config", type: :request do new_prices = original_prices.merge(size => 123) expect do post admin_settings_general_settings_path, params: { - settings_general: { credit_prices_in_cents: new_prices }, - confirmation: confirmation_message + settings_general: { credit_prices_in_cents: new_prices } } end.to change { Settings::General.credit_prices_in_cents[size] }.from(original_prices[size.to_sym]).to(123) end