require 'spec_helper'

describe NewUser::DossiersController, type: :controller do
  let(:user) { create(:user) }

  describe 'before_action: ensure_ownership!' do
    it 'is present' do
      before_actions = NewUser::DossiersController
        ._process_action_callbacks
        .find_all{|process_action_callbacks| process_action_callbacks.kind == :before}
        .map(&:filter)

      expect(before_actions).to include(:ensure_ownership!)
    end
  end

  describe 'ensure_ownership!' do
    let(:user) { create(:user) }

    before do
      @controller.params[:dossier_id] = asked_dossier.id
      expect(@controller).to receive(:current_user).and_return(user)
      allow(@controller).to receive(:redirect_to)

      @controller.send(:ensure_ownership!)
    end

    context 'when a user asks for its dossier' do
      let(:asked_dossier) { create(:dossier, user: user) }

      it 'does not redirects nor flash' do
        expect(@controller).not_to have_received(:redirect_to)
        expect(flash.alert).to eq(nil)
      end
    end

    context 'when a user asks for another dossier' do
      let(:asked_dossier) { create(:dossier) }

      it 'redirects and flash' do
        expect(@controller).to have_received(:redirect_to).with(root_path)
        expect(flash.alert).to eq("Vous n'avez pas accès à ce dossier")
      end
    end
  end

  describe 'attestation' do
    before { sign_in(user) }

    context 'when a dossier has an attestation' do
      let(:fake_pdf) { double(read: 'pdf content') }
      let!(:dossier) { create(:dossier, attestation: Attestation.new, user: user) }

      it 'returns the attestation pdf' do
        allow_any_instance_of(Attestation).to receive(:pdf).and_return(fake_pdf)

        expect(controller).to receive(:send_data)
          .with('pdf content', filename: 'attestation.pdf', type: 'application/pdf') do
            controller.render nothing: true
          end

        get :attestation, params: { dossier_id: dossier.id }
        expect(response).to have_http_status(:success)
      end
    end
  end
end