# frozen_string_literal: true

module Api
  RSpec.describe V0::CustomersController do
    include AuthenticationHelper

    render_views

    let(:user) { create(:user) }

    describe "index" do
      let!(:customer1) { create(:customer, created_manually: true) }
      let!(:customer2) { create(:customer, created_manually: true) }

      before do
        user.customers << customer1
        allow(controller).to receive(:spree_current_user) { user }
      end

      it "lists customers associated with the current user" do
        get :index
        expect(response).to have_http_status :ok
        expect(json_response.length).to eq 1
        expect(json_response.first[:id]).to eq customer1.id
      end
    end

    describe "#update" do
      let(:customer) { create(:customer, user:) }
      let(:params) { { format: :json, id: customer.id, customer: { code: '123' } } }

      context "as a user who is not associated with the customer" do
        before do
          allow(controller).to receive(:spree_current_user) { create(:user) }
        end

        it "returns unauthorized" do
          spree_post :update, params
          assert_unauthorized!
        end
      end

      context "as the user associated with the customer" do
        before do
          allow(controller).to receive(:spree_current_user) { user }
        end

        context "when the update request is successful" do
          it "returns the id of the updated customer" do
            spree_post :update, params
            expect(response).to have_http_status :ok
            expect(json_response[:id]).to eq customer.id
          end
        end

        context "when the update request fails" do
          before { params[:customer][:email] = '' }

          it "returns a 422, with an error message" do
            spree_post :update, params
            expect(response).to have_http_status :unprocessable_entity
            expect(json_response[:error]).to be
          end
        end
      end
    end
  end
end
