docbrown/spec/requests/chat_channel_memberships_spec.rb
Sarthak Sharma 3addb64326
[deploy] 🚀 Feature: Chat channel membership manager component (#8945)
* Feature 🚀 : Ability to delete messages in chat channels

- Sending message ID to frontend
- Deleting Message
- Use pusher to delete message realtime

* Minor Bug 🐞: Show message action only for current user

- User can delete or edit their own messages

* Test cases added

* Bug 🐞: Update message id for receiver

Message id was not sent to receiver by pusher

* Refactoring🛠: Message controller refactoring

* Test Cases📝 : Specs for Delete message added

* Feature 🚀 : Ability to edit messages

* Test Cases📝 : Specs for Edit message added

* Merge conflict resolved

* fix video content issue

* add UI for membership management

* add api to update memberahip role

* add methods for manage membership

* Add integration test cases

* add emoji for admin

* Open member profile in sidecar only

* 🐞 Problem with direct channel sidecar

* 🐞 Few other UI enhancements

* fix mod typo

* add limit upto 4 for display active memberships

* fix UI issues

* fix action ui for membership

* fix sidebar redirection issue

* fix svg buttons

* add test cases

* fixed broken spec

* fix PR suggestions

* remove not used code

* fix typo

* fix PR suggestion

* fix typos

* add invitation url expiry

* fix specs

* fix PR suggestions

* removed unused gem

* remove presenter format

* handle invitation link expiry with redis

* fix PR suggestions

* user can view non-discoverable channel invitation link

* fix typos

* remove commented code

* add spacing

* PR suggestions

* remove class from button

* replace componentDidMount with commen function

* remove action button for single membership

* add chat message on update role

* add spece between lines

Co-authored-by: Narender Singh <narender2031@gmail.com>
Co-authored-by: Fernando Valverde <fdov88@gmail.com>
2020-07-20 08:08:31 -04:00

459 lines
15 KiB
Ruby

require "rails_helper"
RSpec.describe "ChatChannelMemberships", type: :request do
let(:user) { create(:user) }
let(:second_user) { create(:user) }
let(:chat_channel) { create(:chat_channel) }
before do
sign_in user
chat_channel.add_users([user])
end
describe "GET /chat_channel_info" do
context "when chat channel membership role is mod" do
before do
user.add_role(:super_admin)
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: user.id)
get "/chat_channel_memberships/chat_channel_info/#{membership.id}", as: :json
end
it "return all details of chat channel" do
expect(response.status).to eq(200)
expect(response.parsed_body["result"].keys).to eq(%w[chat_channel memberships current_membership
invitation_link])
end
end
context "when membership role is member" do
before do
sign_in second_user
chat_channel.add_users([second_user])
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: second_user.id)
get "/chat_channel_memberships/chat_channel_info/#{membership.id}", as: :json
end
it "return only channel info and current membership" do
expect(response.status).to eq(200)
expect(response.parsed_body["result"].keys).to eq(%w[chat_channel memberships current_membership
invitation_link])
expect(response.parsed_body["result"]["memberships"]["pending"].length).to eq(0)
expect(response.parsed_body["result"]["memberships"]["requested"].length).to eq(0)
end
end
end
describe "POST/ Send Invitation fot chat channel" do
context "when chat channel membership role is mod" do
before do
user.add_role(:super_admin)
post "/chat_channel_memberships/create_membership_request", params: {
chat_channel_membership: {
invitation_usernames: second_user.username.to_s,
chat_channel_id: chat_channel.id
}
}
end
it "Send invitation to user" do
expect(response.status).to eq(200)
end
end
context "when chat channel membership role is member" do
before do
sign_in second_user
chat_channel.add_users([second_user])
post "/chat_channel_memberships/create_membership_request", params: {
chat_channel_membership: {
invitation_usernames: "test2031",
chat_channel_id: chat_channel.id
}
}
end
it "user not authorized" do
expect(response.status).to eq(401)
end
end
end
describe "POST/ remove_membership" do
context "when the user is super admin" do
it "remove the user from chat channel" do
allow(Pusher).to receive(:trigger).and_return(true)
user.add_role(:super_admin)
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: user.id)
post "/chat_channel_memberships/remove_membership", params: {
chat_channel_id: chat_channel.id,
membership_id: membership.id
}
expect(response.status).to eq(200)
expect(membership.reload.status).to eq("removed_from_channel")
end
end
context "when user is chat channel membership role is mod" do
it "remove the user from chat channel" do
allow(Pusher).to receive(:trigger).and_return(true)
membership = chat_channel.chat_channel_memberships.find_by(user_id: user.id)
membership.update(role: "mod")
post "/chat_channel_memberships/remove_membership", params: {
chat_channel_id: chat_channel.id,
membership_id: membership.id
}
expect(response.status).to eq(200)
expect(membership.reload.status).to eq("removed_from_channel")
end
end
context "when user chat channel membership role is member" do
it "user is not unauthorized" do
sign_in second_user
membership = ChatChannelMembership.last
post "/chat_channel_memberships/remove_membership", params: {
chat_channel_id: chat_channel.id,
membership_id: membership.id
}
expect(response.status).to eq(401)
end
end
end
describe "PUT /chat_channel_memberships/:id" do
before do
user.add_role(:super_admin)
post "/chat_channel_memberships/create_membership_request", params: {
chat_channel_membership: {
invitation_usernames: second_user.username.to_s,
chat_channel_id: chat_channel.id
}
}
end
context "when second user accept invitation" do
it "sets chat channl membership status to rejected" do
allow(Pusher).to receive(:trigger).and_return(true)
membership = ChatChannelMembership.last
sign_in second_user
put "/chat_channel_memberships/#{membership.id}", params: {
chat_channel_membership: {
user_action: "accept"
}
}
expect(ChatChannelMembership.find(membership.id).status).to eq("active")
expect(response).to(redirect_to(chat_channel_memberships_path))
end
end
context "when second user rejects invitation" do
it "sets chat channl membership status to rejected" do
allow(Pusher).to receive(:trigger).and_return(true)
membership = ChatChannelMembership.last
sign_in second_user
put "/chat_channel_memberships/#{membership.id}", params: {
chat_channel_membership: {
user_action: "reject"
}
}
expect(ChatChannelMembership.find(membership.id).status).to eq("rejected")
end
end
context "when user not logged in" do
it "unauthorized" do
membership = ChatChannelMembership.last
put "/chat_channel_memberships/#{membership.id}", params: {
chat_channel_membership: { user_action: "accept" }
}
expect(response.status).to eq(401)
end
end
end
describe "PATCH/ update_membership" do
context "when user is logged in" do
it "update the notification status" do
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: user.id)
membership.update(show_global_badge_notification: false)
patch "/chat_channel_memberships/update_membership/#{membership.id}", params: {
chat_channel_membership: {
show_global_badge_notification: true
}
}
expect(response.status).to eq(200)
expect(membership.reload.show_global_badge_notification).to eq(true)
end
end
context "when user is not logged in" do
it "not found membership" do
patch "/chat_channel_memberships/update_membership/", params: {
chat_channel_membership: {
show_global_badge_notification: true
}
}
expect(response.status).to eq(404)
end
end
end
describe "POST/ /leave_membership/:id" do
context "when user is logged in" do
it "leaves chat channel" do
allow(Pusher).to receive(:trigger).and_return(true)
chat_channel.add_users([second_user])
membership = ChatChannelMembership.last
sign_in second_user
patch "/chat_channel_memberships/leave_membership/#{membership.id}"
expect(response.status).to eq(200)
expect(membership.reload.status).to eq("left_channel")
end
end
context "when user is not logged in" do
it "unauthorized user" do
chat_channel.add_users([second_user])
membership = ChatChannelMembership.last
membership_status = membership.status
patch "/chat_channel_memberships/leave_membership/#{membership.id}"
expect(response.status).to eq(401)
expect(membership.reload.status).to eq(membership_status)
end
end
end
describe "GET /chat_channel_memberships/find_by_chat_channel_id" do
context "when user is logged in" do
before do
chat_channel.add_users([second_user])
end
it "returns chat channel membership details" do
sign_in second_user
get "/chat_channel_memberships/find_by_chat_channel_id", params: { chat_channel_id: chat_channel.id }
expected_keys = %w[id status chat_channel_id last_opened_at channel_text
channel_last_message_at channel_status channel_username
channel_type channel_name channel_image
channel_modified_slug channel_messages_count]
expect(response.parsed_body.keys).to(match_array(expected_keys))
end
end
context "when user is not logged in" do
it "renders not_found" do
get "/chat_channel_memberships/find_by_chat_channel_id", params: {}
expect(response.status).to eq(404)
end
end
end
describe "POST /chat_channel_memberships/add_membership" do
context "when user is moderator of channel" do
it "adds requested member to join closed channel" do
allow(Pusher).to receive(:trigger).and_return(true)
channel = ChatChannel.first
membership = ChatChannelMembership.last
membership.update(status: "joining_request")
membership.update(role: "mod")
post "/chat_channel_memberships/add_membership", params: {
membership_id: membership.id,
chat_channel_id: channel.id,
chat_channel_membership: {
user_action: "accept"
}
}
expect(ChatChannelMembership.find(membership.id).status).to eq("active")
expect(response).to(redirect_to(chat_channel_memberships_path))
end
end
context "when user is member of channel" do
it "User not authorize" do
channel = ChatChannel.first
membership = ChatChannelMembership.last
membership.update(status: "joining_request")
post "/chat_channel_memberships/add_membership", params: {
membership_id: membership.id,
chat_channel_id: channel.id,
chat_channel_membership: {
user_action: "accept"
}
}
expect(ChatChannelMembership.find(membership.id).status).to eq("joining_request")
expect(response.status).to eq(401)
end
end
end
describe "POST /join_chat_channel" do
let(:chat_channel_membership) do
{
chat_channel_id: chat_channel.id
}
end
before do
allow(Pusher).to receive(:trigger).and_return(true)
sign_in second_user
post "/join_chat_channel", params: { chat_channel_membership: chat_channel_membership }
end
context "when user was not member of closed channel" do
it "requested to join closed channel" do
expect(ChatChannelMembership.last.status).to eq("joining_request")
expect(response.status).to eq(200)
end
it "returns in json" do
expect(response.media_type).to eq("application/json")
end
end
context "when user was a member of channel, and than left channel" do
it "requested to join closed channel" do
ChatChannelMembership.create(chat_channel_id: chat_channel.id, user_id: second_user.id, status: "left_channel")
expect(ChatChannelMembership.last.status).to eq("joining_request")
expect(response.status).to eq(200)
end
it "returns in json" do
expect(response.media_type).to eq("application/json")
end
end
end
describe "PATCH /update_membership_role" do
before do
user.add_role(:super_admin)
chat_channel.add_users([second_user])
end
context "when user role is member" do
it "update the membership role to mod" do
allow(Pusher).to receive(:trigger).and_return(true)
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: second_user.id)
patch "/chat_channel_memberships/update_membership_role/#{chat_channel.id}", params: {
chat_channel_membership: {
membership_id: membership.id,
role: "mod"
}
}
expect(response.status).to eq(200)
expect(membership.reload.role).to eq("mod")
end
end
context "when user is mod" do
it "update the membership role to member" do
allow(Pusher).to receive(:trigger).and_return(true)
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: user.id)
patch "/chat_channel_memberships/update_membership_role/#{chat_channel.id}", params: {
chat_channel_membership: {
membership_id: membership.id,
role: "member"
}
}
expect(response.status).to eq(200)
expect(membership.reload.role).to eq("member")
end
end
context "when there is no channel id" do
it "channel not found" do
membership = ChatChannelMembership.find_by(chat_channel_id: chat_channel.id, user_id: second_user.id)
patch "/chat_channel_memberships/update_membership_role/", params: {
chat_channel_membership: {
membership_id: membership.id,
role: "member"
}
}
expect(response.status).to eq(404)
expect(membership.reload.role).to eq("member")
end
end
end
describe "GET /join_channel_invitation" do
context "when user is not member" do
it "render the page" do
allow(Pusher).to receive(:trigger).and_return(true)
sign_in second_user
chat_channel.update(discoverable: true)
get "/join_channel_invitation/#{chat_channel.slug}"
expect(response.status).to eq(200)
end
end
context "when user is not logged-in" do
it "not allowed to create membership" do
sign_out second_user
get "/join_channel_invitation/#{chat_channel.slug}"
expect(response.status).to eq(401)
end
end
end
describe "POST /joining_invitation_response" do
context "when user accept the request" do
it "will create membership" do
allow(Pusher).to receive(:trigger).and_return(true)
sign_in second_user
chat_channel.update(discoverable: true)
post "/joining_invitation_response", params: {
user_action: "accept",
chat_channel_id: chat_channel.id
}
membership = ChatChannelMembership.last
expect(response.status).to eq(302)
expect(membership.user_id).to eq(second_user.id)
end
end
context "when user decline the request" do
it "will not create the membership" do
sign_in second_user
chat_channel.update(discoverable: true)
post "/joining_invitation_response", params: {
user_action: "decline",
chat_channel_id: chat_channel.id
}
membership = ChatChannelMembership.last
expect(response.status).to eq(302)
expect(membership.user_id).not_to eq(second_user.id)
end
end
end
end