diff --git a/Gemfile b/Gemfile index 2c9b50865..54fa73a04 100644 --- a/Gemfile +++ b/Gemfile @@ -54,7 +54,7 @@ gem "bootstrap_form", "~> 5.3" # Devise Authentication gem "devise" -gem 'devise_invitable', '~> 2.0.0' +gem "devise_invitable", "~> 2.0.0" # Use Sass to process CSS gem "dartsass-rails" diff --git a/config/routes.rb b/config/routes.rb index 85b8b76eb..8347cfcd6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,8 +4,8 @@ devise_for :users, controllers: { registrations: "registrations", sessions: "users/sessions", - invitations: 'organizations/invitations' -} + invitations: "organizations/invitations" + } resources :adoptable_pets, only: [:index, :show] resource :adopter_profile, except: :destroy, as: "profile" diff --git a/db/migrate/20231009132343_devise_invitable_add_to_users.rb b/db/migrate/20231009132343_devise_invitable_add_to_users.rb index e423c8038..540ee41c5 100644 --- a/db/migrate/20231009132343_devise_invitable_add_to_users.rb +++ b/db/migrate/20231009132343_devise_invitable_add_to_users.rb @@ -2,15 +2,15 @@ class DeviseInvitableAddToUsers < ActiveRecord::Migration[7.0] def up safety_assured do change_table :users do |t| - t.string :invitation_token - t.datetime :invitation_created_at - t.datetime :invitation_sent_at - t.datetime :invitation_accepted_at - t.integer :invitation_limit + t.string :invitation_token + t.datetime :invitation_created_at + t.datetime :invitation_sent_at + t.datetime :invitation_accepted_at + t.integer :invitation_limit t.references :invited_by, polymorphic: true - t.integer :invitations_count, default: 0 - t.index :invitation_token, unique: true # for invitable - t.index :invited_by_id + t.integer :invitations_count, default: 0 + t.index :invitation_token, unique: true # for invitable + t.index :invited_by_id end end end diff --git a/test/factories.rb b/test/factories.rb index 3fd76bc5e..cd4eaba93 100644 --- a/test/factories.rb +++ b/test/factories.rb @@ -154,6 +154,12 @@ trait :unverified do verified { false } end + + trait :admin do + after :create do |staff_account| + staff_account.add_role(:admin, staff_account.organization) + end + end end factory :user do @@ -168,6 +174,10 @@ staff_account end + trait :staff_admin do + association(:staff_account, :admin) + end + trait :unverified_staff do staff_account { build(:staff_account, :unverified) } end diff --git a/test/integration/organizations/invite_staff_test.rb b/test/integration/organizations/invite_staff_test.rb new file mode 100644 index 000000000..0b12cacff --- /dev/null +++ b/test/integration/organizations/invite_staff_test.rb @@ -0,0 +1,45 @@ +require "test_helper" + +class Organizations::InviteStaffTest < ActionDispatch::IntegrationTest + setup do + @user_invitation_params = { + user: { + first_name: "John", + last_name: "Doe", + email: "john@example.com", + staff_account_attributes: {roles: "admin"} + } + } + end + + test "staff admin can invite other staffs to the organization" do + sign_in create(:user, :staff_admin) + + post( + user_invitation_path, + params: @user_invitation_params + ) + + assert_response :redirect + + invited_user = User.find_by(email: "john@example.com") + + assert invited_user.invited_to_sign_up? + assert invited_user.staff_account.has_role?(:admin) + assert invited_user.staff_account.verified? + + assert_equal ActionMailer::Base.deliveries.count, 1 + end + + test "staff admin can not invite existing user to the organization" do + sign_in create(:user, :staff_admin) + _existing_user = create(:user, email: "john@example.com") + + post( + user_invitation_path, + params: @user_invitation_params + ) + + assert_response :unprocessable_entity + end +end