Skip to content

Commit 68dfe29

Browse files
committed
Message opt-in: use policy for available participants; add policy spec; add request spec for participant list
1 parent 62e246b commit 68dfe29

File tree

3 files changed

+95
-12
lines changed

3 files changed

+95
-12
lines changed

app/controllers/better_together/conversations_controller.rb

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,8 @@ def leave_conversation # rubocop:todo Metrics/MethodLength, Metrics/AbcSize
147147
private
148148

149149
def available_participants
150-
participants = Person.all
151-
152-
unless helpers.current_person.permitted_to?('manage_platform')
153-
# only allow messaging platform mangers unless you are a platform_manager
154-
participants = participants.where(id: platform_manager_ids)
155-
end
156-
157-
participants
150+
# Delegate to policy to centralize participant permission logic
151+
ConversationPolicy.new(helpers.current_user, Conversation.new).permitted_participants
158152
end
159153

160154
def conversation_params
@@ -178,9 +172,6 @@ def set_conversations
178172
]).order(updated_at: :desc).distinct(:id)
179173
end
180174

181-
def platform_manager_ids
182-
role = BetterTogether::Role.find_by(identifier: 'platform_manager')
183-
BetterTogether::PersonPlatformMembership.where(role_id: role.id).pluck(:member_id)
184-
end
175+
# platform_manager_ids now inferred by policy; kept here only if needed elsewhere
185176
end
186177
end
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe BetterTogether::ConversationPolicy, type: :policy do
6+
include RequestSpecHelper
7+
8+
let!(:host_platform) { configure_host_platform }
9+
10+
let!(:manager_user) { create(:user, :confirmed, :platform_manager, password: 'password12345') }
11+
let!(:manager_person) { manager_user.person }
12+
13+
let!(:opted_in_person) do
14+
create(:better_together_person, preferences: { receive_messages_from_members: true })
15+
end
16+
17+
let!(:non_opted_person) { create(:better_together_person) }
18+
19+
describe '#permitted_participants' do
20+
context 'when agent is a platform manager' do
21+
it 'includes all people' do
22+
policy = described_class.new(manager_user, BetterTogether::Conversation.new)
23+
ids = policy.permitted_participants.pluck(:id)
24+
expect(ids).to include(manager_person.id, opted_in_person.id, non_opted_person.id)
25+
end
26+
end
27+
28+
context 'when agent is a regular member' do
29+
let!(:regular_user) { create(:user, :confirmed, password: 'password12345') }
30+
31+
it 'includes platform managers and opted-in members, but not non-opted members' do
32+
policy = described_class.new(regular_user, BetterTogether::Conversation.new)
33+
people = policy.permitted_participants
34+
expect(people).to include(manager_person, opted_in_person)
35+
expect(people).not_to include(non_opted_person)
36+
end
37+
end
38+
end
39+
end
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'BetterTogether::Conversations' do
6+
include RequestSpecHelper
7+
8+
before do
9+
configure_host_platform
10+
end
11+
12+
let!(:manager_user) do
13+
create(:user, :confirmed, :platform_manager, email: '[email protected]', password: 'password12345')
14+
end
15+
let!(:opted_in_person) do
16+
create(:better_together_person, preferences: { receive_messages_from_members: true }, name: 'Opted In User')
17+
end
18+
let!(:non_opted_person) { create(:better_together_person, name: 'Non Opted User') }
19+
20+
describe 'GET /conversations/new' do
21+
context 'as a regular member' do
22+
let!(:regular_user) { create(:user, :confirmed, email: '[email protected]', password: 'password12345') }
23+
24+
before do
25+
login(regular_user.email, 'password12345')
26+
end
27+
28+
it 'lists platform managers and opted-in members, but excludes non-opted members' do
29+
get better_together.new_conversation_path(locale: I18n.default_locale)
30+
expect(response).to have_http_status(:ok)
31+
# Includes manager and opted-in person in the select options
32+
expect(response.body).to include(manager_user.person.name)
33+
expect(response.body).to include('Opted In User')
34+
# Excludes non-opted person
35+
expect(response.body).not_to include('Non Opted User')
36+
end
37+
end
38+
39+
context 'as a platform manager' do
40+
before do
41+
login(manager_user.email, 'password12345')
42+
end
43+
44+
it 'lists all people as available participants' do
45+
get better_together.new_conversation_path(locale: I18n.default_locale)
46+
expect(response).to have_http_status(:ok)
47+
expect(response.body).to include(manager_user.person.name)
48+
expect(response.body).to include('Opted In User')
49+
expect(response.body).to include('Non Opted User')
50+
end
51+
end
52+
end
53+
end

0 commit comments

Comments
 (0)