diff --git a/app/jobs/user_assignments/propagate_assignment_job.rb b/app/jobs/user_assignments/propagate_assignment_job.rb index 4705d3940..f54d51d22 100644 --- a/app/jobs/user_assignments/propagate_assignment_job.rb +++ b/app/jobs/user_assignments/propagate_assignment_job.rb @@ -4,18 +4,14 @@ module UserAssignments class PropagateAssignmentJob < ApplicationJob queue_as :high_priority - def perform(object, user, user_role, assigned_by, destroy: false) + def perform(project, user, user_role, assigned_by, destroy: false) @user = user @user_role = user_role @assigned_by = assigned_by @destroy = destroy ActiveRecord::Base.transaction do - if object.is_a? Project - sync_experiments_user_associations(object) - elsif object.is_a? Experiment - sync_my_modules_user_assignments(object) - end + sync_experiments_user_associations(project) end end @@ -51,7 +47,7 @@ module UserAssignments end def destroy_user_assignment(object) - UserAssignment.find_by(user: @user, assignable: object).destroy_all + UserAssignment.where(user: @user, assignable: object).destroy_all end end end diff --git a/spec/jobs/user_assignments/generate_user_assignments_job_spec.rb b/spec/jobs/user_assignments/generate_user_assignments_job_spec.rb new file mode 100644 index 000000000..12ef612b8 --- /dev/null +++ b/spec/jobs/user_assignments/generate_user_assignments_job_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +require 'rails_helper' + +module UserAssignments + RSpec.describe GenerateUserAssignmentsJob, type: :job do + let!(:owner_role) { create :owner_role } + let!(:viewer_role) { create :viewer_role } + let!(:technician_role) { create :technician_role } + + let!(:user_one) { create :user } + let!(:user_two) { create :user } + let!(:user_three) { create :user } + let!(:team) { create :team, created_by: user_one } + let!(:project) { create :project, team: team, created_by: user_one } + + before do + available_roles = [owner_role, viewer_role, technician_role] + [user_one, user_two, user_three].each_with_index do |user, i| + create :user_team, :admin, user: user, team: team + create :user_project, user: user, project: project + create :user_assignment, + assignable: project, + user: user, + user_role: available_roles[i], + assigned_by: user + end + end + + describe 'perform' do + context 'experiment' do + let!(:experiment) { create :experiment, project: project } + + it 'creates user assignments for all users on the project that are not assigned yet' do + expect { + described_class.perform_now(experiment, user_one) + }.to change(UserAssignment, :count).by(3) + end + + it 'assigns the same role as the user had on project level' do + described_class.perform_now(experiment, user_one) + user_two_assignment = UserAssignment.find_by(user: user_two, assignable: experiment) + user_three_assignment = UserAssignment.find_by(user: user_three, assignable: experiment) + expect(user_two_assignment.user_role).to eq viewer_role + expect(user_three_assignment.user_role).to eq technician_role + end + end + + context 'my_module' do + let!(:experiment) { create :experiment, project: project } + let!(:my_module) { create :my_module, experiment: experiment } + + it 'creates user assignments for all users on the project that are not assigned yet' do + expect { + described_class.perform_now(my_module, user_one) + }.to change(UserAssignment, :count).by(3) + end + + it 'assigns the same role as the user had on project level' do + described_class.perform_now(my_module, user_one) + user_two_assignment = UserAssignment.find_by(user: user_two, assignable: my_module) + user_three_assignment = UserAssignment.find_by(user: user_three, assignable: my_module) + expect(user_two_assignment.user_role).to eq viewer_role + expect(user_three_assignment.user_role).to eq technician_role + end + end + end + end +end diff --git a/spec/jobs/user_assignments/propagate_assignment_job_spec.rb b/spec/jobs/user_assignments/propagate_assignment_job_spec.rb new file mode 100644 index 000000000..16da2620c --- /dev/null +++ b/spec/jobs/user_assignments/propagate_assignment_job_spec.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true +require 'rails_helper' + +module UserAssignments + RSpec.describe PropagateAssignmentJob, type: :job do + let!(:owner_role) { create :owner_role }+ + let!(:technician_role) { create :technician_role } + + let!(:user_one) { create :user } + let!(:user_two) { create :user } + let!(:team) { create :team, created_by: user_one } + let!(:project) { create :project, team: team, created_by: user_one } + let!(:user_project) { create :user_project, user: user_one, project: project } + let!(:experiment_one) { create :experiment, project: project } + let!(:experiment_two) { create :experiment, project: project } + let!(:my_module_one) { create :my_module, experiment: experiment_one } + let!(:my_module_two) { create :my_module, experiment: experiment_two } + let!(:user_assignment) do + create :user_assignment, + assignable: project, + user: user_one, + user_role: owner_role, + assigned_by: user_one + end + + before do + [user_one, user_two].each do |user| + create :user_team, :admin, user: user, team: team + end + end + + describe 'perform' do + it 'propagates the user assignments to project child object' do + expect { + described_class.perform_now(project, user_two, technician_role, user_one) + }.to change(UserAssignment, :count).by(4) + end + + it 'propagates the user assignments to project child object with the same role' do + described_class.perform_now(project, user_two, technician_role, user_one) + [ + UserAssignment.find_by(user: user_two, assignable: experiment_one), + UserAssignment.find_by(user: user_two, assignable: experiment_two), + UserAssignment.find_by(user: user_two, assignable: my_module_one), + UserAssignment.find_by(user: user_two, assignable: my_module_two), + ].each do |user_assignment| + expect(user_assignment.user_role).to eq technician_role + end + end + + it 'removes all the child objects user assignments when the destroy flag is set' do + create :user_assignment, assignable: experiment_one, user: user_two, user_role: technician_role, assigned_by: user_one + create :user_assignment, assignable: experiment_two, user: user_two, user_role: technician_role, assigned_by: user_one + create :user_assignment, assignable: my_module_one, user: user_two, user_role: technician_role, assigned_by: user_one + create :user_assignment, assignable: my_module_two, user: user_two, user_role: technician_role, assigned_by: user_one + + expect { + described_class.perform_now(project, user_two, technician_role, user_one, destroy: true) + }.to change(UserAssignment, :count).by(-4) + end + end + end +end