From 12b14083cbfb84735a7c1b182b082a0a97a303fc Mon Sep 17 00:00:00 2001 From: Nate Date: Sat, 23 Jan 2016 19:59:12 -0500 Subject: [PATCH 1/2] green specs GroupMembershipsController --- .../group_memberships_controller.rb | 11 ++++ app/interactors/create_group_membership.rb | 24 +++++++ config/routes.rb | 1 + .../group_memberships_controller_spec.rb | 44 +++++++++++++ .../create_group_membership_spec.rb | 63 +++++++++++++++++++ 5 files changed, 143 insertions(+) create mode 100644 app/controllers/group_memberships_controller.rb create mode 100644 app/interactors/create_group_membership.rb create mode 100644 spec/controllers/group_memberships_controller_spec.rb create mode 100644 spec/interactors/create_group_membership_spec.rb diff --git a/app/controllers/group_memberships_controller.rb b/app/controllers/group_memberships_controller.rb new file mode 100644 index 0000000..3487f8e --- /dev/null +++ b/app/controllers/group_memberships_controller.rb @@ -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 diff --git a/app/interactors/create_group_membership.rb b/app/interactors/create_group_membership.rb new file mode 100644 index 0000000..6819dae --- /dev/null +++ b/app/interactors/create_group_membership.rb @@ -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 diff --git a/config/routes.rb b/config/routes.rb index 6574383..8293074 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,4 +4,5 @@ resources :users, except: [:new, :edit] resources :password_resets, only: [:create, :update] resources :groups, except: [:new, :edit] + resources :group_memberships, only: [:create] end diff --git a/spec/controllers/group_memberships_controller_spec.rb b/spec/controllers/group_memberships_controller_spec.rb new file mode 100644 index 0000000..4d53056 --- /dev/null +++ b/spec/controllers/group_memberships_controller_spec.rb @@ -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 diff --git a/spec/interactors/create_group_membership_spec.rb b/spec/interactors/create_group_membership_spec.rb new file mode 100644 index 0000000..48dfb74 --- /dev/null +++ b/spec/interactors/create_group_membership_spec.rb @@ -0,0 +1,63 @@ +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 + + From c5546cf38865e49fba12d24202b0944ab872c328 Mon Sep 17 00:00:00 2001 From: Nate Date: Sat, 23 Jan 2016 20:00:23 -0500 Subject: [PATCH 2/2] clean up per rubocop --- app/interactors/create_group_membership.rb | 2 +- spec/interactors/create_group_membership_spec.rb | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/interactors/create_group_membership.rb b/app/interactors/create_group_membership.rb index 6819dae..0780e21 100644 --- a/app/interactors/create_group_membership.rb +++ b/app/interactors/create_group_membership.rb @@ -5,7 +5,7 @@ def validate_input def execute context.membership = UserGroupMembership.create(user_id: context.user_id, - group_id: context.group_id) + group_id: context.group_id) end def validate_output diff --git a/spec/interactors/create_group_membership_spec.rb b/spec/interactors/create_group_membership_spec.rb index 48dfb74..739ab46 100644 --- a/spec/interactors/create_group_membership_spec.rb +++ b/spec/interactors/create_group_membership_spec.rb @@ -55,9 +55,6 @@ it "returns an error" do expect(subject.errors).to eq("invalid input") end - end end end - -