From 5e23e7604acc773bbb59af6576934790ddaaa744 Mon Sep 17 00:00:00 2001 From: David Swift Date: Wed, 22 Jan 2020 00:25:15 +0000 Subject: [PATCH 1/3] Add controller action for destroying a session --- apps/web/controllers/sessions/destroy.rb | 23 +++++++++++++++++++ spec/web/controllers/sessions/destroy_spec.rb | 21 +++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 apps/web/controllers/sessions/destroy.rb create mode 100644 spec/web/controllers/sessions/destroy_spec.rb diff --git a/apps/web/controllers/sessions/destroy.rb b/apps/web/controllers/sessions/destroy.rb new file mode 100644 index 0000000..e8b1047 --- /dev/null +++ b/apps/web/controllers/sessions/destroy.rb @@ -0,0 +1,23 @@ +module Web + module Controllers + module Sessions + class Destroy + include Web::Action + + prepend_before :skip_authentication! + + def call(_params) + process + end + + private + + def process + warden.logout + flash[:notice] = 'Successfully logged out' + redirect_to routes.root_path + end + end + end + end +end diff --git a/spec/web/controllers/sessions/destroy_spec.rb b/spec/web/controllers/sessions/destroy_spec.rb new file mode 100644 index 0000000..7b36706 --- /dev/null +++ b/spec/web/controllers/sessions/destroy_spec.rb @@ -0,0 +1,21 @@ +RSpec.describe Web::Controllers::Sessions::Destroy, type: :action do + let(:action) { described_class.new } + let(:response) { action.call(params) } + let(:params) { Hash[] } + let(:warden) { instance_double Warden::Proxy } + + before do + allow(action).to receive(:warden).and_return(warden) + allow(warden).to receive(:logout) + allow(warden).to receive(:user) + response + end + + it 'calls the `logout` method on warden' do + expect(warden).to have_received(:logout) + end + + it 'returns the correct response code' do + expect(response[0]).to eq 302 + end +end From c6f4db3b89e08e06eb56d12c4774070e0fd46e8e Mon Sep 17 00:00:00 2001 From: David Swift Date: Tue, 28 Jan 2020 10:47:14 +0000 Subject: [PATCH 2/3] Adds route for logout --- apps/web/config/routes.rb | 2 ++ spec/web/config/routes_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 spec/web/config/routes_spec.rb diff --git a/apps/web/config/routes.rb b/apps/web/config/routes.rb index d2fbbe3..546661c 100644 --- a/apps/web/config/routes.rb +++ b/apps/web/config/routes.rb @@ -4,3 +4,5 @@ resources :users, only: %i[new create] resources :sessions, only: %i[new create] + +delete 'sessions', as: 'logout' diff --git a/spec/web/config/routes_spec.rb b/spec/web/config/routes_spec.rb new file mode 100644 index 0000000..dbdea48 --- /dev/null +++ b/spec/web/config/routes_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +RSpec.describe Web.routes do + describe 'DELETE session' do + it 'has a generated path' do + generated_path = described_class.path(:logout) + + expect(generated_path).to eq('/sessions') + end + + it 'is a recognisable route' do + env = Rack::MockRequest.env_for('/sessions', method: 'DELETE') + route = described_class.recognize(env) + + expect(route).to be_routable + expect(route.path).to eq('/sessions') + expect(route.verb).to eq('DELETE') + end + end +end From 4ec5da848f6bcc8da70e88409e351fdf1ec5f2a3 Mon Sep 17 00:00:00 2001 From: David Swift Date: Sat, 22 Feb 2020 11:42:18 +0000 Subject: [PATCH 3/3] Move test variables into let blocks for readability --- spec/web/config/routes_spec.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spec/web/config/routes_spec.rb b/spec/web/config/routes_spec.rb index dbdea48..1ba8c27 100644 --- a/spec/web/config/routes_spec.rb +++ b/spec/web/config/routes_spec.rb @@ -2,16 +2,15 @@ RSpec.describe Web.routes do describe 'DELETE session' do - it 'has a generated path' do - generated_path = described_class.path(:logout) + let(:generated_path) { described_class.path(:logout) } + let(:env) { Rack::MockRequest.env_for('/sessions', method: 'DELETE') } + let(:route) { described_class.recognize(env) } + it 'has a generated path' do expect(generated_path).to eq('/sessions') end it 'is a recognisable route' do - env = Rack::MockRequest.env_for('/sessions', method: 'DELETE') - route = described_class.recognize(env) - expect(route).to be_routable expect(route.path).to eq('/sessions') expect(route.verb).to eq('DELETE')