From 5f0075f8b77f7be79e5097ed3a10c42f72392810 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley Date: Thu, 15 Mar 2018 16:51:05 +0000 Subject: [PATCH] Refactor to use new REST resource --- .../enterprise_controller.js.coffee | 2 +- .../admin/enterprises_controller.rb | 28 ------------- .../admin/manager_invitations_controller.rb | 37 ++++++++++++++++ app/models/enterprise.rb | 4 -- config/routes.rb | 3 +- .../admin/enterprises_controller_spec.rb | 36 ---------------- .../manager_invitations_controller_spec.rb | 42 +++++++++++++++++++ spec/features/admin/enterprise_roles_spec.rb | 3 +- spec/mailers/enterprise_mailer_spec.rb | 2 +- 9 files changed, 84 insertions(+), 73 deletions(-) create mode 100644 app/controllers/admin/manager_invitations_controller.rb create mode 100644 spec/controllers/admin/manager_invitations_controller_spec.rb diff --git a/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee b/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee index 9fa74e78d3..749929c7f6 100644 --- a/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee +++ b/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee @@ -56,7 +56,7 @@ angular.module("admin.enterprises") $scope.invite_errors = $scope.invite_success = null email = $scope.newUser - $http.post('/admin/enterprises/invite_manager', {email: email, enterprise: $scope.Enterprise.id}).success (data)-> + $http.post("/admin/manager_invitations", {email: email, enterprise_id: $scope.Enterprise.id}).success (data)-> $scope.addManager({id: data.user, email: email}) $scope.invite_success = t('user_invited', email: email) .error (data) -> diff --git a/app/controllers/admin/enterprises_controller.rb b/app/controllers/admin/enterprises_controller.rb index fe6e8b8c44..11dd547042 100644 --- a/app/controllers/admin/enterprises_controller.rb +++ b/app/controllers/admin/enterprises_controller.rb @@ -114,36 +114,8 @@ module Admin end end - def invite_manager - existing_user = Spree::User.where("email = :email OR unconfirmed_email = :email", email: params[:email]).first - - if existing_user - render json: { errors: t('admin.enterprises.invite_manager.user_already_exists') }, status: :unprocessable_entity - return - end - - new_user = create_new_manager(params[:email], params[:enterprise]) - - if new_user - render json: { user: new_user.id }, status: :ok - else - render json: { errors: t('admin.enterprises.invite_manager.error') }, status: 500 - end - end - protected - def create_new_manager(email, enterprise_id) - enterprise = Enterprise.find(enterprise_id) - password = Devise.friendly_token.first(8) - new_user = Spree::User.create(email: email, unconfirmed_email: email, password: password, password_confirmation: password) - - enterprise.send_manager_invitation(new_user) - enterprise.users << new_user - - new_user - end - def build_resource_with_address enterprise = build_resource_without_address enterprise.address ||= Spree::Address.new diff --git a/app/controllers/admin/manager_invitations_controller.rb b/app/controllers/admin/manager_invitations_controller.rb new file mode 100644 index 0000000000..11c28b75c6 --- /dev/null +++ b/app/controllers/admin/manager_invitations_controller.rb @@ -0,0 +1,37 @@ +module Admin + class ManagerInvitationsController < Spree::Admin::BaseController + def create + @email = params[:email] + @enterprise = Enterprise.find(params[:enterprise_id]) + + authorize! :edit, @enterprise + + existing_user = Spree::User.find_by_email(@email) + + if existing_user + render json: { errors: t('admin.enterprises.invite_manager.user_already_exists') }, status: :unprocessable_entity + return + end + + new_user = create_new_manager + + if new_user + render json: { user: new_user.id }, status: :ok + else + render json: { errors: t('admin.enterprises.invite_manager.error') }, status: 500 + end + end + + private + + def create_new_manager + password = Devise.friendly_token.first(8) + new_user = Spree::User.create(email: @email, unconfirmed_email: @email, password: password) + + @enterprise.users << new_user + Delayed::Job.enqueue ManagerInvitationJob.new(@enterprise.id, new_user.id) + + new_user + end + end +end diff --git a/app/models/enterprise.rb b/app/models/enterprise.rb index 3333f8441a..8b0f3fe385 100644 --- a/app/models/enterprise.rb +++ b/app/models/enterprise.rb @@ -348,10 +348,6 @@ class Enterprise < ActiveRecord::Base abn.present? end - def send_manager_invitation(user) - Delayed::Job.enqueue ManagerInvitationJob.new(self.id, user.id) - end - protected def devise_mailer diff --git a/config/routes.rb b/config/routes.rb index a5ab9673cd..0ae125dfd9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -99,7 +99,6 @@ Openfoodnetwork::Application.routes.draw do get :for_order_cycle get :visible post :bulk_update, as: :bulk_update - post :invite_manager end member do @@ -114,6 +113,8 @@ Openfoodnetwork::Application.routes.draw do resources :tag_rules, only: [:destroy] end + resources :manager_invitations, only: [:create] + resources :enterprise_relationships resources :enterprise_roles diff --git a/spec/controllers/admin/enterprises_controller_spec.rb b/spec/controllers/admin/enterprises_controller_spec.rb index f67902d5c6..f95bc6e8da 100644 --- a/spec/controllers/admin/enterprises_controller_spec.rb +++ b/spec/controllers/admin/enterprises_controller_spec.rb @@ -634,41 +634,5 @@ module Admin end end end - - describe "#invite_manager" do - context "when given email matches an existing user" do - let!(:existing_user) { create(:user) } - let!(:enterprise) { create(:enterprise) } - let(:admin) { create(:admin_user) } - - before do - controller.stub spree_current_user: admin - end - - it "returns an error" do - spree_post :invite_manager, {email: user.email, enterprise: enterprise.id} - - expect(response.status).to eq 422 - expect(json_response['errors']).to eq I18n.t('admin.enterprises.invite_manager.user_already_exists') - end - end - - context "signing up a new user" do - let!(:enterprise) { create(:enterprise) } - let(:admin) { create(:admin_user) } - - before do - controller.stub spree_current_user: admin - end - - it "creates a new user, sends an invitation email, and returns the user id" do - spree_post :invite_manager, {email: 'un.registered@email.com', enterprise: enterprise.id} - - expect(Delayed::Job.last.payload_object.class.to_s).to eq('ManagerInvitationJob') - expect(response.status).to eq 200 - expect(json_response['user']).to eq Spree::User.find_by_email('un.registered@email.com').id - end - end - end end end diff --git a/spec/controllers/admin/manager_invitations_controller_spec.rb b/spec/controllers/admin/manager_invitations_controller_spec.rb new file mode 100644 index 0000000000..01b7c984d1 --- /dev/null +++ b/spec/controllers/admin/manager_invitations_controller_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' + +module Admin + describe ManagerInvitationsController, type: :controller do + let!(:existing_user) { create(:user) } + let!(:enterprise) { create(:enterprise) } + let(:admin) { create(:admin_user) } + + describe "#create" do + context "when given email matches an existing user" do + before do + controller.stub spree_current_user: admin + end + + it "returns an error" do + spree_post :create, {email: existing_user.email, enterprise_id: enterprise.id} + + expect(response.status).to eq 422 + expect(json_response['errors']).to eq I18n.t('admin.enterprises.invite_manager.user_already_exists') + end + end + + context "signing up a new user" do + before do + controller.stub spree_current_user: admin + end + + it "creates a new user, sends an invitation email, and returns the user id" do + expect do + spree_post :create, {email: 'un.registered@email.com', enterprise_id: enterprise.id} + end.to enqueue_job Delayed::PerformableMethod + + new_user = Spree::User.find_by_email('un.registered@email.com') + + expect(new_user.reset_password_token).to_not be_nil + expect(response.status).to eq 200 + expect(json_response['user']).to eq new_user.id + end + end + end + end +end diff --git a/spec/features/admin/enterprise_roles_spec.rb b/spec/features/admin/enterprise_roles_spec.rb index 3c3957a9e4..5029a8b054 100644 --- a/spec/features/admin/enterprise_roles_spec.rb +++ b/spec/features/admin/enterprise_roles_spec.rb @@ -83,6 +83,7 @@ feature %q{ let!(:user1) { create(:user, email: 'user1@example.com') } let!(:user2) { create(:user, email: 'user2@example.com') } let!(:user3) { create(:user, email: 'user3@example.com', confirmed_at: nil) } + let(:new_email) { 'new@manager.com' } let!(:enterprise) { create(:enterprise, name: 'Test Enterprise', owner: user1) } let!(:enterprise_role) { create(:enterprise_role, user_id: user2.id, enterprise_id: enterprise.id) } @@ -137,8 +138,6 @@ feature %q{ end it "can invite unregistered users to be managers" do - new_email = 'new@manager.com' - find('a.button.help-modal').click expect(page).to have_css '#invite-manager-modal' diff --git a/spec/mailers/enterprise_mailer_spec.rb b/spec/mailers/enterprise_mailer_spec.rb index e5be9a6dc8..fae627a0d8 100644 --- a/spec/mailers/enterprise_mailer_spec.rb +++ b/spec/mailers/enterprise_mailer_spec.rb @@ -11,7 +11,7 @@ describe EnterpriseMailer do describe "#welcome" do it "should send a welcome email when given an enterprise" do EnterpriseMailer.welcome(enterprise).deliver - ActionMailer::Base.deliveries.count.should == 1 + expect(ActionMailer::Base.deliveries.count).to eq 1 mail = ActionMailer::Base.deliveries.first expect(mail.subject).to eq "#{enterprise.name} is now on #{Spree::Config[:site_name]}" end