Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions app/models/professor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ class Professor < ApplicationRecord
validates :enrollment_number, uniqueness: true, allow_blank: true
validate :changed_to_different_user

before_destroy :handle_user_role_removal

def create_advisement_points_of_level_method(column_name)
self.class.send(:define_method, column_name) {
advisement_points(column_name[26..-1])
Expand Down Expand Up @@ -130,4 +132,22 @@ def changed_to_different_user
errors.add(:user, :changed_to_different_user)
end
end

private
def handle_user_role_removal
return unless user.present?

professor_role = Role.find_by(id: Role::ROLE_PROFESSOR)
if user.roles.include?(professor_role)
user.roles.delete(professor_role)

user.roles << Role.find_by(id: Role::ROLE_DESCONHECIDO) if user.roles.empty?

if user.actual_role == Role::ROLE_PROFESSOR
user.actual_role = user.user_max_role || Role::ROLE_DESCONHECIDO
end

user.save!
end
end
end
20 changes: 20 additions & 0 deletions app/models/student.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ class Student < ApplicationRecord
validates :cpf, presence: true, uniqueness: true
validate :changed_to_different_user

before_destroy :handle_user_role_removal

accepts_nested_attributes_for :student_majors, allow_destroy: true

before_save :set_birth_state_by_birth_city
Expand Down Expand Up @@ -106,4 +108,22 @@ def changed_to_different_user
def set_birth_state_by_birth_city
self.birth_state_id = birth_city.state_id unless birth_city.blank?
end

private
def handle_user_role_removal
return unless user.present?

student_role = Role.find_by(id: Role::ROLE_ALUNO)
if user.roles.include?(student_role)
user.roles.delete(student_role)

user.roles << Role.find_by(id: Role::ROLE_DESCONHECIDO) if user.roles.empty?

if user.actual_role == Role::ROLE_ALUNO
user.actual_role = user.user_max_role || Role::ROLE_DESCONHECIDO
end

user.save!
end
end
end
35 changes: 35 additions & 0 deletions spec/models/professor_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -286,4 +286,39 @@
end
end
end

describe "Before destroy" do
it "should assign unknown role when user has only professor role" do
@destroy_later << FactoryBot.create(:role_desconhecido)
@destroy_later << user = FactoryBot.create(:user, actual_role: Role::ROLE_PROFESSOR)
@destroy_later << professor = FactoryBot.create(:professor, user: user)
user.roles << @professor_role
user.save!

professor.destroy
user.reload

expect(user.roles.count).to eq(1)
expect(user.roles).not_to include(@professor_role)
expect(user.roles.first.id).to eq(Role::ROLE_DESCONHECIDO)
expect(user.actual_role).to eq(Role::ROLE_DESCONHECIDO)
end

it "should keep other roles when user has multiple roles" do
@destroy_later << admin_role = FactoryBot.create(:role_administrador)
@destroy_later << user = FactoryBot.create(:user, actual_role: Role::ROLE_ADMINISTRADOR)
@destroy_later << professor = FactoryBot.create(:professor, user: user)
user.roles << @professor_role
user.roles << admin_role
user.save!

professor.destroy
user.reload

expect(user.roles.count).to eq(1)
expect(user.roles).to include(admin_role)
expect(user.roles).not_to include(@professor_role)
expect(user.actual_role).to eq(Role::ROLE_ADMINISTRADOR)
end
end
end
35 changes: 35 additions & 0 deletions spec/models/student_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,39 @@
expect(student.birth_state).to eq(birth_state)
end
end

describe "Before destroy" do
it "should assign unknown role when user has only student role" do
@destroy_later << FactoryBot.create(:role_desconhecido)
@destroy_later << user = FactoryBot.create(:user, actual_role: Role::ROLE_ALUNO)
@destroy_later << student = FactoryBot.create(:student, user: user)
user.roles << @role_aluno
user.save!

student.destroy
user.reload

expect(user.roles.count).to eq(1)
expect(user.roles).not_to include(@role_aluno)
expect(user.roles.first.id).to eq(Role::ROLE_DESCONHECIDO)
expect(user.actual_role).to eq(Role::ROLE_DESCONHECIDO)
end

it "should keep other roles when user has multiple roles" do
@destroy_later << admin_role = FactoryBot.create(:role_administrador)
@destroy_later << user = FactoryBot.create(:user, actual_role: Role::ROLE_ADMINISTRADOR)
@destroy_later << student = FactoryBot.create(:student, user: user)
user.roles << @role_aluno
user.roles << admin_role
user.save!

student.destroy
user.reload

expect(user.roles.count).to eq(1)
expect(user.roles).to include(admin_role)
expect(user.roles).not_to include(@role_aluno)
expect(user.actual_role).to eq(Role::ROLE_ADMINISTRADOR)
end
end
end
Loading