# frozen_string_literal: true require "spec_helper" describe ArchiveFaqsController do include LoginMacros include RedirectExpectationHelper fully_authorized_roles = %w[superadmin docs support] shared_examples "an action only fully authorized admins can access" do before { fake_login_admin(admin) } context "with no role" do let(:admin) { create(:admin, roles: []) } it "redirects with an error" do subject it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.") end end (Admin::VALID_ROLES - fully_authorized_roles).each do |role| context "with role #{role}" do let(:admin) { create(:admin, roles: [role]) } it "redirects with an error" do subject it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.") end end end fully_authorized_roles.each do |role| context "with role #{role}" do let(:admin) { create(:admin, roles: [role]) } it "succeeds" do subject success end end end end translation_authorized_roles = %w[superadmin docs support translation] shared_examples "an action translation authorized admins can access" do before { fake_login_admin(admin) } context "with no role" do let(:admin) { create(:admin, roles: []) } it "redirects with an error" do subject it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.") end end (Admin::VALID_ROLES - translation_authorized_roles).each do |role| context "with role #{role}" do let(:admin) { create(:admin, roles: [role]) } it "redirects with an error" do subject it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.") end end end translation_authorized_roles.each do |role| context "with role #{role}" do let(:admin) { create(:admin, roles: [role]) } it "succeeds" do subject success end end end end shared_examples "a non-English action that nobody can access" do before { fake_login_admin(admin) } context "with no role" do let(:admin) { create(:admin, roles: []) } it "redirects with an error" do subject it_redirects_to_with_error(archive_faqs_path, "Sorry, this action is only available for English FAQs.") end end Admin::VALID_ROLES.each do |role| context "with role #{role}" do let(:admin) { create(:admin, roles: [role]) } it "redirects with an error" do subject it_redirects_to_with_error(archive_faqs_path, "Sorry, this action is only available for English FAQs.") end end end end let(:non_standard_locale) { create(:locale) } let(:user_locale) { create(:locale) } let(:user) do user = create(:user) user.preference.update!(locale: user_locale) user end describe "GET #index" do context "when there's no locale in session" do it "redirects to the default locale when the locale param is invalid" do expect(I18n).not_to receive(:with_locale) get :index, params: { language_id: "eldritch" } it_redirects_to(archive_faqs_path(language_id: I18n.default_locale)) end it "redirects to the default locale when the locale param is empty" do expect(I18n).not_to receive(:with_locale) get :index, params: { language_id: "" } it_redirects_to(archive_faqs_path(language_id: I18n.default_locale)) end it "redirects to the default locale when the locale param and the session locale are _explicty_ empty (legacy session behavior)" do expect(I18n).not_to receive(:with_locale) get :index, params: { language_id: "" }, session: { language_id: "" } it_redirects_to(archive_faqs_path(language_id: "en")) end end context "when logged in as a regular user" do before { fake_login_known_user(user) } context "when the set locale preference feature flag is off" do before { $rollout.deactivate_user(:set_locale_preference, user) } it "redirects to the default locale when the locale param is invalid" do expect(I18n).not_to receive(:with_locale) get :index, params: { language_id: "eldritch" } it_redirects_to(archive_faqs_path(language_id: I18n.default_locale)) end end context "when the set locale preference feature flag is on" do before { $rollout.activate_user(:set_locale_preference, user) } it "redirects to the user preferred locale when the locale param is invalid" do expect(I18n).not_to receive(:with_locale) get :index, params: { language_id: "eldritch" } it_redirects_to(archive_faqs_path(language_id: user_locale.iso)) end end end context "when logged in as an admin" do before { fake_login_admin(create(:admin)) } it "redirects to the default locale with an error message when the locale param is invalid" do expect(I18n).not_to receive(:with_locale) get :index, params: { language_id: "eldritch" } it_redirects_to_with_error(archive_faqs_path(language_id: I18n.default_locale), "The specified locale does not exist.") end end context "when there's a locale in session" do before do get :index, params: { language_id: non_standard_locale.iso } expect(response).to render_template(:index) expect(session[:language_id]).to eq(non_standard_locale.iso) end it "redirects to the previous locale when the locale param is empty" do get :index it_redirects_to(archive_faqs_path(language_id: non_standard_locale.iso)) end it "redirects to the previous locale when the locale param is invalid" do get :index, params: { language_id: "eldritch" } it_redirects_to(archive_faqs_path(language_id: non_standard_locale.iso)) end context "when logged in as a regular user" do before do fake_login_known_user(user) end it "still redirects to the previous locale when the locale param is invalid" do get :index, params: { language_id: "eldritch" } it_redirects_to(archive_faqs_path(language_id: non_standard_locale.iso)) end context "with set_locale_preference" do before { $rollout.activate_user(:set_locale_preference, user) } it "still redirects to the previous locale when the locale param is invalid" do get :index, params: { language_id: "eldritch" } it_redirects_to(archive_faqs_path(language_id: non_standard_locale.iso)) end end end end end describe "GET #show" do it "raises a 404 for an invalid id" do params = { id: "angst", language_id: "en" } expect { get :show, params: params } .to raise_exception(ActiveRecord::RecordNotFound) end end describe "PATCH #update" do let(:faq) { create(:archive_faq) } context "when logged in as an admin" do before { fake_login_admin(create(:admin)) } it "redirects to the default locale when the locale param is empty" do expect(I18n).not_to receive(:with_locale) patch :update, params: { id: faq.id, language_id: "" } it_redirects_to(archive_faq_path(id: faq.id, language_id: I18n.default_locale)) end it "redirects to the default locale with an error message when the locale param is invalid" do expect(I18n).not_to receive(:with_locale) patch :update, params: { id: faq.id, language_id: "eldritch" } it_redirects_to_with_error(archive_faq_path(id: faq.id, language_id: I18n.default_locale), "The specified locale does not exist.") end end subject { patch :update, params: { id: faq, archive_faq: { title: "Changed" }, language_id: locale } } let(:success) do I18n.with_locale(locale) do expect { faq.reload } .to change { faq.title } end it_redirects_to_with_notice(faq, "Archive FAQ was successfully updated.") end context "for the default locale" do let(:locale) { "en" } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "an action translation authorized admins can access" end end describe "GET #edit" do subject { get :edit, params: { id: faq, language_id: locale } } let(:faq) { create(:archive_faq) } let(:success) do expect(response).to render_template(:edit) end context "for the default locale" do let(:locale) { "en" } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "an action translation authorized admins can access" end end describe "GET #new" do subject { get :new, params: { language_id: locale } } let(:success) do expect(response).to render_template(:new) end context "for the default locale" do let(:locale) { "en" } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "a non-English action that nobody can access" end end describe "POST #create" do subject { post :create, params: { archive_faq: attributes_for(:archive_faq), language_id: locale } } let(:success) do expect(ArchiveFaq.count).to eq(1) it_redirects_to_with_notice(assigns[:archive_faq], "Archive FAQ was successfully created.") end context "for the default locale" do let(:locale) { I18n.default_locale } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "a non-English action that nobody can access" end end describe "GET #manage" do subject { get :manage, params: { language_id: locale } } let(:success) do expect(response).to render_template(:manage) end context "for the default locale" do let(:locale) { "en" } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "a non-English action that nobody can access" end end describe "POST #update_positions" do subject { post :update_positions, params: { archive_faqs: [3, 1, 2], language_id: locale } } let!(:faq1) { create(:archive_faq, position: 1) } let!(:faq2) { create(:archive_faq, position: 2) } let!(:faq3) { create(:archive_faq, position: 3) } let(:success) do expect(faq1.reload.position).to eq(3) expect(faq2.reload.position).to eq(1) expect(faq3.reload.position).to eq(2) it_redirects_to_with_notice(archive_faqs_path, "Archive FAQs order was successfully updated.") end context "for the default locale" do let(:locale) { I18n.default_locale } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "a non-English action that nobody can access" end end describe "GET #confirm_delete" do subject { get :confirm_delete, params: { id: faq, language_id: locale } } let(:faq) { create(:archive_faq) } let(:success) do expect(response).to render_template(:confirm_delete) end context "for the default locale" do let(:locale) { "en" } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "a non-English action that nobody can access" end end describe "DELETE #destroy" do subject { delete :destroy, params: { id: faq, language_id: locale } } let(:faq) { create(:archive_faq) } let(:success) do expect { faq.reload } .to raise_exception(ActiveRecord::RecordNotFound) it_redirects_to(archive_faqs_path) end context "for the default locale" do let(:locale) { I18n.default_locale } it_behaves_like "an action only fully authorized admins can access" end context "for a non-default locale" do let(:locale) { non_standard_locale.iso } it_behaves_like "a non-English action that nobody can access" end end end