# frozen_string_literal: true

require "rails_helper"

describe Settings::SharingController, type: :controller do
  describe "#edit" do
    subject { get :edit }

    it "redirects to the sign in page when not signed in" do
      expect(subject).to redirect_to new_user_session_path
    end

    context "user signed in" do
      let(:user) { FactoryBot.create(:user) }

      before { sign_in user }

      it "renders the edit template" do
        expect(subject).to render_template(:edit)
      end
    end
  end

  describe "#update" do
    subject { patch :update, params: { user: user_params } }
    let(:user_params) do
      {
        sharing_enabled:    "1",
        sharing_autoclose:  "1",
        sharing_custom_url: "",
      }
    end

    it "redirects to the sign in page when not signed in" do
      expect(subject).to redirect_to new_user_session_path
    end

    context "user signed in" do
      let(:user) { FactoryBot.create :user }

      before { sign_in user }

      it "renders the edit template" do
        expect(subject).to render_template(:edit)
      end

      it "updates the user's sharing preferences" do
        expect { subject }
          .to change { user.reload.slice(:sharing_enabled, :sharing_autoclose, :sharing_custom_url).values }
          .from([false, false, nil])
          .to([true, true, ""])
      end

      it "sets the success flash" do
        subject
        expect(flash[:success]).to eq(I18n.t("settings.sharing.update.success"))
      end

      context "when passed a valid url" do
        let(:user_params) do
          super().merge(
            sharing_custom_url: "https://example.com/share?text="
          )
        end

        it "renders the edit template" do
          expect(subject).to render_template(:edit)
        end

        it "updates the user's sharing preferences" do
          expect { subject }
            .to change { user.reload.slice(:sharing_enabled, :sharing_autoclose, :sharing_custom_url).values }
            .from([false, false, nil])
            .to([true, true, "https://example.com/share?text="])
        end

        it "sets the success flash" do
          subject
          expect(flash[:success]).to eq(I18n.t("settings.sharing.update.success"))
        end
      end

      context "when passed an invalid url" do
        let(:user_params) do
          super().merge(
            sharing_custom_url: "nfs://example.com/data"
          )
        end

        it "renders the edit template" do
          expect(subject).to render_template(:edit)
        end

        it "updates the user's sharing preferences" do
          expect { subject }
            .not_to(change { user.reload.slice(:sharing_enabled, :sharing_autoclose, :sharing_custom_url).values })
        end

        it "sets the error flash" do
          subject
          expect(flash[:error]).to eq(I18n.t("settings.sharing.update.error"))
        end
      end

      context "when unticking boolean settings" do
        let(:user_params) do
          super().merge(
            sharing_enabled:   "0",
            sharing_autoclose: "0"
          )
        end

        let(:user) { FactoryBot.create :user, sharing_enabled: true, sharing_autoclose: true, sharing_custom_url: "https://example.com/share?text=" }

        it "renders the edit template" do
          expect(subject).to render_template(:edit)
        end

        it "updates the user's sharing preferences" do
          expect { subject }
            .to change { user.reload.slice(:sharing_enabled, :sharing_autoclose, :sharing_custom_url).values }
            .from([true, true, "https://example.com/share?text="])
            .to([false, false, ""])
        end

        it "sets the success flash" do
          subject
          expect(flash[:success]).to eq(I18n.t("settings.sharing.update.success"))
        end
      end
    end
  end
end