create user_assignments for all child objects when the user is attached to the project

This commit is contained in:
zmagoD 2021-06-06 09:54:47 +02:00
parent 3d79dd32ad
commit 784e43e328
21 changed files with 232 additions and 564 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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')

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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',

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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,