master
 1require "rails_helper"
 2
 3describe SessionsController do
 4  describe "#new" do
 5    context "when not logged in" do
 6      it "loads the login page" do
 7        get :new
 8        expect(response).to be_success
 9        expect(assigns(:session)).to be_new_record
10      end
11    end
12
13    context "when already logged in" do
14      let(:user) { build(:user) }
15
16      before { http_login(user) }
17
18      it "redirects to the dashboard" do
19        get :new
20        expect(response).to redirect_to(my_dashboard_path)
21      end
22    end
23  end
24
25  describe "#create" do
26    context "when the email and password is correct" do
27      let(:user_session) { build(:user_session, id: SecureRandom.uuid) }
28      let(:email) { "joe" }
29      let(:password) { "password" }
30
31      before :each do
32        allow(User).to receive(:login).with(email, password).and_return(user_session)
33        post :create, params: { session: { email: email, password: password } }
34      end
35
36      it "returns a valid session" do
37        expect(session[:raphael]).to eql(user_session.key)
38      end
39
40      it "redirects to the dashboard" do
41        expect(response).to redirect_to(my_dashboard_path)
42      end
43    end
44
45    context "when the email is not known" do
46      before :each do
47        allow(User).to receive(:login).and_return(nil)
48      end
49
50      it "returns an error" do
51        post :create, params: { session: { email: 'x', password: 'y' } }
52        expect(response).to redirect_to(login_path)
53        expect(flash[:error]).to_not be_empty
54      end
55    end
56  end
57
58  describe "#destroy" do
59    let(:user_session) { create(:user_session) }
60
61    before :each do
62      session[:raphael] = user_session.key
63      allow(controller).to receive(:user_session).and_return(user_session)
64      delete :destroy, params: { id: "me" }
65    end
66
67    it { expect(session[:raphael]).to be_nil }
68
69    it { expect(user_session.reload.revoked_at).to_not be_nil }
70
71    it { expect(response).to redirect_to(root_path) }
72  end
73end