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 SleepsController do

  # This should return the minimal set of attributes required to create a valid
  # Sleep. As you add validations to Sleep, be sure to
  # adjust the attributes here as well.
  let(:user)       {Fabricate(:user)}

  let(:valid_attributes) { { "start" => "2014-01-08 23:15:57", "end" => "2014-01-09 23:15:57" } }

  describe "GET index" do
    context "when a user isn't signed in" do
      it "redirects" do
        get :index
        response.should be_redirect
      end
    end

    context "when a user is signed in" do
      before(:each) do
        sign_in user
      end

      it "assigns all sleeps as @sleeps" do
        sleep = user.sleeps.create! valid_attributes
        get :index
        assigns(:sleeps).should eq([sleep])
      end
    end
  end

  describe "GET 'show'" do
    context "when a user isn't signed in" do
      it "redirects" do
        get :show, {id: 1}
        response.should be_redirect
      end
    end

    context "when a user is is signed in" do
      before(:each) do
        sign_in user
      end

      it "assigns the requested sleep as @sleep" do
        sleep = user.sleeps.create! valid_attributes
        get :show, {:id => sleep.to_param}
        assigns(:sleep).should eq(sleep)
      end

      it "prevents access to another user's sleep" do
        sleep = Sleep.create! valid_attributes
        get :show, {id: sleep.to_param}
        response.should be_redirect
      end
    end
  end

  describe "GET new" do
    context "when a user isn't signed in" do
      it "redirects" do
        get :new, {}
        response.should be_redirect
      end
    end

    context "when a user is signed in" do
      before(:each) do
        sign_in user
      end

      it "assigns a new sleep as @sleep" do
        get :new, {}
        assigns(:sleep).should be_a_new(Sleep)
      end
    end
  end

  describe "GET edit" do
    context "when a user isn't signed in" do
      it "should redirect" do
        get :edit, {id: 1}
        response.should be_redirect
      end
    end

    context "when a user is is signed in" do
      before(:each) do
        sign_in user
      end

      it "assigns the requested sleep as @sleep" do
        sleep = user.sleeps.create! valid_attributes
        get :edit, {:id => sleep.to_param}
        assigns(:sleep).should eq(sleep)
      end

      it "prevents access to another user's sleep" do
        sleep = Sleep.create! valid_attributes
        get :edit, {id: sleep.to_param}
        response.should be_redirect
      end
    end
  end

  describe "POST create" do
    context "when a user isn't signed in" do
      it "should redirect" do
        post :create, {:sleep => valid_attributes}
        response.should be_redirect
      end
    end

    context "when a user is is signed in" do
      before(:each) do
        sign_in user
      end

      describe "with valid params" do
        it "creates a new Sleep" do
          expect {
            post :create, {:sleep => valid_attributes}
          }.to change(Sleep, :count).by(1)
        end

        it "assigns a newly created sleep as @sleep" do
          post :create, {:sleep => valid_attributes}
          assigns(:sleep).should be_a(Sleep)
          assigns(:sleep).should be_persisted
        end

        it "redirects to the sleep index" do
          post :create, {:sleep => valid_attributes}
          response.should redirect_to(sleeps_url)
        end
      end

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

        it "re-renders the 'new' template" do
          # Trigger the behavior that occurs when invalid params are submitted
          Sleep.any_instance.stub(:save).and_return(false)
          post :create, {:sleep => { "start" => "invalid value" }}
          response.should render_template("new")
        end
      end
    end
  end

  describe "PUT update" do
    context "when a user isn't signed in" do
      it "should redirect" do
        put :update, {:id => valid_attributes}
        response.should be_redirect
      end
    end

    context "when a user is is signed in" do
      before(:each) do
        sign_in user
      end

      describe "with valid params" do
        it "updates the requested sleep" do
          sleep = user.sleeps.create! valid_attributes
          # Assuming there are no other sleeps in the database, this
          # specifies that the Sleep created on the previous line
          # receives the :update_attributes message with whatever params are
          # submitted in the request.
          Sleep.any_instance.should_receive(:update).with({ "start" => "2014-01-08 23:15:57" })
          put :update, {:id => sleep.to_param, :sleep => { "start" => "2014-01-08 23:15:57" }}
        end

        it "assigns the requested sleep as @sleep" do
          sleep = user.sleeps.create! valid_attributes
          put :update, {:id => sleep.to_param, :sleep => valid_attributes}
          assigns(:sleep).should eq(sleep)
        end

        it "redirects to the sleep index" do
          sleep = user.sleeps.create! valid_attributes
          put :update, {:id => sleep.to_param, :sleep => valid_attributes}
          response.should redirect_to(sleeps_url)
        end
      end

      describe "with invalid params" do
        it "assigns the sleep as @sleep" do
          sleep = user.sleeps.create! valid_attributes
          # Trigger the behavior that occurs when invalid params are submitted
          Sleep.any_instance.stub(:save).and_return(false)
          put :update, {:id => sleep.to_param, :sleep => { "start" => "invalid value" }}
          assigns(:sleep).should eq(sleep)
        end

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

  describe "DELETE destroy" do
    context "when a user isn't signed in" do
      it "should redirect" do
        sleep = user.sleeps.create! valid_attributes
        delete :destroy, {:id => sleep.to_param}
        response.should be_redirect
      end
    end

    context "when a user is is signed in" do
      before(:each) do
        sign_in user
      end

      it "destroys the requested sleep" do
        sleep = user.sleeps.create! valid_attributes
        expect {
          delete :destroy, {:id => sleep.to_param}
        }.to change(Sleep, :count).by(-1)
      end

      it "redirects to the sleeps list" do
        sleep = user.sleeps.create! valid_attributes
        delete :destroy, {:id => sleep.to_param}
        response.should redirect_to(sleeps_url)
      end
    end
  end
end
