Files
manyfold/spec/requests/groups_spec.rb

185 lines
6.6 KiB
Ruby

require "rails_helper"
RSpec.describe "Groups", :after_first_run do
let(:owner) { create(:user) }
let(:creator) { create(:creator, owner: owner) }
context "when signed in as an owner of the creator" do
before do
sign_in owner
end
describe "GET /creators/{creator_id}/groups" do
before { create(:group, creator: creator) }
it "shows a group list for a creator" do
get "/creators/#{creator.to_param}/groups"
expect(response).to have_http_status :success
end
end
describe "GET /creators/{creator_id}/groups/new" do
it "shows new group form" do
get "/creators/#{creator.to_param}/groups/new"
expect(response).to have_http_status :success
end
end
describe "POST /creators/{creator_id}/groups" do
let(:user) { create(:user) }
let(:params) { {group: {name: "Group name", memberships_attributes: {"0" => {user_id: user.username}}}} }
it "creates new group" do
expect { post "/creators/#{creator.to_param}/groups", params: params }.to change(Group, :count).by(1)
end
it "sets name" do
post "/creators/#{creator.to_param}/groups", params: params
expect(Group.last.name).to eq "Group name"
end
it "adds members" do
post "/creators/#{creator.to_param}/groups", params: params
expect(Group.last.members).to include user
end
it "redirects to list" do
post "/creators/#{creator.to_param}/groups", params: params
expect(response).to redirect_to("/creators/#{creator.to_param}/groups")
end
it "gives a 422 response if the data is invalid" do
post "/creators/#{creator.to_param}/groups", params: {group: {name: nil}}
expect(response).to have_http_status :unprocessable_content
end
end
describe "GET /creators/{creator_id}/groups/{id}/edit" do
let(:group) { create(:group, creator: creator) }
it "shows group edit form" do
get "/creators/#{creator.to_param}/groups/#{group.to_param}/edit"
expect(response).to have_http_status :success
end
end
describe "PATCH /creators/{creator_id}/groups/{id}" do
let(:user) { create(:user) }
let(:group) { create(:group, creator: creator) }
let(:params) { {group: {name: "Group name", memberships_attributes: {"0" => {user_id: user.username}}}} }
it "redirects back to list" do
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: params
expect(response).to redirect_to("/creators/#{creator.to_param}/groups")
end
it "sets name" do
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: params
expect(group.reload.name).to eq "Group name"
end
it "adds members by username" do
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: params
expect(group.reload.members).to include(user)
end
it "cannot add members by ID (to avoid enumeration)" do
id_params = {group: {memberships_attributes: {"0" => {user_id: user.id}}}}
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: id_params
expect(group.reload.members).not_to include(user)
end
it "adds members by email" do
id_params = {group: {memberships_attributes: {"0" => {user_id: user.email}}}}
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: id_params
expect(group.reload.members).to include(user)
end
context "when inviting new members by email" do
let(:params) { {group: {memberships_attributes: {"0" => {user_id: "new_user@example.com"}}}} }
it "adds a new user" do
expect { patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: params }
.to change { group.reload.members.count }.from(0).to(1)
end
it "doesn't mail immediately" do
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: params
expect(group.members.first&.invitation_sent_at).to be_nil
end
end
it "adds members by fediverse address" do
allow(SiteSettings).to receive(:federation_enabled?).and_return(true)
id_params = {group: {memberships_attributes: {"0" => {user_id: user.federails_actor.at_address}}}}
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: id_params
expect(group.reload.members).to include(user)
end
it "doesn't add any members by fediverse address if federation is disabled" do
allow(SiteSettings).to receive(:federation_enabled?).and_return(false)
id_params = {group: {memberships_attributes: {"0" => {user_id: user.federails_actor.at_address}}}}
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: id_params
expect(group.reload.members).to be_empty
end
it "removes memberships" do
group.members << user
remove_params = {group: {memberships_attributes: {"0" => {id: group.memberships.last.id, _destroy: "1"}}}}
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: remove_params
expect(group.reload.members).not_to include(user)
end
it "gives a 422 response if the data is invalid" do
patch "/creators/#{creator.to_param}/groups/#{group.to_param}", params: {group: {name: " "}}
expect(response).to have_http_status :unprocessable_content
end
end
describe "DELETE /creators/{creator_id}/groups/{id}" do
let!(:group) { create(:group, creator: creator) }
it "removes group" do
expect {
delete "/creators/#{creator.to_param}/groups/#{group.to_param}"
}.to change(Group, :count).by(-1)
end
it "redirects to list" do
delete "/creators/#{creator.to_param}/groups/#{group.to_param}"
expect(response).to redirect_to "/creators/#{creator.to_param}/groups"
end
end
end
context "when signed in as a moderator" do
let(:group) { create(:group, creator: creator) }
before do
sign_in create :moderator
end
describe "GET /creators/{creator_id}/groups" do
it "shows a group list for a creator" do
get "/creators/#{creator.to_param}/groups"
expect(response).to have_http_status :success
end
end
end
context "when signed in as a member" do
let(:group) { create(:group, creator: creator) }
before do
sign_in create :user
end
describe "GET /creators/{creator_id}/groups" do
it "doesn't show group list" do
get "/creators/#{creator.to_param}/groups"
expect(response).to have_http_status :forbidden
end
end
end
end