From c358f8fa0ca07ad5b64cc787db157c7cede408c7 Mon Sep 17 00:00:00 2001 From: mlorb Date: Thu, 28 Sep 2017 14:49:33 +0200 Subject: [PATCH] write unit tests for invite users --- Gemfile | 1 + Gemfile.lock | 5 + .../users/invitations_controller.rb | 4 +- .../client_api/invitations_service.rb | 8 +- package.json | 2 +- .../users/invitations_controller_spec.rb | 40 +++++ .../client_api/invitations_service_spec.rb | 138 ++++++++++++++++++ yarn.lock | 6 +- 8 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 spec/controllers/client_api/users/invitations_controller_spec.rb create mode 100644 spec/services/client_api/invitations_service_spec.rb diff --git a/Gemfile b/Gemfile index 14a76b849..9fa139fa9 100644 --- a/Gemfile +++ b/Gemfile @@ -90,6 +90,7 @@ group :development, :test do gem 'pry-byebug' gem 'pry-rails' gem 'factory_girl_rails' + gem 'rails-controller-testing' gem 'rspec-rails' gem 'better_errors' gem 'binding_of_caller' diff --git a/Gemfile.lock b/Gemfile.lock index ec7e69440..322b083bd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -318,6 +318,10 @@ GEM bundler (>= 1.3.0, < 2.0) railties (= 5.1.1) sprockets-rails (>= 2.0.0) + rails-controller-testing (1.0.2) + actionpack (~> 5.x, >= 5.0.1) + actionview (~> 5.x, >= 5.0.1) + activesupport (~> 5.x) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) @@ -525,6 +529,7 @@ DEPENDENCIES pry-rails puma rails (= 5.1.1) + rails-controller-testing rails_12factor rails_autolink (~> 1.1, >= 1.1.6) recaptcha diff --git a/app/controllers/client_api/users/invitations_controller.rb b/app/controllers/client_api/users/invitations_controller.rb index 7765cf609..21636fa71 100644 --- a/app/controllers/client_api/users/invitations_controller.rb +++ b/app/controllers/client_api/users/invitations_controller.rb @@ -13,6 +13,8 @@ module ClientApi success_response(invite_results) end + private + def success_response(invite_results) respond_to do |format| format.json do @@ -23,8 +25,6 @@ module ClientApi end end - private - def check_invite_users_permission @team = Team.find_by_id(params[:team_id]) if @team && !is_admin_of_team(@team) diff --git a/app/services/client_api/invitations_service.rb b/app/services/client_api/invitations_service.rb index 3c710fbd4..add12bd12 100644 --- a/app/services/client_api/invitations_service.rb +++ b/app/services/client_api/invitations_service.rb @@ -5,15 +5,15 @@ module ClientApi def initialize(args) @user = args[:user] - @emails = args[:emails].map(&:downcase) + @emails = args[:emails] @team = args[:team] @role = args[:role] - raise ClientApi::CustomInvitationsError unless @team && @role && - @emails && @emails.present? - if @role && !UserTeam.roles.keys.include?(@role) + unless @role && UserTeam.roles.keys.include?(@role) && + @emails && @emails.present? raise ClientApi::CustomInvitationsError end + @emails = @emails.map(&:downcase) end def invitation diff --git a/package.json b/package.json index 8f15e51df..dd89a39d0 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "eslint-plugin-jsx-a11y": "^6.0.2", "eslint-plugin-prettier": "^2.1.2", "eslint-plugin-react": "^7.1.0", - "prettier": "^1.5.3", + "prettier": "^1.7.0", "webpack-dev-server": "^2.5.1" }, "dependencies": { diff --git a/spec/controllers/client_api/users/invitations_controller_spec.rb b/spec/controllers/client_api/users/invitations_controller_spec.rb new file mode 100644 index 000000000..7270d9eb5 --- /dev/null +++ b/spec/controllers/client_api/users/invitations_controller_spec.rb @@ -0,0 +1,40 @@ +require 'rails_helper' + +describe ClientApi::Users::InvitationsController, type: :controller do + login_user + let(:user_one) { User.first } + let(:team_one) { create :team } + let(:emails_one) { Array.new(3) { Faker::Internet.email } } + + describe '#invite_users' do + it 'returns HTTP success if users were invited' do + post :invite_users, params: { user_role: 'normal_user', + emails: emails_one }, + format: :json + expect(response).to be_success + expect(response).to have_http_status(:ok) + expect(response).to render_template('client_api/users/invite_users') + end + + it 'returns HTTP success if users were invited to team' do + create :user_team, team: team_one, user: user_one + post :invite_users, params: { team_id: team_one.id, + user_role: 'normal_user', + emails: emails_one }, + format: :json + expect(response).to be_success + expect(response).to have_http_status(:ok) + expect(response).to render_template('client_api/users/invite_users') + end + + it 'returns HTTP unprocessable_entity if users can\'t be invited to team' do + post :invite_users, params: { team_id: team_one.id, + user_role: 'normal_user', + emails: emails_one }, + format: :json + expect(response).to_not be_success + expect(response).to have_http_status(:unprocessable_entity) + expect(response.content_type).to eq 'application/json' + end + end +end diff --git a/spec/services/client_api/invitations_service_spec.rb b/spec/services/client_api/invitations_service_spec.rb new file mode 100644 index 000000000..ddeea4c9c --- /dev/null +++ b/spec/services/client_api/invitations_service_spec.rb @@ -0,0 +1,138 @@ +require 'rails_helper' + +describe ClientApi::InvitationsService do + let(:team_one) { create :team } + let(:user_one) { create :user, email: Faker::Internet.email } + let(:emails_one) { Array.new(3) { Faker::Internet.email } } + + it 'raises an ClientApi::CustomInvitationsError if ' \ + 'role is not assigned' do + expect { + ClientApi::InvitationsService.new(user: user_one, + team: team_one, + emails: emails_one) + }.to raise_error(ClientApi::CustomInvitationsError) + end + + it 'raises an ClientApi::CustomInvitationsError if ' \ + 'emails are not assigned' do + expect { + ClientApi::InvitationsService.new(user: user_one, + team: team_one, + role: 'normal_user') + }.to raise_error(ClientApi::CustomInvitationsError) + end + + it 'raises an ClientApi::CustomInvitationsError if ' \ + 'emails are not present' do + expect { + ClientApi::InvitationsService.new(user: user_one, + team: team_one, + role: 'normal_user', + emails: []) + }.to raise_error(ClientApi::CustomInvitationsError) + end + + it 'raises an ClientApi::CustomInvitationsError if ' \ + 'role is not included in UserTeam.roles' do + expect { + ClientApi::InvitationsService.new(user: user_one, + team: team_one, + role: 'abnormal_user', + emails: emails_one) + }.to raise_error(ClientApi::CustomInvitationsError) + end + + describe '#invitation' do + it 'returns too many emails response if invite users limit is exceeded' do + emails_exceeded = Array.new(Constants::INVITE_USERS_LIMIT + 1) do + Faker::Internet.email + end + invitation_service = ClientApi::InvitationsService.new( + user: user_one, + team: team_one, + role: 'normal_user', + emails: emails_exceeded + ) + result = invitation_service.invitation + expect(result.last[:status]).to eq :too_many_emails + expect(result.count).to eq Constants::INVITE_USERS_LIMIT + 1 + end + + context 'when user is new' do + it 'returns invalid response if invited user is not valid' do + invitation_service = ClientApi::InvitationsService.new( + user: user_one, + role: 'normal_user', + emails: ['banana.man'] + ) + result_status = invitation_service.invitation.last[:status] + expect(result_status).to eq :user_invalid + end + + it 'invites new user' do + invitation_service = ClientApi::InvitationsService.new( + user: user_one, + role: 'normal_user', + emails: ['new@banana.net'] + ) + result = invitation_service.invitation + expect(result.last[:status]).to eq :user_created + # test functions result + expect(result.last[:user].email).to eq 'new@banana.net' + expect(result.last[:user].invited_by).to eq user_one + # test in database + expect(User.last.email).to eq 'new@banana.net' + expect(User.last.invited_by).to eq user_one + end + + it 'creates user-team relation and notification if team present' do + invitation_service = ClientApi::InvitationsService.new( + user: user_one, + team: team_one, + role: 'normal_user', + emails: ['new@banana.net'] + ) + result_status = invitation_service.invitation.last[:status] + expect(result_status).to eq :user_created_invited_to_team + expect(User.find_by_email('new@banana.net').teams).to include team_one + expect(Notification.last.users.last[:email]).to eq 'new@banana.net' + end + end + + context 'when user already exists' do + let(:user_two) { create :user, email: Faker::Internet.email } + let(:service_one) do + ClientApi::InvitationsService.new(user: user_one, + team: team_one, + role: 'normal_user', + emails: [user_two.email]) + end + + it 'returns information, that user already exists' do + invitation_service = ClientApi::InvitationsService.new( + user: user_one, + role: 'normal_user', + emails: [user_two.email] + ) + result_status = invitation_service.invitation.last[:status] + expect(result_status).to eq :user_exists_unconfirmed + end + + it 'returns user exists in team response if team present ' \ + 'and user already part of the team' do + create :user_team, team: team_one, user: user_two + result_status = service_one.invitation.last[:status] + expect(result_status).to eq :user_exists_and_in_team_unconfirmed + end + + it 'creates user-team relation and notification if team present ' \ + 'and user not part of the team' do + result_status = service_one.invitation.last[:status] + expect(result_status).to eq :user_exists_invited_to_team_unconfirmed + expect(User.find_by_email(user_two.email).teams).to include team_one + expect(Notification.last.users.last[:email]).to eq user_two.email + end + end + end +end diff --git a/yarn.lock b/yarn.lock index fe7343bfb..61840a4cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4518,9 +4518,9 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -prettier@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.5.3.tgz#59dadc683345ec6b88f88b94ed4ae7e1da394bfe" +prettier@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.7.0.tgz#47481588f41f7c90f63938feb202ac82554e7150" prettysize@^0.1.0: version "0.1.0"