# frozen_string_literal: true

RSpec.describe Api::V0::ReportsController do
  let(:enterprise_user) { create(:user, enterprises: [create(:enterprise)]) }
  let(:params) {
    {
      report_type: 'packing',
      q: { created_at_lt: Time.zone.now }
    }
  }

  before do
    allow(controller).to receive(:spree_current_user) { current_user }
  end

  describe "fetching reports" do
    context "when the user is not authenticated" do
      let(:current_user) { nil }

      it "returns unauthorised response" do
        api_get :show, params

        assert_unauthorized!
      end
    end

    context "when the user has no enterprises" do
      let(:current_user) { create(:user) }

      it "returns unauthorised response" do
        api_get :show, params

        assert_unauthorized!
      end
    end

    context "when no report type is given" do
      let(:current_user) { enterprise_user }

      it "returns an error" do
        api_get :show, q: { example: 'test' }

        expect(response).to have_http_status :unprocessable_entity
        expect(json_response["error"]).to eq 'Please specify a report type'
      end
    end

    context "given a report type that doesn't exist" do
      let(:current_user) { enterprise_user }

      it "returns an error" do
        api_get :show, report_type: "xxxxxx", q: { example: 'test' }

        expect(response).to have_http_status :unprocessable_entity
        expect(json_response["error"]).to eq 'Report not found'
      end
    end

    context "with no query params provided" do
      let(:current_user) { enterprise_user }

      it "returns an error" do
        api_get :show, report_type: "packing"
        expect(response).to have_http_status :unprocessable_entity
        expect(json_response["error"]).to eq('Please supply Ransack search params in the request')
      end
    end
  end
end
