Skip to content

Commit

Permalink
merge group-memberships-controller
Browse files Browse the repository at this point in the history
  • Loading branch information
npauzenga committed Jan 30, 2016
2 parents 33f0e74 + c5546cf commit 76edd06
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 0 deletions.
11 changes: 11 additions & 0 deletions app/controllers/group_memberships_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class GroupMembershipsController < AuthenticationController
def create
result = CreateGroupMembership.call(user_id: current_user.id,
group_id: params[:group_id])
if result.success?
head :no_content
else
render json: result.errors, status: :internal_server_error
end
end
end
24 changes: 24 additions & 0 deletions app/interactors/create_group_membership.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
class CreateGroupMembership < StandardInteraction
def validate_input
context.fail!(errors: "invalid input") unless valid_input?
end

def execute
context.membership = UserGroupMembership.create(user_id: context.user_id,
group_id: context.group_id)
end

def validate_output
context.fail!(errors: context.membership.errors) unless membership_saved?
end

private

def valid_input?
context.user_id && context.group_id
end

def membership_saved?
context.membership.persisted?
end
end
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
resources :password_resets, only: [:create, :update]
resources :groups, except: [:new, :edit]
resources :profiles, only: [:show, :index]
resources :group_memberships, only: [:create]
end
44 changes: 44 additions & 0 deletions spec/controllers/group_memberships_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
RSpec.describe GroupMembershipsController do
describe "POST #create" do
let(:user) { create(:confirmed_user) }
let(:group) { create(:group) }
let(:params) { { id: group.id } }
let(:arguments) { { user_id: user.id, group_id: params[:group_id] } }
let(:context) { double(:context, success?: true) }

before(:example) do
authenticate

allow(CreateGroupMembership).to receive(:call).with(arguments).
and_return(context)

allow(context).to receive(:errors).and_return(["join failed"])
end

it "calls CreatePasswordResetOrganizer" do
expect(CreateGroupMembership).to receive(:call)
post :create, params
end

context "when successful" do
it "returns HTTP status 204" do
post :create, params
expect(response).to have_http_status(204)
end
end

context "when unsuccessful" do
let(:context) { double(:context, success?: false) }

it "returns HTTP status 500" do
post :create, params
expect(response).to have_http_status(500)
end

it "renders an error" do
post :create, params
expect(json).to eq(["join failed"])
end
end
end
end
60 changes: 60 additions & 0 deletions spec/interactors/create_group_membership_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
RSpec.describe CreateGroupMembership do
describe ".call" do
let(:user) { create(:confirmed_user) }
let(:group) { create(:group) }

subject do
described_class.call(user_id: user.id, group_id: group.id)
end

context "when successful" do
it "returns a successful context" do
is_expected.to be_a_success
end

it "creates a new UserGroupMembership" do
subject
expect(user.groups.first).to eq(group)
end
end

context "when UserGroupMembership is not persisted" do
before do
allow_any_instance_of(UserGroupMembership).to receive(:persisted?).
and_return(false)
end

it "fails" do
is_expected.to be_a_failure
end
end

context "when user_id is not provided" do
subject do
described_class.call(group_id: group.id)
end

it "fails" do
is_expected.to be_a_failure
end

it "returns an error" do
expect(subject.errors).to eq("invalid input")
end
end

context "when group_id is not provided" do
subject do
described_class.call(user_id: user.id)
end

it "fails" do
is_expected.to be_a_failure
end

it "returns an error" do
expect(subject.errors).to eq("invalid input")
end
end
end
end

0 comments on commit 76edd06

Please sign in to comment.