require 'spec_helper'

# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# It assumes that the implementation code is generated by the rails scaffold
# generator.  If you are using any extension libraries to generate different
# controller code, this generated spec may or may not pass.
#
# It only uses APIs available in rails and/or rspec-rails.  There are a number
# of tools you can use to make these specs even more expressive, but we're
# sticking to rails and rspec-rails APIs to keep things simple and stable.
#
# Compared to earlier versions of this generator, there is very limited use of
# stubs and message expectations in this spec.  Stubs are only used when there
# is no simpler way to get a handle on the object needed for the example.
# Message expectations are only used when there is no simpler way to specify
# that an instance is receiving a specific message.

describe CheckoutsController, solr: true do

  let(:patron) { create(:patron) }
  let(:distributor) { create(:distributor) }
  let(:librarian) { create(:librarian) }
  let(:book) { create(:book) }
  let(:reservation) { Reservation.create(user_id: patron.id, book_id: book.id) }

  before(:each) do
    sign_in librarian
  end
  after(:all) do
    patron.destroy
    distributor.destroy
    book.destroy
    reservation.destroy
    librarian.destroy
  end

  # This should return the minimal set of attributes required to create a valid
  # Checkout. As you add validations to Checkout, be sure to
  # update the return value of this method accordingly.
  def valid_attributes
    { patron_id: patron.id, book_id: book.id, distributor_id: distributor.id }
  end

  # This should return the minimal set of values that should be in the session
  # in order to pass any filters (e.g. authentication) defined in
  # CheckoutsController. Be sure to keep this updated too.
  def valid_session
    {}
  end

  describe 'GET index' do
    it 'assigns all checkouts as @checkouts' do
      checkout = Checkout.create! valid_attributes
      get :index, {}, valid_session
      assigns(:checkouts).should eq([checkout])
    end
  end

  describe 'GET show' do
    it 'assigns the requested checkout as @checkout' do
      checkout = Checkout.create! valid_attributes
      get :show, { id: checkout.to_param }, valid_session
      assigns(:checkout).should eq(checkout)
    end
  end

  describe 'GET edit' do
    it 'assigns the requested checkout as @checkout' do
      checkout = Checkout.create! valid_attributes
      get :edit, { id: checkout.to_param }, valid_session
      assigns(:checkout).should eq(checkout)
    end
  end

  describe 'POST create' do
    describe 'with valid params' do
      it 'creates a new Checkout' do
        expect do
          post :create, { patron_barcode: '5555', distributor_barcode: '6666', isbn: book.isbn, checkout: valid_attributes }, valid_session
        end.to change(Checkout, :count).by(1)
      end

      it 'assigns a newly created checkout as @checkout' do
        post :create, { patron_barcode: '5555', distributor_barcode: '6666', isbn: book.isbn, checkout: valid_attributes }, valid_session
        assigns(:checkout).should be_a(Checkout)
        assigns(:checkout).should be_persisted
      end

      it 'redirects to the created checkout' do
        post :create, { patron_barcode: '5555', distributor_barcode: '6666', isbn: book.isbn, checkout: valid_attributes }, valid_session
        response.should redirect_to(Checkout.last)
      end
    end

    describe 'with invalid params' do
      it 'assigns a newly created but unsaved checkout as @checkout' do
        # Trigger the behavior that occurs when invalid params are submitted
        Checkout.any_instance.stub(:save).and_return(false)
        post :create, { checkout: { 'user' => 'invalid value' } }, valid_session
        assigns(:checkout).should be_a_new(Checkout)
      end
    end
  end

  describe 'PUT update' do
    describe 'with valid params' do
      it 'updates the requested checkout' do
        checkout = Checkout.create! valid_attributes
        # Assuming there are no other checkouts in the database, this
        # specifies that the Checkout created on the previous line
        # receives the :update_attributes message with whatever params are
        # submitted in the request.
        date = DateTime.new
        Checkout.any_instance.should_receive(:update).with('checked_out_at' => date)
        put :update, { id: checkout.to_param, checkout: { 'checked_out_at' => date } }, valid_session
      end

      it 'assigns the requested checkout as @checkout' do
        checkout = Checkout.create! valid_attributes
        put :update, { id: checkout.to_param, checkout: valid_attributes }, valid_session
        assigns(:checkout).should eq(checkout)
      end

      it 'redirects to the checkout' do
        checkout = Checkout.create! valid_attributes
        put :update, { id: checkout.to_param, checkout: valid_attributes }, valid_session
        response.should redirect_to(request.referer)
      end
    end

    describe 'with invalid params' do
      it 'assigns the checkout as @checkout' do
        checkout = Checkout.create! valid_attributes
        # Trigger the behavior that occurs when invalid params are submitted
        Checkout.any_instance.stub(:save).and_return(false)
        put :update, { id: checkout.to_param, checkout: { 'patron' => 'invalid value' } }, valid_session
        assigns(:checkout).should eq(checkout)
      end

      it 're-renders the edit template' do
        checkout = Checkout.create! valid_attributes
        # Trigger the behavior that occurs when invalid params are submitted
        Checkout.any_instance.stub(:save).and_return(false)
        put :update, { id: checkout.to_param, checkout: { 'patron' => 'invalid value' } }, valid_session
        response.should render_template('edit')
      end
    end
  end

  describe 'DELETE destroy' do
    it 'destroys the requested checkout' do
      checkout = Checkout.create! valid_attributes
      expect do
        delete :destroy, { id: checkout.to_param }, valid_session
      end.to change(Checkout, :count).by(-1)
    end

    it 'redirects to the checkouts list' do
      checkout = Checkout.create! valid_attributes
      delete :destroy, { id: checkout.to_param }, valid_session
      response.should redirect_to(checkouts_url)
    end
  end

end
