mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-10 07:05:57 +08:00
add test scenarios for user assignments propagation jobs
This commit is contained in:
parent
ddaa4b4c57
commit
fc7214c2f7
3 changed files with 134 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
63
spec/jobs/user_assignments/propagate_assignment_job_spec.rb
Normal file
63
spec/jobs/user_assignments/propagate_assignment_job_spec.rb
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue