master
 1require "rails_helper"
 2
 3describe SessionsController do
 4  describe "#new" do
 5    context "when already logged in" do
 6      let(:user) { create(:user) }
 7
 8      it 'redirects to the dashboard' do
 9        http_login(user)
10        get :new
11        expect(response).to redirect_to(dashboard_path)
12      end
13    end
14
15    it 'loads a new user' do
16      get :new
17      expect(assigns(:user)).to be_new_record
18    end
19  end
20
21  describe "#create" do
22    let(:user) { create(:user, password: "password") }
23
24    context "when credentials are correct" do
25      it "logs you in with email" do
26        post :create, params: {
27          user: { username: user.email, password: "password" }
28        }
29        expect(session[:user_id]).to eql(UserSession.last.id)
30      end
31
32      it "logs you in with username" do
33        post :create, params: {
34          user: { username: user.username, password: "password" }
35        }
36        expect(session[:user_id]).to eql(UserSession.last.id)
37      end
38
39      it "redirects to the dashboard" do
40        post :create, params: {
41          user: { username: user.username, password: "password" }
42        }
43        expect(response).to redirect_to(dashboard_path)
44      end
45    end
46
47    context "when credentials are incorrect" do
48      it "displays errors" do
49        post :create, params: {
50          user: { username: user.username, password: "wrong" }
51        }
52        expect(flash[:warning]).to_not be_empty
53      end
54
55      it "redirects to the login page" do
56        post :create, params: {
57          user: { username: user.username, password: "wrong" }
58        }
59        expect(response).to redirect_to(new_session_path)
60      end
61    end
62  end
63
64  describe "#destroy" do
65    context "when logged in" do
66      let(:user) { create(:user) }
67      let(:user_session) { create(:active_session, user: user) }
68
69      it "logs you out" do
70        session[:user_id] = user_session.id
71
72        delete :destroy, params: { id: user.id }
73
74        expect(session[:user_id]).to be_nil
75        expect(user_session.reload.revoked_at).to be_present
76      end
77    end
78  end
79end