From 784e43e3282d565c0976456ff55719b1e85fbb4f Mon Sep 17 00:00:00 2001 From: zmagoD Date: Sun, 6 Jun 2021 09:54:47 +0200 Subject: [PATCH] create user_assignments for all child objects when the user is attached to the project --- .../experiments_controller.rb | 2 +- .../my_modules_controller.rb | 2 +- .../experiment_user_assignments_controller.rb | 30 +---- .../v1/task_user_assignments_controller.rb | 31 +---- app/helpers/user_assignments_helper.rb | 33 ++++-- .../generate_user_assignments_job.rb | 43 +++++++ .../propagate_assignment_job.rb | 57 +++++++++ app/models/concerns/assignable.rb | 15 +++ app/models/experiment.rb | 4 +- app/models/experiment_member.rb | 45 ------- app/models/my_module.rb | 4 +- app/models/my_module_member.rb | 47 -------- app/models/project_member.rb | 29 ++++- config/routes.rb | 4 +- spec/models/experiment_member_spec.rb | 86 -------------- spec/models/experiment_spec.rb | 10 ++ spec/models/my_module_member_spec.rb | 97 --------------- spec/models/my_module_spec.rb | 10 ++ spec/models/project_member_spec.rb | 25 ++++ ...riment_user_assignments_controller_spec.rb | 110 +---------------- .../task_user_assignments_controller_spec.rb | 112 +----------------- 21 files changed, 232 insertions(+), 564 deletions(-) create mode 100644 app/jobs/user_assignments/generate_user_assignments_job.rb create mode 100644 app/jobs/user_assignments/propagate_assignment_job.rb create mode 100644 app/models/concerns/assignable.rb diff --git a/app/controllers/access_permissions/experiments_controller.rb b/app/controllers/access_permissions/experiments_controller.rb index 9c57e8dfc..604eff459 100644 --- a/app/controllers/access_permissions/experiments_controller.rb +++ b/app/controllers/access_permissions/experiments_controller.rb @@ -21,7 +21,7 @@ module AccessPermissions def update @experiment_member = ExperimentMember.new(current_user, @experiment, @project) - @experiment_member.handle_change(permitted_update_params) + @experiment_member.update(permitted_update_params) respond_to do |format| format.json do diff --git a/app/controllers/access_permissions/my_modules_controller.rb b/app/controllers/access_permissions/my_modules_controller.rb index 43d3dfe63..314c7f14f 100644 --- a/app/controllers/access_permissions/my_modules_controller.rb +++ b/app/controllers/access_permissions/my_modules_controller.rb @@ -22,7 +22,7 @@ module AccessPermissions def update @my_module_member = MyModuleMember.new(current_user, @my_module, @experiment, @project) - @my_module_member.handle_change(permitted_update_params) + @my_module_member.update(permitted_update_params) respond_to do |format| format.json do diff --git a/app/controllers/api/v1/experiment_user_assignments_controller.rb b/app/controllers/api/v1/experiment_user_assignments_controller.rb index d098d32bb..1a41ccf19 100644 --- a/app/controllers/api/v1/experiment_user_assignments_controller.rb +++ b/app/controllers/api/v1/experiment_user_assignments_controller.rb @@ -6,8 +6,8 @@ module Api before_action :load_team before_action :load_project before_action :load_experiment - before_action :load_user_assignment, only: %i(update show destroy) - before_action :load_user_assignment_for_managing, only: %i(update show destroy) + before_action :load_user_assignment, only: %i(update show) + before_action :load_user_assignment_for_managing, only: %i(update show) def index user_assignments = @experiment.user_assignments @@ -26,20 +26,6 @@ module Api include: %i(user user_role) end - def create - raise PermissionError.new(Experiment, :manage) unless can_manage_experiment?(@experiment) - - experiment_member = ExperimentMember.new(current_user, @experiment, @project) - experiment_member.create( - user_role_id: user_assignment_params[:user_role_id], - user_id: user_assignment_params[:user_id] - ) - - render jsonapi: experiment_member.user_assignment.reload, - serializer: ExperimentUserAssignmentSerializer, - status: :created - end - def update user_role = UserRole.find user_assignment_params[:user_role_id] user = @user_assignment.user @@ -59,18 +45,6 @@ module Api status: :ok end - def destroy - experiment_member = ExperimentMember.new( - current_user, - @experiment, - @project, - @user_assignment.user, - @user_assignment - ) - experiment_member.destroy - render body: nil - end - private def load_user_assignment diff --git a/app/controllers/api/v1/task_user_assignments_controller.rb b/app/controllers/api/v1/task_user_assignments_controller.rb index fd4da24e7..cfa938de6 100644 --- a/app/controllers/api/v1/task_user_assignments_controller.rb +++ b/app/controllers/api/v1/task_user_assignments_controller.rb @@ -7,8 +7,8 @@ module Api before_action :load_project before_action :load_experiment before_action :load_task - before_action :load_user_assignment, only: %i(update show destroy) - before_action :load_user_assignment_for_managing, only: %i(update show destroy) + before_action :load_user_assignment, only: %i(update show) + before_action :load_user_assignment_for_managing, only: %i(update show) def index user_assignments = @task.user_assignments @@ -27,20 +27,6 @@ module Api include: %i(user user_role) end - def create - raise PermissionError.new(MyModule, :read) unless can_manage_module?(@task) - - my_module_member = MyModuleMember.new(current_user, @task, @experiment, @project) - my_module_member.create( - user_role_id: user_assignment_params[:user_role_id], - user_id: user_assignment_params[:user_id] - ) - - render jsonapi: my_module_member.user_assignment.reload, - serializer: TaskUserAssignmentSerializer, - status: :created - end - def update user_role = UserRole.find user_assignment_params[:user_role_id] user = @user_assignment.user @@ -62,19 +48,6 @@ module Api status: :ok end - def destroy - my_module_member = MyModuleMember.new( - current_user, - @task, - @experiment, - @project, - @user_assignment.user, - @user_assignment - ) - my_module_member.destroy - render body: nil - end - private def load_user_assignment diff --git a/app/helpers/user_assignments_helper.rb b/app/helpers/user_assignments_helper.rb index 5f8f1bd4e..2b0c41afb 100644 --- a/app/helpers/user_assignments_helper.rb +++ b/app/helpers/user_assignments_helper.rb @@ -14,24 +14,37 @@ module UserAssignmentsHelper # Triggers N+1 but the partial is cached if resource.is_a?(Experiment) - project_user_assignment = resource.permission_parent.user_assignments.find_by(user: user) - current_user_assignment_name = user_assignment&.user_role&.name + project_user_assignment_name = resource.permission_parent + .user_assignments + .find_by(user: user) + .user_role + .name + current_user_assignment_name = user_assignment.user_role.name [ - t('user_assignment.from_project', user_role: project_user_assignment.user_role.name), - current_user_assignment_name + t('user_assignment.from_project', user_role: project_user_assignment_name), + (current_user_assignment_name unless current_user_assignment_name == project_user_assignment_name) ].compact.join(' / ') elsif resource.is_a?(MyModule) - project_user_assignment = resource.permission_parent.permission_parent.user_assignments.find_by(user: user) - experiment_user_assignment = resource.permission_parent.user_assignments.find_by(user: user) - current_user_assignment_name = user_assignment&.user_role&.name + project_user_assignment_name = resource.permission_parent + .permission_parent + .user_assignments + .find_by(user: user) + .user_role + .name + experiment_user_assignment_name = resource.permission_parent + .user_assignments + .find_by(user: user) + .user_role + .name + current_user_assignment_name = user_assignment.user_role.name [ t('user_assignment.from_project', - user_role: project_user_assignment.user_role.name), + user_role: project_user_assignment_name), (t('user_assignment.from_experiment', - user_role: experiment_user_assignment.user_role.name) if experiment_user_assignment.present?), - current_user_assignment_name + user_role: experiment_user_assignment_name) unless project_user_assignment_name == experiment_user_assignment_name), + (current_user_assignment_name unless experiment_user_assignment_name == current_user_assignment_name) ].compact.join(' / ') else user_assignment.user_role.name diff --git a/app/jobs/user_assignments/generate_user_assignments_job.rb b/app/jobs/user_assignments/generate_user_assignments_job.rb new file mode 100644 index 000000000..d01f2ac06 --- /dev/null +++ b/app/jobs/user_assignments/generate_user_assignments_job.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module UserAssignments + class GenerateUserAssignmentsJob < ApplicationJob + queue_as :high_priority + + def perform(object, assigned_by) + @assigned_by = assigned_by + ActiveRecord::Base.transaction do + if object.is_a? Experiment + assign_users_to_experiment(object) + elsif object.is_a? MyModule + assign_users_to_my_module(object) + end + end + end + + private + + def assign_users_to_experiment(experiment) + project = experiment.project + project.user_assignments.find_each do |user_assignment| + create_or_update_user_assignment(user_assignment, experiment) + end + end + + def assign_users_to_my_module(my_module) + project = my_module.experiment.project + project.user_assignments.find_each do |user_assignment| + create_or_update_user_assignment(user_assignment, my_module) + end + end + + def create_or_update_user_assignment(parent_user_assignment, object) + user_role = parent_user_assignment.user_role + user = parent_user_assignment.user + new_user_assignment = UserAssignment.find_or_initialize_by(user: user, assignable: object) + new_user_assignment.user_role = user_role + new_user_assignment.assigned_by = @assigned_by + new_user_assignment.save! + end + end +end diff --git a/app/jobs/user_assignments/propagate_assignment_job.rb b/app/jobs/user_assignments/propagate_assignment_job.rb new file mode 100644 index 000000000..4705d3940 --- /dev/null +++ b/app/jobs/user_assignments/propagate_assignment_job.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module UserAssignments + class PropagateAssignmentJob < ApplicationJob + queue_as :high_priority + + def perform(object, 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 + end + end + + private + + def sync_experiments_user_associations(project) + project.experiments.find_each do |experiment| + if @destroy + destroy_user_assignment(experiment) + else + create_or_update_user_assignment(experiment) + end + + sync_my_modules_user_assignments(experiment) + end + end + + def sync_my_modules_user_assignments(experiment) + experiment.my_modules.find_each do |my_module| + if @destroy + destroy_user_assignment(my_module) + else + create_or_update_user_assignment(my_module) + end + end + end + + def create_or_update_user_assignment(object) + user_assignment = UserAssignment.find_or_initialize_by(user: @user, assignable: object) + user_assignment.user_role = @user_role + user_assignment.assigned_by = @assigned_by + user_assignment.save! + end + + def destroy_user_assignment(object) + UserAssignment.find_by(user: @user, assignable: object).destroy_all + end + end +end diff --git a/app/models/concerns/assignable.rb b/app/models/concerns/assignable.rb new file mode 100644 index 000000000..2090cbdc0 --- /dev/null +++ b/app/models/concerns/assignable.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Assignable + extend ActiveSupport::Concern + + included do + has_many :user_assignments, as: :assignable, dependent: :destroy + + default_scope { includes(user_assignments: :user_role) } + + after_create_commit do + UserAssignments::GenerateUserAssignmentsJob.perform_later(self, created_by) + end + end +end diff --git a/app/models/experiment.rb b/app/models/experiment.rb index 553898c5f..0b88c9d6d 100644 --- a/app/models/experiment.rb +++ b/app/models/experiment.rb @@ -3,6 +3,7 @@ class Experiment < ApplicationRecord include SearchableModel include SearchableByNameModel include PermissionCheckableModel + include Assignable belongs_to :project, inverse_of: :experiments, touch: true belongs_to :created_by, @@ -23,7 +24,6 @@ class Experiment < ApplicationRecord has_many :report_elements, inverse_of: :experiment, dependent: :destroy # Associations for old activity type has_many :activities, inverse_of: :experiment - has_many :user_assignments, as: :assignable, dependent: :destroy has_many :users, through: :user_assignments has_one_attached :workflowimg @@ -37,8 +37,6 @@ class Experiment < ApplicationRecord validates :uuid, uniqueness: { scope: :project }, unless: proc { |e| e.uuid.blank? } - default_scope { includes(user_assignments: :user_role) } - scope :is_archived, lambda { |is_archived| if is_archived joins(:project).where('experiments.archived = TRUE OR projects.archived = TRUE') diff --git a/app/models/experiment_member.rb b/app/models/experiment_member.rb index b69b4ceac..81ffdc4ab 100644 --- a/app/models/experiment_member.rb +++ b/app/models/experiment_member.rb @@ -20,25 +20,6 @@ class ExperimentMember end end - def handle_change(params) - prepare_data(params) - ActiveRecord::Base.transaction do - if destroy_role? - user_assignment.destroy - elsif user_assignment.present? - user_assignment.update!(user_role: user_role) - else - UserAssignment.create!( - assignable: experiment, - user: user, - user_role: user_role, - assigned_by: current_user - ) - end - log_change_activity - end - end - def update(params) prepare_data(params) @@ -48,27 +29,6 @@ class ExperimentMember end end - def create(params) - prepare_data(params) - - ActiveRecord::Base.transaction do - @user_assignment = UserAssignment.create!( - assignable: experiment, - user: user, - user_role: user_role, - assigned_by: current_user - ) - log_change_activity - end - end - - def destroy - ActiveRecord::Base.transaction do - user_assignment.destroy - log_change_activity - end - end - private def prepare_data(params) @@ -94,9 +54,4 @@ class ExperimentMember } ) end - - def destroy_role? - (user_assignment.present? && user_role.nil?) || - UserAssignment.find_by(assignable: project, user: user)&.user_role == user_role - end end diff --git a/app/models/my_module.rb b/app/models/my_module.rb index f53e9f83f..ade28a206 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -6,6 +6,7 @@ class MyModule < ApplicationRecord include SearchableByNameModel include TinyMceImages include PermissionCheckableModel + include Assignable enum state: Extends::TASKS_STATES @@ -53,14 +54,11 @@ class MyModule < ApplicationRecord has_many :repository_snapshots, dependent: :destroy, inverse_of: :my_module has_many :user_my_modules, inverse_of: :my_module, dependent: :destroy has_many :users, through: :user_my_modules - has_many :user_assignments, as: :assignable, dependent: :destroy has_many :report_elements, inverse_of: :my_module, dependent: :destroy has_many :protocols, inverse_of: :my_module, dependent: :destroy # Associations for old activity type has_many :activities, inverse_of: :my_module - default_scope { includes(user_assignments: :user_role) } - scope :overdue, -> { where('my_modules.due_date < ?', Time.current.utc) } scope :without_group, -> { active.where(my_module_group: nil) } scope :one_day_prior, (lambda do diff --git a/app/models/my_module_member.rb b/app/models/my_module_member.rb index 916e87fed..861546804 100644 --- a/app/models/my_module_member.rb +++ b/app/models/my_module_member.rb @@ -21,25 +21,6 @@ class MyModuleMember end end - def handle_change(params) - prepare_data(params) - ActiveRecord::Base.transaction do - if destroy_role? - user_assignment.destroy - elsif user_assignment.present? - user_assignment.update!(user_role: user_role) - else - UserAssignment.create!( - assignable: my_module, - user: user, - user_role: user_role, - assigned_by: current_user - ) - end - log_change_activity - end - end - def update(params) prepare_data(params) @@ -49,27 +30,6 @@ class MyModuleMember end end - def create(params) - prepare_data(params) - - ActiveRecord::Base.transaction do - @user_assignment = UserAssignment.create!( - assignable: my_module, - user: user, - user_role: user_role, - assigned_by: current_user - ) - log_change_activity - end - end - - def destroy - ActiveRecord::Base.transaction do - user_assignment.destroy - log_change_activity - end - end - private def prepare_data(params) @@ -95,11 +55,4 @@ class MyModuleMember } ) end - - def destroy_role? - experiment_role = UserAssignment.find_by(assignable: experiment, user: user)&.user_role - (user_assignment.present? && user_role.nil?) || - (experiment_role == user_role) || - (experiment_role.nil? && UserAssignment.find_by(assignable: project, user: user)&.user_role == user_role) - end end diff --git a/app/models/project_member.rb b/app/models/project_member.rb index 857eb7042..c3b34cb59 100644 --- a/app/models/project_member.rb +++ b/app/models/project_member.rb @@ -26,13 +26,22 @@ class ProjectMember ActiveRecord::Base.transaction do @user_project = UserProject.create!(project: @project, user: @user) + user_role = set_user_role + @user_assignment = UserAssignment.create!( assignable: @project, user: @user, - user_role: set_user_role, + user_role: user_role, assigned_by: current_user ) log_activity(:assign_user_to_project) + + UserAssignments::PropagateAssignmentJob.perform_later( + @project, + @user, + user_role, + current_user + ) end end @@ -41,9 +50,17 @@ class ProjectMember return false unless valid? ActiveRecord::Base.transaction do + user_role = set_user_role user_assignment = UserAssignment.find_by!(assignable: @project, user: @user) - user_assignment.update!(user_role: set_user_role) + user_assignment.update!(user_role: user_role) log_activity(:change_user_role_on_project) + + UserAssignments::PropagateAssignmentJob.perform_later( + @project, + @user, + user_role, + current_user + ) end end @@ -56,6 +73,14 @@ class ProjectMember user_assignment.destroy! user_project.destroy! log_activity(:unassign_user_from_project) + + UserAssignments::PropagateAssignmentJob.perform_later( + @project, + @user, + user_role, + current_user, + destroy: true + ) end end diff --git a/config/routes.rb b/config/routes.rb index a78b4b7a0..13d885033 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -702,13 +702,13 @@ Rails.application.routes.draw do resources :reports, only: %i(index show), path: 'reports', as: :reports resources :experiments, only: %i(index show create update) do resources :user_assignments, - only: %i(index show create update), + only: %i(index show update), controller: :experiment_user_assignments resources :task_groups, only: %i(index show) resources :connections, only: %i(index show) resources :tasks, only: %i(index show create update) do resources :user_assignments, - only: %i(index show create update), + only: %i(index show update), controller: :task_user_assignments resources :task_inventory_items, only: %i(index show), path: 'items', diff --git a/spec/models/experiment_member_spec.rb b/spec/models/experiment_member_spec.rb index 631d954c1..d569ee2eb 100644 --- a/spec/models/experiment_member_spec.rb +++ b/spec/models/experiment_member_spec.rb @@ -19,43 +19,6 @@ describe ExperimentMember, type: :model do let(:subject) { described_class.new(user, experiment, project) } - describe '#handle_change' do - let!(:valid_params) do - { - user_id: user.id, - user_role_id: normal_user_role.id - } - end - - it 'creates a new user assigment when no assigment present' do - expect { - subject.handle_change(valid_params) - }.to change(UserAssignment, :count).by(1) - end - - it 'removes the user assigment if the project role is the same as selected one' do - create :user_assignment, assignable: experiment, user: user, user_role: owner_role, assigned_by: user - create :user_assignment, assignable: project, user: user, user_role: normal_user_role, assigned_by: user - - expect { - subject.handle_change(valid_params) - }.to change(UserAssignment, :count).by(-1) - end - - it 'updates the assigment user role' do - assigment = create :user_assignment, assignable: experiment, user: user, user_role: owner_role, assigned_by: user - subject.handle_change(valid_params) - expect(assigment.reload.user_role).to eq normal_user_role - end - - it 'logs a change_user_role_on_experiment activity' do - expect { - subject.handle_change(valid_params) - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'change_user_role_on_experiment' - end - end - describe '#update' do let!(:experiment_user_assignment) do create :user_assignment, @@ -86,53 +49,4 @@ describe ExperimentMember, type: :model do expect(Activity.last.type_of).to eq 'change_user_role_on_experiment' end end - - describe '#destroy' do - let!(:experiment_user_assignment) do - create :user_assignment, - assignable: experiment, - user: user, - user_role: owner_role, - assigned_by: user - end - - let!(:subject) { described_class.new(user, experiment, project, user, experiment_user_assignment) } - - it 'destroys the assigment user role' do - expect { - subject.destroy - }.to change(UserAssignment, :count).by(-1) - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.destroy - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'change_user_role_on_experiment' - end - end - - describe '#create' do - let!(:valid_params) do - { - user_id: user.id, - user_role_id: normal_user_role.id - } - end - - let(:subject) { described_class.new(user, experiment, project) } - - it 'creates a new user assigment when no assigment present' do - expect { - subject.create(valid_params) - }.to change(UserAssignment, :count).by(1) - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.create(valid_params) - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'change_user_role_on_experiment' - end - end end diff --git a/spec/models/experiment_spec.rb b/spec/models/experiment_spec.rb index 5df122fdc..393ade1d8 100644 --- a/spec/models/experiment_spec.rb +++ b/spec/models/experiment_spec.rb @@ -273,4 +273,14 @@ describe Experiment, type: :model do end end end + + describe 'after_create_commit' do + it 'triggers the UserAssignments::GenerateUserAssignmentsJob job' do + experiment.created_by = create(:user) + expect(UserAssignments::GenerateUserAssignmentsJob).to receive(:perform_later).with( + experiment, experiment.created_by + ) + experiment.save! + end + end end diff --git a/spec/models/my_module_member_spec.rb b/spec/models/my_module_member_spec.rb index f094d1363..22104b584 100644 --- a/spec/models/my_module_member_spec.rb +++ b/spec/models/my_module_member_spec.rb @@ -18,54 +18,6 @@ describe MyModuleMember, type: :model do let!(:my_module) { create :my_module, experiment: experiment } let(:normal_user_role) { create :normal_user_role } - describe '#handle_change' do - let!(:valid_params) do - { - user_id: user.id, - user_role_id: normal_user_role.id - } - end - - let(:subject) { described_class.new(user, my_module, experiment, project) } - - it 'creates a new user assigment when no assigment present' do - expect { - subject.handle_change(valid_params) - }.to change(UserAssignment, :count).by(1) - end - - it 'removes the user assigment if the experiment role is the same as selected one' do - create :user_assignment, assignable: my_module, user: user, user_role: owner_role, assigned_by: user - create :user_assignment, assignable: experiment, user: user, user_role: normal_user_role, assigned_by: user - - expect { - subject.handle_change(valid_params) - }.to change(UserAssignment, :count).by(-1) - end - - it 'removes the user assigment if the project role is the same as selected one and the experiment assignable does not exist' do - create :user_assignment, assignable: my_module, user: user, user_role: owner_role, assigned_by: user - create :user_assignment, assignable: project, user: user, user_role: normal_user_role, assigned_by: user - - expect { - subject.handle_change(valid_params) - }.to change(UserAssignment, :count).by(-1) - end - - it 'updates the assigment user role' do - assigment = create :user_assignment, assignable: my_module, user: user, user_role: owner_role, assigned_by: user - subject.handle_change(valid_params) - expect(assigment.reload.user_role).to eq normal_user_role - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.handle_change(valid_params) - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'change_user_role_on_my_module' - end - end - describe '#update' do let!(:my_module_user_assignment) do create :user_assignment, @@ -96,53 +48,4 @@ describe MyModuleMember, type: :model do expect(Activity.last.type_of).to eq 'change_user_role_on_my_module' end end - - describe '#destroy' do - let!(:user_assignment) do - create :user_assignment, - assignable: my_module, - user: user, - user_role: owner_role, - assigned_by: user - end - - let!(:subject) { described_class.new(user, my_module, experiment, project, user, user_assignment) } - - it 'destroys the assigment user role' do - expect { - subject.destroy - }.to change(UserAssignment, :count).by(-1) - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.destroy - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'change_user_role_on_my_module' - end - end - - describe '#create' do - let!(:valid_params) do - { - user_id: user.id, - user_role_id: normal_user_role.id - } - end - - let(:subject) { described_class.new(user, my_module, experiment, project) } - - it 'creates a new user assigment when no assigment present' do - expect { - subject.create(valid_params) - }.to change(UserAssignment, :count).by(1) - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.create(valid_params) - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'change_user_role_on_my_module' - end - end end diff --git a/spec/models/my_module_spec.rb b/spec/models/my_module_spec.rb index dfd328e9b..1de78a559 100644 --- a/spec/models/my_module_spec.rb +++ b/spec/models/my_module_spec.rb @@ -106,4 +106,14 @@ describe MyModule, type: :model do it { is_expected.to validate_presence_of :experiment } end end + + describe 'after_create_commit' do + it 'triggers the UserAssignments::GenerateUserAssignmentsJob job' do + my_module.created_by = create(:user) + expect(UserAssignments::GenerateUserAssignmentsJob).to receive(:perform_later).with( + my_module, my_module.created_by + ) + my_module.save! + end + end end diff --git a/spec/models/project_member_spec.rb b/spec/models/project_member_spec.rb index b9c89aa6a..0862a190c 100644 --- a/spec/models/project_member_spec.rb +++ b/spec/models/project_member_spec.rb @@ -28,6 +28,16 @@ describe ProjectMember, type: :model do }.to change(Activity, :count).by(1) expect(Activity.last.type_of).to eq 'assign_user_to_project' end + + it 'triggers the UserAssignments::PropagateAssignmentJob job' do + subject.assign = true + subject.user_role_id = owner_role.id + + expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with( + project, user, owner_role, user + ) + subject.create + end end describe '#update' do @@ -53,6 +63,14 @@ describe ProjectMember, type: :model do }.to change(Activity, :count).by(1) expect(Activity.last.type_of).to eq 'change_user_role_on_project' end + + it 'triggers the UserAssignments::PropagateAssignmentJob job' do + subject.user_role_id = normal_user_role.id + expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with( + project, user, normal_user_role, user + ) + subject.update + end end describe '#destroy' do @@ -96,6 +114,13 @@ describe ProjectMember, type: :model do }.to change(Activity, :count).by(1) expect(Activity.last.type_of).to eq 'unassign_user_from_project' end + + it 'triggers the UserAssignments::PropagateAssignmentJob job' do + expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with( + project, user, owner_role, user, destroy: true + ) + subject.destroy + end end describe 'validations' do diff --git a/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb b/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb index 97c179c12..44770972b 100644 --- a/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb +++ b/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb @@ -118,113 +118,15 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do end end - describe 'POST user_assignment, #create' do - before :all do - @valid_headers['Content-Type'] = 'application/json' - create :user_assignment, - assignable: @own_project, - user: @another_user, - user_role: @owner_role, - assigned_by: @user - end - - let(:action) do - post api_v1_team_project_experiment_user_assignments_path( - team_id: @team.id, - project_id: @own_project.id, - experiment_id: @own_experiment.id - ), params: request_body.to_json, headers: @valid_headers - end - - context 'when has valid params' do - let(:request_body) do - { - data: { - type: 'experiment_user_assignments', - attributes: { - user_id: @another_user.id, - user_role_id: @normal_user_role.id - } - } - } - end - - it 'creates new user_assignment' do - expect { action }.to change { UserAssignment.count }.by(1) - end - - it 'returns status 201' do - action - - expect(response).to have_http_status 201 - end - - it 'returns well formated response' do - action - - expect(json).to match( - hash_including( - data: hash_including( - type: 'experiment_user_assignments', - relationships: hash_including( - user: hash_including(data: hash_including(id: @another_user.id.to_s)), - user_role: hash_including(data: hash_including(id: @normal_user_role.id.to_s)) - ) - ) - ) - ) - end - end - - context 'when has missing param' do - let(:request_body) do - { - data: { - type: 'experiment_user_assignments', - attributes: {} - } - } - end - - it 'renders 400' do - action - - expect(response).to have_http_status(400) - end - end - - context 'when user is not an owner of the project' do - let(:request_body) do - { - data: { - type: 'experiment_user_assignments', - attributes: { - user_id: @another_user.id, - user_role_id: @normal_user_role.id - } - } - } - end - - it 'renders 403' do - post( - api_v1_team_project_experiment_user_assignments_path( - team_id: @invalid_project.team.id, - project_id: @invalid_project.id, - experiment_id: @invalid_experiment.id - ), - params: request_body.to_json, - headers: @valid_headers - ) - - expect(response).to have_http_status(403) - end - end - end - describe 'PATCH user_assignment, #update' do before :all do @valid_headers['Content-Type'] = 'application/json' + create :user_project, user: @another_user, project: @own_project + create :user_assignment, + assignable: @own_project, + user: @another_user, + user_role: @normal_user_role, + assigned_by: @user @user_assignment = create :user_assignment, assignable: @own_experiment, user: @another_user, diff --git a/spec/requests/api/v1/task_user_assignments_controller_spec.rb b/spec/requests/api/v1/task_user_assignments_controller_spec.rb index 2948add1e..b286f1ab1 100644 --- a/spec/requests/api/v1/task_user_assignments_controller_spec.rb +++ b/spec/requests/api/v1/task_user_assignments_controller_spec.rb @@ -127,115 +127,15 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do end end - describe 'POST user_assignment, #create' do - before :all do - @valid_headers['Content-Type'] = 'application/json' - create :user_assignment, - assignable: @own_project, - user: @another_user, - user_role: @owner_role, - assigned_by: @user - end - - let(:action) do - post(api_v1_team_project_experiment_task_user_assignments_path( - team_id: @team.id, - project_id: @own_project.id, - experiment_id: @own_experiment.id, - task_id: @own_task.id), - params: request_body.to_json, headers: @valid_headers) - end - - context 'when has valid params' do - let(:request_body) do - { - data: { - type: 'task_user_assignments', - attributes: { - user_id: @another_user.id, - user_role_id: @normal_user_role.id - } - } - } - end - - it 'creates new user_assignment' do - expect { action }.to change { UserAssignment.count }.by(1) - end - - it 'returns status 201' do - action - - expect(response).to have_http_status 201 - end - - it 'returns well formated response' do - action - - expect(json).to match( - hash_including( - data: hash_including( - type: 'task_user_assignments', - relationships: hash_including( - user: hash_including(data: hash_including(id: @another_user.id.to_s)), - user_role: hash_including(data: hash_including(id: @normal_user_role.id.to_s)) - ) - ) - ) - ) - end - end - - context 'when has missing param' do - let(:request_body) do - { - data: { - type: 'task_user_assignments', - attributes: {} - } - } - end - - it 'renders 400' do - action - - expect(response).to have_http_status(400) - end - end - - context 'when user is not an owner of the project' do - let(:request_body) do - { - data: { - type: 'task_user_assignments', - attributes: { - user_id: @another_user.id, - user_role_id: @normal_user_role.id - } - } - } - end - - it 'renders 403' do - post( - api_v1_team_project_experiment_task_user_assignments_path( - team_id: @invalid_project.team.id, - project_id: @invalid_project.id, - experiment_id: @invalid_experiment.id, - task_id: @invalid_task.id - ), - params: request_body.to_json, - headers: @valid_headers - ) - - expect(response).to have_http_status(403) - end - end - end - describe 'PATCH user_assignment, #update' do before :all do @valid_headers['Content-Type'] = 'application/json' + create :user_project, user: @another_user, project: @own_project + create :user_assignment, + assignable: @own_project, + user: @another_user, + user_role: @normal_user_role, + assigned_by: @user @user_assignment = create :user_assignment, assignable: @own_task, user: @another_user,