require "rails_helper"

RSpec.describe BulkUploadController, type: :request do
  let(:url) { "/logs/bulk-upload" }
  let(:user) { FactoryBot.create(:user) }
  let(:organisation) { user.organisation }
  before do
    allow(Organisation).to receive(:find).with(107_242).and_return(organisation)
  end

  context "a not signed in user" do
    describe "GET #show" do
      it "does not let you see the bulk upload page" do
        get url, headers: headers, params: {}
        expect(response).to redirect_to("/users/sign-in")
      end
    end

    describe "POST #bulk upload" do
      before do
        @file = fixture_file_upload("2021_22_lettings_bulk_upload.xlsx", "application/vnd.ms-excel")
      end

      it "does not let you submit bulk uploads" do
        post url, params: { bulk_upload: { case_log_bulk_upload: @file } }
        expect(response).to redirect_to("/users/sign-in")
      end
    end
  end

  context "a signed in user" do
    before do
      sign_in user
    end

    describe "GET #show" do
      before do
        get url, params: {}
      end

      it "returns a success response" do
        expect(response).to be_successful
      end

      it "returns a page with a file upload form" do
        expect(response.body).to match(/<input id="bulk-upload-case-log-bulk-upload-field" class="govuk-file-upload"/)
        expect(response.body).to match(/<button type="submit" formnovalidate="formnovalidate" class="govuk-button"/)
      end
    end

    describe "POST #bulk upload" do
      subject { post url, params: { bulk_upload: { case_log_bulk_upload: @file } } }

      context "given a valid file based on the upload template" do
        before do
          @file = fixture_file_upload("2021_22_lettings_bulk_upload.xlsx", "application/vnd.ms-excel")
        end

        it "creates case logs for each row in the template" do
          expect { subject }.to change(CaseLog, :count).by(9)
        end

        it "redirects to the case log index page" do
          expect(subject).to redirect_to(case_logs_path)
        end
      end

      context "given an invalid file type" do
        before do
          @file = fixture_file_upload("random.txt", "text/plain")
          subject
        end

        it "displays an error message" do
          expect(response.body).to match(/Invalid file type/)
        end
      end

      context "given an empty file" do
        before do
          @file = fixture_file_upload("2021_22_lettings_bulk_upload_empty.xlsx", "application/vnd.ms-excel")
          subject
        end

        it "displays an error message" do
          expect(response.body).to match(/No data found/)
        end
      end
    end
  end
end