mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-12-28 11:14:24 +08:00
128 lines
5.3 KiB
Ruby
128 lines
5.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe CanvasController do
|
|
login_user
|
|
include_context 'reference_project_structure', {
|
|
skip_my_module: true
|
|
}
|
|
|
|
let(:experiment2) { create :experiment, project: project, created_by: project.created_by }
|
|
|
|
# Idea of this "end to end" test is to put a lot "work" on method `@experiment.udpate_canvas` and controller actipn
|
|
# update also. We've implemented some unit tests on `.update_canvas` itself, but behaviour is tightly coupled with
|
|
# canvas_controller itself. This test should be helpful also for potentional refactoring. Welcome to extend it.
|
|
|
|
describe 'POST update' do
|
|
# What should happen:
|
|
# - Add new task n0
|
|
# - Add new task n1 and move it to Experiment2
|
|
# - Rename task task1, change position to 0, 20
|
|
# - Rename task task2 and archive task2
|
|
# - Add new task n2 on the place of existing task1, previous location
|
|
# - Archive task3 and create new one n4 on position of this one
|
|
# - Clone task task5
|
|
# - Clone task task6, rename task6
|
|
|
|
# Setup environment for "big change" request
|
|
# Tasks in DB
|
|
|
|
|
|
|
|
let!(:task1) { create :my_module, x: 0, y: 1, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task2) { create :my_module, x: 0, y: 2, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task3) { create :my_module, x: 0, y: 3, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task4) { create :my_module, x: 0, y: 4, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task5) { create :my_module, x: 0, y: 5, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task6) { create :my_module, x: 0, y: 6, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task7) { create :my_module, x: 0, y: 7, experiment: experiment, created_by: experiment.created_by }
|
|
let!(:task8) { create :my_module, x: 0, y: 8, experiment: experiment, created_by: experiment.created_by }
|
|
|
|
let!(:step_on_task5) { create :step, name: 'task5_step', protocol: task5.protocol }
|
|
let!(:step_on_task6) { create :step, name: 'task6_step', protocol: task6.protocol }
|
|
|
|
# Positions
|
|
let(:positions) do
|
|
# Dinamicly generate positions stirng from tasks: "1,0,1;2,0,2;3... "
|
|
# Skip some tasks and set position manually (happens when we move them)
|
|
all = %i(5 6 7 8).map { |i| public_send("task#{i}") }.inject('') { |str, el| str + "#{el.id},#{el.x},#{el.y};" }
|
|
all + "#{task1.id},0,20;"
|
|
end
|
|
let(:new_tasks_positions) { 'n0,1,0;n1,1,1;n2,0,1;n3,0,3;n4,4,4;n5,5,5;' }
|
|
|
|
# Tasks for creation
|
|
let(:task_new_items) { 'n0,n1,n2,n3,n4,n5' }
|
|
let(:task_new_items_names) do
|
|
'task_new1|task_new2|task_on_location_of_moved_task1|task_on_location_of_archived_task3|clone_1|clone_2'
|
|
end
|
|
|
|
# Tasks for archiving
|
|
let(:task_archives) { [task4.id, task2.id, task3.id].join(',') }
|
|
|
|
# Tasks for moving
|
|
let(:task_moves) { Hash[task7.id.to_s, experiment2.id.to_s, 'n1', experiment2.id.to_s].to_json }
|
|
|
|
# Tasks for renaming
|
|
let(:task_renames) { Hash[task1.id, 'RenamedTask1', task2.id, 'RenamedTask2', task6.id, 'RenamedTask6'].to_json }
|
|
|
|
# Tasks for cloning
|
|
let(:task_clones) { "#{task5.id},n4;#{task6.id},n5" }
|
|
|
|
let(:action) { post :update, params: params, format: :json }
|
|
let(:params) do
|
|
{
|
|
id: experiment.id,
|
|
positions: positions + new_tasks_positions,
|
|
add: task_new_items,
|
|
'add-names': task_new_items_names,
|
|
rename: task_renames,
|
|
move: task_moves,
|
|
remove: task_archives,
|
|
cloned: task_clones
|
|
}
|
|
end
|
|
|
|
context 'when have a lot changes on canvas' do
|
|
it 'everything goes right, redirected to canvas' do
|
|
action
|
|
[task1, task2, task3, task6].each(&:reload)
|
|
|
|
# Expectations
|
|
# task1 Renamed and moved
|
|
expect(task1.name).to be_eql('RenamedTask1')
|
|
expect({ x: task1.x, y: task1.y }).to(be_eql({ x: 0, y: 20 }))
|
|
|
|
# task2 Renamed and archived
|
|
expect(task2.name).to be_eql('RenamedTask2')
|
|
expect(task2).to be_archived
|
|
|
|
# task3 Archive
|
|
expect(task3).to be_archived
|
|
|
|
# task6 Renamed
|
|
expect(task6.name).to be_eql('RenamedTask6')
|
|
|
|
# create new n4 on position of the archived Task3
|
|
expect(experiment.my_modules.find_by(x: 0, y: 3).name).to(be_eql('task_on_location_of_archived_task3'))
|
|
|
|
# Add new task n2 on the place of existing task1, previous location
|
|
expect(experiment.my_modules.find_by(x: 0, y: 1).name).to(be_eql('task_on_location_of_moved_task1'))
|
|
|
|
# 5 new tasks added to Experiment (clones included)
|
|
names = %w(task_new1 task_on_location_of_moved_task1 task_on_location_of_archived_task3 clone_1 clone_2)
|
|
new_tasks_count = experiment.my_modules.where(name: names).count
|
|
expect(new_tasks_count).to(be_eql(5))
|
|
|
|
# Experiment 2 has change for 2 (moved 2 tasks from Experiment to Experiment2)
|
|
expect(experiment2.my_modules.count).to(be_eql(2))
|
|
|
|
# # Check clones, task5, task6
|
|
expect(experiment.my_modules.find_by(name: 'clone_1').protocol.steps.first.name).to(be_eql('task5_step'))
|
|
expect(experiment.my_modules.find_by(name: 'clone_2').protocol.steps.first.name).to(be_eql('task6_step'))
|
|
|
|
expect(response).to redirect_to canvas_experiment_path(experiment)
|
|
end
|
|
end
|
|
end
|
|
end
|