From 1a00b5303473bd8d107c0f197befaeec27c5feef Mon Sep 17 00:00:00 2001 From: zmagod Date: Thu, 14 Sep 2017 13:11:19 +0200 Subject: [PATCH] adds user_team tests --- app/services/client_api/teams_service.rb | 1 + app/services/client_api/user_team_service.rb | 11 +-- .../client_api/teams/teams_controller_spec.rb | 13 ++- .../users/user_teams_controller_spec.rb | 74 ++++++++++++--- .../client_api/user_team_service_spec.rb | 89 ++++++++++++++++++- 5 files changed, 163 insertions(+), 25 deletions(-) diff --git a/app/services/client_api/teams_service.rb b/app/services/client_api/teams_service.rb index a6aabcc53..e62dbd226 100644 --- a/app/services/client_api/teams_service.rb +++ b/app/services/client_api/teams_service.rb @@ -25,6 +25,7 @@ module ClientApi end def update_team! + raise ClientApi::CustomTeamError unless @params return if @team.update_attributes(@params) raise ClientApi::CustomTeamError, @team.errors.full_messages end diff --git a/app/services/client_api/user_team_service.rb b/app/services/client_api/user_team_service.rb index d101a331e..80c98e2b3 100644 --- a/app/services/client_api/user_team_service.rb +++ b/app/services/client_api/user_team_service.rb @@ -12,8 +12,7 @@ module ClientApi end def destroy_user_team_and_assign_new_team_owner! - binding.pry - raise ClientApi::CustomUserTeamError unless user_cant_leave? + raise ClientApi::CustomUserTeamError if user_cant_leave? new_owner = @team.user_teams .where(role: 2) .where.not(id: @user_team.id) @@ -25,6 +24,7 @@ module ClientApi end def update_role! + raise ClientApi::CustomUserTeamError if user_cant_leave? unless @role raise ClientApi::CustomUserTeamError, I18n.t('client_api.generic_error_message') @@ -59,7 +59,7 @@ module ClientApi end def user_cant_leave? - @user.teams.includes(@team) && + @user.teams.include?(@team) && @user_team.admin? && @team.user_teams.where(role: 2).count <= 1 end @@ -74,8 +74,9 @@ module ClientApi end def validate_params(args) - params = %i(team_id user_team_id user) - raise ClientApi::CustomUserTeamError unless params.all? { |s| args.key? s } + keys = %i(team_id user_team_id user) + raise ClientApi::CustomUserTeamError unless keys.all? { |s| args.key? s } + raise ClientApi::CustomUserTeamError if args.values.any? &:nil? team_id = args.fetch(:team_id) user_team_id = args.fetch(:user_team_id) user = args.fetch(:user) diff --git a/spec/controllers/client_api/teams/teams_controller_spec.rb b/spec/controllers/client_api/teams/teams_controller_spec.rb index 1afba1e85..099ee01bd 100644 --- a/spec/controllers/client_api/teams/teams_controller_spec.rb +++ b/spec/controllers/client_api/teams/teams_controller_spec.rb @@ -66,17 +66,22 @@ describe ClientApi::Teams::TeamsController, type: :controller do end it 'should return HTTP success response' do - post :change_team, - params: { team_id: @team_two.id, description: 'My description' }, + user_team + post :update, + params: { team_id: @team_two.id, + team: { description: 'My description' } }, as: :json expect(response).to have_http_status(:ok) end it 'should return HTTP unprocessable_entity response iput not valid' do - post :change_team, + user_team + post :update, params: { team_id: @team_two.id, - description: "super long: #{'a' * Constants::TEXT_MAX_LENGTH}" + team: { + description: "super long: #{'a' * Constants::TEXT_MAX_LENGTH}" + } }, as: :json expect(response).to have_http_status(:unprocessable_entity) diff --git a/spec/controllers/client_api/users/user_teams_controller_spec.rb b/spec/controllers/client_api/users/user_teams_controller_spec.rb index 10b683b2d..6e9fccea7 100644 --- a/spec/controllers/client_api/users/user_teams_controller_spec.rb +++ b/spec/controllers/client_api/users/user_teams_controller_spec.rb @@ -1,24 +1,27 @@ require 'rails_helper' describe ClientApi::Users::UserTeamsController, type: :controller do - describe 'DELETE #leave_team' do - login_user - before do - @user_one = User.first - @user_two = FactoryGirl.create(:user, email: 'sec_user@asdf.com') - @team = FactoryGirl.create :team - FactoryGirl.create :user_team, team: @team, user: @user_one, role: 2 - end + login_user + let(:user_one) { User.first } + let(:user_two) { create :user, email: Faker::Internet.email } + let(:team) { create :team } + let(:user_team) { create :user_team, team: team, user: user_one } + describe 'DELETE #leave_team' do it 'should return HTTP success if user can leave the team' do - FactoryGirl.create :user_team, team: @team, user: @user_two, role: 2 - delete :leave_team, params: { team: @team.id }, format: :json + create :user_team, team: team, user: user_two + delete :leave_team, + params: { team: team.id, user_team: user_team.id }, + format: :json expect(response).to be_success expect(response).to have_http_status(:ok) end - it 'should return HTTP unprocessable_entity if user can\'t leave the team' do - delete :leave_team, params: { team: @team.id }, format: :json + it 'should return HTTP unprocessable_entity if user can\'t ' \ + 'leave the team' do + delete :leave_team, + params: { team: team.id, user_team: user_team.id }, + format: :json expect(response).to_not be_success expect(response).to have_http_status(:unprocessable_entity) end @@ -29,4 +32,51 @@ describe ClientApi::Users::UserTeamsController, type: :controller do expect(response).to have_http_status(:unprocessable_entity) end end + + describe 'POST #update_role' do + it 'should return HTTP success if user can leave the team' do + user_team_two = create :user_team, team: team, user: user_two, role: 2 + post :update_role, + params: { team: team.id, + user_team: user_team_two.id, + role: 'normal_user' }, + format: :json + expect(response).to be_success + expect(response).to have_http_status(:ok) + end + + it 'should return HTTP unprocessable_entity if user can\'t ' \ + 'leave the team' do + post :update_role, + params: { team: team.id, + user_team: user_team.id, + role: 'normal_user' }, + format: :json + expect(response).to_not be_success + expect(response).to have_http_status(:unprocessable_entity) + end + end + + describe 'DELETE #remove_user' do + it 'should return HTTP success if user can be removed' do + user_team + user_team_two = create :user_team, team: team, user: user_two + post :remove_user, + params: { team: team.id, user_team: user_team_two.id }, + format: :json + expect(response).to be_success + expect(response).to have_http_status(:ok) + end + + it 'should return HTTP unprocessable_entity if user can\'t ' \ + 'be removed' do + post :remove_user, + params: { team: team.id, + user_team: user_team.id, + role: 'normal_user' }, + format: :json + expect(response).to_not be_success + expect(response).to have_http_status(:unprocessable_entity) + end + end end diff --git a/spec/services/client_api/user_team_service_spec.rb b/spec/services/client_api/user_team_service_spec.rb index d6d87cf11..20ba3d102 100644 --- a/spec/services/client_api/user_team_service_spec.rb +++ b/spec/services/client_api/user_team_service_spec.rb @@ -3,6 +3,7 @@ require 'rails_helper' describe ClientApi::UserTeamService do let(:team_one) { create :team } let(:user_one) { create :user, email: Faker::Internet.email } + let(:user_two) { create :user, email: Faker::Internet.email } let(:user_team) { create :user_team, user: user_one, team: team_one } it 'should raise ClientApi::CustomUserTeamError if user is not assigned' do @@ -28,8 +29,6 @@ describe ClientApi::UserTeamService do end describe '#destroy_user_team_and_assign_new_team_owner!' do - let(:user_two) { create :user, email: Faker::Internet.email } - it 'should raise ClientApi::CustomUserTeamError if user ' \ 'can\'t leave the team' do ut_service = ClientApi::UserTeamService.new( @@ -43,14 +42,96 @@ describe ClientApi::UserTeamService do end it 'should destroy the user_team relation' do + create :user_team, team: team_one, user: user_one new_user_team = create :user_team, team: team_one, user: user_two ut_service = ClientApi::UserTeamService.new( team_id: team_one.id, user_team_id: new_user_team.id, - user: user_two + user: user_one ) ut_service.destroy_user_team_and_assign_new_team_owner! - expect(new_user_team).to_not exist + expect(team_one.users).to_not include user_two + end + + it 'should assign a new owner to the team' do + user_team_one = create :user_team, team: team_one, user: user_one + create :user_team, team: team_one, user: user_two + ut_service = ClientApi::UserTeamService.new( + team_id: team_one.id, + user_team_id: user_team_one.id, + user: user_one + ) + ut_service.destroy_user_team_and_assign_new_team_owner! + expect(team_one.users).to include user_two + end + end + + describe '#update_role!' do + it 'should raise ClientApi::CustomUserTeamError if no role is set' do + create :user_team, team: team_one, user: user_one + ut_service = ClientApi::UserTeamService.new( + user: user_one, + team_id: team_one.id, + user_team_id: user_team.id + ) + expect { + ut_service.update_role! + }.to raise_error(ClientApi::CustomUserTeamError) + end + + it 'should update user role' do + create :user_team, team: team_one, user: user_two + user_team = create :user_team, team: team_one, user: user_one + ut_service = ClientApi::UserTeamService.new( + user: user_one, + team_id: team_one.id, + user_team_id: user_team.id, + role: 1 + ) + ut_service.update_role! + user_team.reload + expect(user_team.role).to eq 'normal_user' + end + + it 'should raise ClientApi::CustomUserTeamError if is the last ' \ + 'admin on the team' do + user_team = create :user_team, team: team_one, user: user_one + ut_service = ClientApi::UserTeamService.new( + user: user_one, + team_id: team_one.id, + user_team_id: user_team.id, + role: 1 + ) + expect { + ut_service.update_role! + }.to raise_error(ClientApi::CustomUserTeamError) + end + end + + describe '#team_users_data' do + it 'should return a hash of team members' do + user_team = create :user_team, team: team_one, user: user_one + ut_service = ClientApi::UserTeamService.new( + user: user_one, + team_id: team_one.id, + user_team_id: user_team.id, + role: 1 + ) + expect(ut_service.team_users_data.fetch(:team_users)).to include user_team + end + end + + describe '#teams_data' do + it 'should return a list of teams where user is a member' do + user_team = create :user_team, team: team_one, user: user_one + ut_service = ClientApi::UserTeamService.new( + user: user_one, + team_id: team_one.id, + user_team_id: user_team.id, + role: 1 + ) + team_id = ut_service.teams_data[:teams].first.fetch('id') + expect(team_id).to eq team_one.id end end end