From 123073977ad223232d361927c39fda3b4e80d078 Mon Sep 17 00:00:00 2001 From: Dalvin Josias Sejour Date: Tue, 23 May 2023 21:03:14 -0400 Subject: [PATCH 1/3] TDD reproduce error --- spec/models/user_spec.rb | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index efc8d7bc5b..3615a3cfe3 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -39,6 +39,17 @@ expect(build(:user)).to be_valid end + context "discarded user from organization should be able to create a partner profile" do + let(:discarded_at) { Time.zone.now } + let(:email) { "larry-june@gmail.com" } + let!(:discarded_user) { create(:user, name: "Larry", email: email, discarded_at: discarded_at) } + let!(:partner) { create(:partner, email: email) } + + it "allows a previously discarded user to create a partner account" do + expect(partner).not_to be_valid + end + end + context "Validations >" do it "requires a name" do expect(build(:user, name: nil)).not_to be_valid @@ -55,8 +66,8 @@ describe "Scopes >" do describe "->alphabetized" do - let!(:z_name_user) { create(:user, name: 'Zachary') } - let!(:a_name_user) { create(:user, name: 'Amanda') } + let!(:z_name_user) { create(:user, name: "Zachary") } + let!(:a_name_user) { create(:user, name: "Amanda") } it "retrieves users in the correct order" do alphabetized_list = described_class.alphabetized @@ -71,10 +82,10 @@ describe "->alphabetized" do let(:discarded_at) { Time.zone.now } - let!(:z_name_user) { create(:user, name: 'Zachary') } - let!(:a_name_user) { create(:user, name: 'Amanda') } - let!(:deactivated_a_name_user) { create(:user, name: 'Alice', discarded_at: discarded_at) } - let!(:deactivated_z_name_user) { create(:user, name: 'Zeke', discarded_at: discarded_at) } + let!(:z_name_user) { create(:user, name: "Zachary") } + let!(:a_name_user) { create(:user, name: "Amanda") } + let!(:deactivated_a_name_user) { create(:user, name: "Alice", discarded_at: discarded_at) } + let!(:deactivated_z_name_user) { create(:user, name: "Zeke", discarded_at: discarded_at) } it "retrieves users in the correct order" do alphabetized_list = described_class.org_users.with_discarded.alphabetized @@ -118,12 +129,12 @@ end end - describe 'omniauth' do - it 'retrieves the user from an omniauth context' do + describe "omniauth" do + it "retrieves the user from an omniauth context" do # can't use instance_double since AuthHash uses Hashie for dynamically created methods - token = double(OmniAuth::AuthHash, info: {'email' => 'me@me.com'}) + token = double(OmniAuth::AuthHash, info: {"email" => "me@me.com"}) expect(described_class.from_omniauth(token)).to eq(nil) - user = FactoryBot.create(:user, email: 'me@me.com') + user = FactoryBot.create(:user, email: "me@me.com") expect(described_class.from_omniauth(token)).to eq(user) end end From e56ffd88bb86b63eb983a90da8bfc60fe9c05c44 Mon Sep 17 00:00:00 2001 From: Dalvin Josias Sejour Date: Wed, 31 May 2023 11:09:25 -0400 Subject: [PATCH 2/3] add user deactivation --- app/models/role.rb | 1 + app/models/user.rb | 12 +++++++++--- app/models/users_role.rb | 2 +- db/migrate/20230529045228_deactive_users.rb | 7 +++++++ spec/models/user_spec.rb | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20230529045228_deactive_users.rb diff --git a/app/models/role.rb b/app/models/role.rb index 95faf041ed..6b5cb96719 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -29,4 +29,5 @@ class Role < ApplicationRecord ORG_ADMIN = :org_admin SUPER_ADMIN = :super_admin PARTNER = :partner + DEACTIVATED = :deactivated end diff --git a/app/models/user.rb b/app/models/user.rb index f3f953a3f3..46b2e65b41 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -53,13 +53,14 @@ class User < ApplicationRecord # :invitable is from the devise_invitable gem # If you change any of these options, adjust ConsolidatedLoginsController::DeviseMappingShunt accordingly devise :invitable, :database_authenticatable, :registerable, - :recoverable, :rememberable, :trackable, :validatable, - :timeoutable + :recoverable, :rememberable, :trackable, :validatable, + :timeoutable devise :omniauthable, omniauth_providers: [:google_oauth2] validates :name, presence: true + before_validation validates :email, presence: true, uniqueness: {case_sensitive: false}, - format: {with: URI::MailTo::EMAIL_REGEXP, on: :create} + format: {with: URI::MailTo::EMAIL_REGEXP, on: :create} validate :password_complexity @@ -82,6 +83,10 @@ def formatted_email email.present? ? "#{name} <#{email}>" : "" end + def check_if_user_discarded + user = User.find_by(email: name) + end + def password_complexity return if password.blank? || password =~ /(?=.*?[#?!@$%^&*-])/ @@ -99,6 +104,7 @@ def kind return "admin" if has_role?(Role::ORG_ADMIN, organization) return "normal" if has_role?(Role::ORG_USER, organization) return "partner" if has_role?(Role::PARTNER, partner) + return "deactived" if has_role?(Role::DEACTIVATED) "normal" end diff --git a/app/models/users_role.rb b/app/models/users_role.rb index 70ad96eace..6324afd630 100644 --- a/app/models/users_role.rb +++ b/app/models/users_role.rb @@ -15,7 +15,7 @@ class UsersRole < ApplicationRecord # @param user [User] # @return [Role,nil] def self.current_role_for(user) - role_order = [Role::SUPER_ADMIN, Role::ORG_ADMIN, Role::ORG_USER, Role::PARTNER] + role_order = [Role::SUPER_ADMIN, Role::ORG_ADMIN, Role::ORG_USER, Role::PARTNER, Role::DEACTIVATED] role_order.each do |role| found_role = user&.roles&.find { |r| r.name.to_sym == role } return found_role if found_role diff --git a/db/migrate/20230529045228_deactive_users.rb b/db/migrate/20230529045228_deactive_users.rb new file mode 100644 index 0000000000..59dd7c011f --- /dev/null +++ b/db/migrate/20230529045228_deactive_users.rb @@ -0,0 +1,7 @@ +class DeactiveUsers < ActiveRecord::Migration[7.0] + def change + Users.discarded.each do |user| + user.add_role(:deactivated) + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 3615a3cfe3..1407ebaa18 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -42,7 +42,7 @@ context "discarded user from organization should be able to create a partner profile" do let(:discarded_at) { Time.zone.now } let(:email) { "larry-june@gmail.com" } - let!(:discarded_user) { create(:user, name: "Larry", email: email, discarded_at: discarded_at) } + let!(:discarded_user) { build(:user, name: "Larry", email: email, discarded_at: discarded_at) } let!(:partner) { create(:partner, email: email) } it "allows a previously discarded user to create a partner account" do From 22c0853b7f8f1427dde3fc51aa47bdffb19646b7 Mon Sep 17 00:00:00 2001 From: Dalvin Josias Sejour Date: Wed, 31 May 2023 11:17:47 -0400 Subject: [PATCH 3/3] remove --- app/models/user.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 46b2e65b41..4978f17726 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -83,10 +83,6 @@ def formatted_email email.present? ? "#{name} <#{email}>" : "" end - def check_if_user_discarded - user = User.find_by(email: name) - end - def password_complexity return if password.blank? || password =~ /(?=.*?[#?!@$%^&*-])/