Skip to content

Commit 4f9b856

Browse files
committed
Write multiple Controller tests to check logic
This has been educational! I've added four tests to check for how the controller processes the member search journey. I'm happy with where it's got to, and it's meant I've had a chance to clarify my controller code.
1 parent aad0943 commit 4f9b856

File tree

4 files changed

+68
-15
lines changed

4 files changed

+68
-15
lines changed
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
class Admin::MemberSearchController < Admin::ApplicationController
22
def index
3-
@params = params[:member_search] || {}
4-
@name = @params[:name]
5-
@members = @name.blank? ? Member.none : Member.find_members(@name).select(:id, :name, :surname, :pronouns)
6-
@callback_url = @params[:callback] || results_admin_member_search_index_path
7-
if (@members.size == 1) && @callback_url.present?
8-
query = { member_pick: { members: [@members.pluck(:id)] } }
3+
member_params = params[:member_search] || {}
4+
name = member_params[:name]
5+
@members = name.blank? ? Member.none : Member.find_members(name).select(:id, :name, :surname, :pronouns)
6+
@callback_url = member_params[:callback_url] || params[:callback_url] || results_admin_member_search_index_path
7+
if @members.size == 1
8+
query = { member_pick: { members: [@members.first.id] } }
99
query_string = query.to_query
10-
@callback_url = "#{@callback_url}?#{query_string}"
11-
redirect_to @callback_url and return
10+
callback_url = "#{@callback_url}?#{query_string}"
11+
redirect_to callback_url and return
1212
end
1313

14-
render 'index', locals: { members: @members, callback: @callback_url }
14+
render 'index', locals: { members: @members, callback_url: @callback_url }
1515
end
1616

1717
def results
1818
@members = Member.find(params[:member_pick][:members])
19-
render 'show', locals: { members: @members }
19+
render 'show', members: @members
2020
end
2121
end

app/views/admin/member_search/index.html.haml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,3 @@
2020
= f.check_box :members, { multiple: true, checked: member.id }, member.id, nil
2121
= f.label "member_#{member.id}", member.name_and_surname, class: 'form-check-label'
2222
= f.button :submit, 'Take me back', class: 'btn btn-primary mt-3', name: nil
23-
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
RSpec.describe Admin::MemberSearchController, type: :controller do
2+
let(:member) {Fabricate.build(:member)}
3+
4+
describe 'GET #index' do
5+
context "when user is not logged in" do
6+
before do
7+
get :index
8+
end
9+
it "redirects to the home page" do
10+
expect(response).to redirect_to(root_path)
11+
end
12+
end
13+
14+
context "when user is an admin" do
15+
let(:fake_relation) { instance_double('ActiveRecord::Relation') }
16+
let(:fake_juliet) { instance_double('Member', id: 1, name: 'Juliet', surname: 'Montague') }
17+
18+
before do
19+
login_as_admin(member)
20+
get :index
21+
end
22+
it "shows user the search page" do
23+
expect(response).to have_http_status(:ok)
24+
end
25+
26+
context "and when admin user searches for a single existing user" do
27+
before do
28+
allow(Member).to receive(:find_members).with('Juliet').and_return(fake_relation)
29+
allow(fake_relation).to receive(:select).with(any_args).and_return([fake_juliet])
30+
get :index, params: {member_search: {name: "Juliet", callback_url: root_path}}
31+
end
32+
it "redirects to the calling service" do
33+
expect(response).to have_http_status(:found)
34+
35+
uri = URI.parse(response.location)
36+
redirect_params = Rack::Utils.parse_nested_query(uri.query)
37+
38+
expect(redirect_params["member_pick"]["members"]).to eq(["1"])
39+
end
40+
end
41+
42+
context "and when an admin user searches and there are multiple results" do
43+
let(:fake_romeo) { double('Member', id: 2, name: 'Romeo', surname: 'Capulet')}
44+
45+
before do
46+
allow(Member).to receive(:find_members).with('e').and_return(fake_relation)
47+
allow(fake_relation).to receive(:select).with(any_args).and_return([fake_juliet, fake_romeo])
48+
get :index, params: {member_search: {name: 'e', callback_url: root_path}}
49+
end
50+
it "presents the found members on the index page" do
51+
expect(response).to have_http_status(:ok)
52+
end
53+
end
54+
end
55+
end
56+
end
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
require 'spec_helper'
2-
31
RSpec.feature 'admin member search', type: :feature do
42
scenario 'search returns single member to requesting service' do
53
Fabricate(:member, :name => 'Romeo', :surname => 'Montague')
64
Fabricate(:member, :name => 'Juliet', :surname => 'Capulet')
75
member = Fabricate(:member)
86
login_as_admin(member)
9-
visit admin_member_search_index_path(callback: results_admin_member_search_index_path)
7+
visit admin_member_search_index_path(callback_url: results_admin_member_search_index_path)
108

119
fill_in 'member_search_name', with: 'Julie'
1210
click_button 'Search'
@@ -17,4 +15,4 @@
1715
end
1816

1917

20-
end
18+
end

0 commit comments

Comments
 (0)