## Description Adds the account-level `unread_count_for_filters` feature flag as the dark-launch gate for filtered sidebar unread counts. This reuses the deprecated `quoted_email_reply` flag slot, resets the reused bit for existing accounts, and removes stale defaults so new accounts do not reference the old flag. This also adds the feature where we are now calculating the unread counts for built in filters like mentions, participating and unattended along with unread count for saved filters/folders. Closes [CW-7262](https://linear.app/chatwoot/issue/CW-7262/unread-counts-for-filters-folders) ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update
197 lines
8.4 KiB
Ruby
197 lines
8.4 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe 'Conversation Participants API', type: :request do
|
|
let(:account) { create(:account) }
|
|
let(:conversation) { create(:conversation, account: account) }
|
|
let(:agent) { create(:user, account: account, role: :agent) }
|
|
|
|
before do
|
|
create(:inbox_member, inbox: conversation.inbox, user: agent)
|
|
end
|
|
|
|
describe 'GET /api/v1/accounts/{account.id}/conversations/<id>/paricipants' do
|
|
context 'when it is an unauthenticated user' do
|
|
it 'returns unauthorized' do
|
|
get api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id)
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
|
|
context 'when it is an authenticated user with access to the conversation' do
|
|
let(:participant1) { create(:user, account: account, role: :agent) }
|
|
let(:participant2) { create(:user, account: account, role: :agent) }
|
|
|
|
before do
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant1)
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant2)
|
|
end
|
|
|
|
it 'returns all the partipants for the conversation' do
|
|
create(:conversation_participant, conversation: conversation, user: participant1)
|
|
create(:conversation_participant, conversation: conversation, user: participant2)
|
|
get api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(response).to have_http_status(:success)
|
|
expect(response.body).to include(participant1.email)
|
|
expect(response.body).to include(participant2.email)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'POST /api/v1/accounts/{account.id}/conversations/<id>/participants' do
|
|
context 'when it is an unauthenticated user' do
|
|
it 'returns unauthorized' do
|
|
post api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id)
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
|
|
context 'when it is an authenticated user' do
|
|
let(:participant) { create(:user, account: account, role: :agent) }
|
|
|
|
before do
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant)
|
|
end
|
|
|
|
it 'creates a new participants when its authorized agent' do
|
|
params = { user_ids: [participant.id] }
|
|
|
|
expect(conversation.conversation_participants.count).to eq(0)
|
|
post api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
params: params,
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(response).to have_http_status(:success)
|
|
expect(response.body).to include(participant.email)
|
|
expect(conversation.conversation_participants.count).to eq(1)
|
|
end
|
|
|
|
it 'notifies unread counts when a participant is added' do
|
|
account.enable_features!(:conversation_unread_counts, :unread_count_for_filters)
|
|
allow(Rails.configuration.dispatcher).to receive(:dispatch)
|
|
params = { user_ids: [participant.id] }
|
|
|
|
post api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
params: params,
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(Rails.configuration.dispatcher).to have_received(:dispatch).with(
|
|
'conversation.unread_count_changed',
|
|
kind_of(ActiveSupport::TimeWithZone),
|
|
conversation: conversation
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'PUT /api/v1/accounts/{account.id}/conversations/<id>/participants' do
|
|
context 'when it is an unauthenticated user' do
|
|
it 'returns unauthorized' do
|
|
put api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id)
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
|
|
context 'when it is an authenticated user' do
|
|
let(:participant) { create(:user, account: account, role: :agent) }
|
|
let(:participant_to_be_added) { create(:user, account: account, role: :agent) }
|
|
let(:participant_to_be_removed) { create(:user, account: account, role: :agent) }
|
|
|
|
before do
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant)
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant_to_be_added)
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant_to_be_removed)
|
|
end
|
|
|
|
it 'updates participants when its authorized agent' do
|
|
params = { user_ids: [participant.id, participant_to_be_added.id] }
|
|
create(:conversation_participant, conversation: conversation, user: participant)
|
|
create(:conversation_participant, conversation: conversation, user: participant_to_be_removed)
|
|
|
|
expect(conversation.conversation_participants.count).to eq(2)
|
|
put api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
params: params,
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(response).to have_http_status(:success)
|
|
expect(response.body).to include(participant.email)
|
|
expect(response.body).to include(participant_to_be_added.email)
|
|
expect(conversation.conversation_participants.count).to eq(2)
|
|
end
|
|
|
|
it 'notifies unread counts when participant membership changes' do
|
|
account.enable_features!(:conversation_unread_counts, :unread_count_for_filters)
|
|
allow(Rails.configuration.dispatcher).to receive(:dispatch)
|
|
params = { user_ids: [participant.id, participant_to_be_added.id] }
|
|
create(:conversation_participant, conversation: conversation, user: participant)
|
|
create(:conversation_participant, conversation: conversation, user: participant_to_be_removed)
|
|
|
|
put api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
params: params,
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(Rails.configuration.dispatcher).to have_received(:dispatch).with(
|
|
'conversation.unread_count_changed',
|
|
kind_of(ActiveSupport::TimeWithZone),
|
|
conversation: conversation
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'DELETE /api/v1/accounts/{account.id}/conversations/<id>/participants' do
|
|
context 'when it is an unauthenticated user' do
|
|
it 'returns unauthorized' do
|
|
delete api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id)
|
|
expect(response).to have_http_status(:unauthorized)
|
|
end
|
|
end
|
|
|
|
context 'when it is an authenticated user' do
|
|
let(:participant) { create(:user, account: account, role: :agent) }
|
|
|
|
before do
|
|
create(:inbox_member, inbox: conversation.inbox, user: participant)
|
|
end
|
|
|
|
it 'deletes participants when its authorized agent' do
|
|
params = { user_ids: [participant.id] }
|
|
create(:conversation_participant, conversation: conversation, user: participant)
|
|
|
|
expect(conversation.conversation_participants.count).to eq(1)
|
|
delete api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
params: params,
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(response).to have_http_status(:success)
|
|
expect(conversation.conversation_participants.count).to eq(0)
|
|
end
|
|
|
|
it 'notifies unread counts when a participant is removed' do
|
|
account.enable_features!(:conversation_unread_counts, :unread_count_for_filters)
|
|
allow(Rails.configuration.dispatcher).to receive(:dispatch)
|
|
params = { user_ids: [participant.id] }
|
|
create(:conversation_participant, conversation: conversation, user: participant)
|
|
|
|
delete api_v1_account_conversation_participants_url(account_id: account.id, conversation_id: conversation.display_id),
|
|
params: params,
|
|
headers: agent.create_new_auth_token,
|
|
as: :json
|
|
|
|
expect(Rails.configuration.dispatcher).to have_received(:dispatch).with(
|
|
'conversation.unread_count_changed',
|
|
kind_of(ActiveSupport::TimeWithZone),
|
|
conversation: conversation
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|