diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index fc09cfca8..e487264cc 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -350,7 +350,7 @@ class ProjectsController < ApplicationController def notifications @modules = @project.assigned_modules(current_user).order(due_date: :desc) render json: { - html: render_to_string(partial: 'notifications') + html: render_to_string(partial: 'notifications', formats: :html) } end diff --git a/app/controllers/repository_rows_controller.rb b/app/controllers/repository_rows_controller.rb index d0b01d61d..00c8a55c5 100644 --- a/app/controllers/repository_rows_controller.rb +++ b/app/controllers/repository_rows_controller.rb @@ -84,6 +84,31 @@ class RepositoryRowsController < ApplicationController end end + def show + @repository_row = RepositoryRow.find_by(id: params[:id]) + @my_module = MyModule.find_by(id: params[:my_module_id]) + return render_404 unless @repository_row + return render_404 unless @repository_row.repository_id == params[:repository_id].to_i + return render_403 unless can_read_repository?(@repository_row.repository) + return render_403 if @my_module && !can_read_my_module?(@my_module) + + if @my_module + @my_module_assign_error = if !can_assign_my_module_repository_rows?(@my_module) + I18n.t('repository_row.modal_info.assign_to_task_error.no_access') + elsif @repository_row.my_modules.where(id: @my_module.id).any? + I18n.t('repository_row.modal_info.assign_to_task_error.already_assigned') + end + end + + @assigned_modules = @repository_row.my_modules.joins(experiment: :project) + @viewable_modules = @assigned_modules.viewable_by_user(current_user, current_user.teams) + @private_modules = @assigned_modules - @viewable_modules + + render json: { + html: render_to_string(partial: 'repositories/repository_row_info_modal', formats: :html) + } + end + def validate_label_template_columns label_template = LabelTemplate.where(team_id: current_team.id).find(params[:label_template_id]) diff --git a/app/controllers/team_repositories_controller.rb b/app/controllers/team_repositories_controller.rb index 3840fbeea..266ddaefe 100644 --- a/app/controllers/team_repositories_controller.rb +++ b/app/controllers/team_repositories_controller.rb @@ -6,7 +6,7 @@ class TeamRepositoriesController < ApplicationController # DELETE :team_id/repositories/:repository_id/team_repositories/:id def destroy - team_shared_object = @repository.team_shared_objects.find(destory_params[:id]) + team_shared_object = @repository.team_shared_objects.find(destroy_params[:id]) ActiveRecord::Base.transaction do log_activity(:unshare_inventory, team_shared_object) team_shared_object.destroy! @@ -50,7 +50,7 @@ class TeamRepositoriesController < ApplicationController params.permit(:team_id, :repository_id, :target_team_id, :permission_level) end - def destory_params + def destroy_params params.permit(:team_id, :id) end diff --git a/spec/controllers/access_permissions/experiments_controller_spec.rb b/spec/controllers/access_permissions/experiments_controller_spec.rb index 976f6df4e..af2c59257 100644 --- a/spec/controllers/access_permissions/experiments_controller_spec.rb +++ b/spec/controllers/access_permissions/experiments_controller_spec.rb @@ -58,7 +58,7 @@ describe AccessPermissions::ExperimentsController, type: :controller do { id: experiment.id, project_id: project.id, - experiment_member: { + user_assignment: { user_role_id: technician_role.id, user_id: viewer_user.id } diff --git a/spec/controllers/access_permissions/my_modules_controller_spec.rb b/spec/controllers/access_permissions/my_modules_controller_spec.rb index 7d16bcd97..a6be67dea 100644 --- a/spec/controllers/access_permissions/my_modules_controller_spec.rb +++ b/spec/controllers/access_permissions/my_modules_controller_spec.rb @@ -61,7 +61,7 @@ describe AccessPermissions::MyModulesController, type: :controller do id: my_module.id, experiment_id: experiment.id, project_id: project.id, - my_module_member: { + user_assignment: { user_role_id: technician_role.id, user_id: viewer_user.id } diff --git a/spec/controllers/access_permissions/projects_controller_spec.rb b/spec/controllers/access_permissions/projects_controller_spec.rb index d7f351ec9..4ef1f36c1 100644 --- a/spec/controllers/access_permissions/projects_controller_spec.rb +++ b/spec/controllers/access_permissions/projects_controller_spec.rb @@ -100,7 +100,7 @@ describe AccessPermissions::ProjectsController, type: :controller do let(:valid_params) do { id: project.id, - project_member: { + user_assignment: { user_role_id: technician_role.id, user_id: normal_user.id } @@ -127,7 +127,7 @@ describe AccessPermissions::ProjectsController, type: :controller do let(:valid_params) do { id: project.id, - access_permissions_new_user_project_form: { + access_permissions_new_user_form: { resource_members: { 0 => { assign: '1', @@ -193,8 +193,7 @@ describe AccessPermissions::ProjectsController, type: :controller do it 'removes the user project and user assigment record' do expect { delete :destroy, params: valid_params, format: :json - }.to change(UserProject, :count).by(-1).and \ - change(UserAssignment, :count).by(-1) + }.to change(UserAssignment, :count).by(-1) end it 'renders 403 if user does not have manage permissions on project' do diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 01f7ed283..7473b190a 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -68,8 +68,10 @@ describe ProjectsController, type: :controller do let(:action) { put :update, params: params } let(:params) do { id: projects.first.id, - project: { name: projects.first.name, team_id: projects.first.team.id, - visibility: projects.first.visibility } } + project: { name: projects.first.name, + team_id: projects.first.team.id, + visibility: projects.first.visibility, + default_public_user_role_id: projects.first.default_public_user_role.id } } end it 'returns redirect response' do @@ -78,10 +80,10 @@ describe ProjectsController, type: :controller do expect(response.media_type).to eq 'text/html' end - it 'calls create activity service (change_project_visibility)' do + it 'calls create activity service (project_grant_access_to_all_team_members)' do params[:project][:visibility] = 'visible' expect(Activities::CreateActivityService).to receive(:call) - .with(hash_including(activity_type: :change_project_visibility)) + .with(hash_including(activity_type: :project_grant_access_to_all_team_members)) action end diff --git a/spec/controllers/protocols_controller_spec.rb b/spec/controllers/protocols_controller_spec.rb index 25b4e2139..6855541f1 100644 --- a/spec/controllers/protocols_controller_spec.rb +++ b/spec/controllers/protocols_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe ProtocolsController, type: :controller do login_user - include_context 'reference_project_structure' + include_context 'reference_project_structure', { team_role: :owner } describe 'POST create' do let(:action) { post :create, params: params, format: :json } @@ -78,10 +78,12 @@ describe ProtocolsController, type: :controller do protocol: { name: 'my_test_protocol', description: 'description', - authors: 'authors' + authors: 'authors', + elnVersion: '1.0', } } end + let(:action) { post :import, params: params, format: :json } it 'calls create activity for importing protocols' do @@ -98,9 +100,9 @@ describe ProtocolsController, type: :controller do end end - describe 'PUT description' do + describe 'PATCH description' do let(:protocol) do - create :protocol, :in_public_repository, team: team, added_by: user + create :protocol, :in_repository_draft, team: team, added_by: user end let(:params) do { @@ -110,8 +112,7 @@ describe ProtocolsController, type: :controller do } } end - let(:action) { put :update_description, params: params, format: :json } - + let(:action) { patch :update_description, params: params, format: :json } it 'calls create activity for updating description' do expect(Activities::CreateActivityService) .to(receive(:call) @@ -126,14 +127,14 @@ describe ProtocolsController, type: :controller do end end - describe 'POST update_keywords' do + describe 'PATCH update_keywords' do let(:protocol) do - create :protocol, :in_public_repository, team: team, added_by: user + create :protocol, :in_repository_draft, team: team, added_by: user end - let(:action) { put :update_keywords, params: params, format: :json } let(:params) do { id: protocol.id, keywords: ['keyword-1', 'keyword-2'] } end + let(:action) { patch :update_keywords, params: params, format: :json } it 'calls create activity for updating keywords' do expect(Activities::CreateActivityService) @@ -151,7 +152,7 @@ describe ProtocolsController, type: :controller do context 'update protocol' do let(:protocol_repo) do - create :protocol, :in_public_repository, name: ' test protocol', + create :protocol, :in_repository_published_original, name: ' test protocol', team: team, added_by: user end @@ -165,7 +166,7 @@ describe ProtocolsController, type: :controller do let(:params) { { id: protocol.id } } describe 'POST revert' do - let(:action) { put :revert, params: params, format: :json } + let(:action) { post :revert, params: params, format: :json } it 'calls create activity for updating protocol in task from repository' do expect(Activities::CreateActivityService) @@ -184,13 +185,13 @@ describe ProtocolsController, type: :controller do describe 'POST load_from_repository' do let(:protocol_source) do - create :protocol, :in_public_repository, team: team, added_by: user + create :protocol, :in_repository_published_original, team: team, added_by: user end let(:protocol) { create :protocol, team: team, added_by: user, my_module: my_module } - let(:action) { put :load_from_repository, params: params, format: :json } let(:params) do { source_id: protocol_source.id, id: protocol.id } end + let(:action) { post :load_from_repository, params: params, format: :json } it 'calls create activity for loading protocol to task from repository' do expect(Activities::CreateActivityService) @@ -210,13 +211,14 @@ describe ProtocolsController, type: :controller do let(:protocol) do create :protocol, my_module: my_module, team: team, added_by: user end - let(:action) { put :load_from_file, params: params, format: :json } let(:params) do { id: protocol.id, protocol: { name: 'my_test_protocol', description: 'description', - authors: 'authors' } } + authors: 'authors', + elnVersion: '1.1'} } end + let(:action) { post :load_from_file, params: params, format: :json } it 'calls create activity for loading protocol to task from file' do expect(Activities::CreateActivityService) diff --git a/spec/controllers/result_tables_controller_spec.rb b/spec/controllers/result_tables_controller_spec.rb index abfe161d5..3cfa5b923 100644 --- a/spec/controllers/result_tables_controller_spec.rb +++ b/spec/controllers/result_tables_controller_spec.rb @@ -16,7 +16,8 @@ describe ResultTablesController, type: :controller do result: { name: 'result name created', table_attributes: - { contents: '{\"data\":[[\"a\",\"b\",\"1\",null,null]]}' } } } + { contents: '{\"data\":[[\"a\",\"b\",\"1\",null,null]]}', + metadata: "{\"cells\":[{\"row\":\"0\",\"col\":\"0\",\"className\":\"\",\"calculated\":\"\"}]}" } } } end it 'calls create activity service' do diff --git a/spec/controllers/steps_controller_spec.rb b/spec/controllers/steps_controller_spec.rb index 9a5aae59e..a9157a772 100644 --- a/spec/controllers/steps_controller_spec.rb +++ b/spec/controllers/steps_controller_spec.rb @@ -10,7 +10,7 @@ describe StepsController, type: :controller do } let(:protocol_repo) do - create :protocol, :in_public_repository, team: team, added_by: user + create :protocol, :in_repository_draft, team: team, added_by: user end let(:step_repo) { create :step, protocol: protocol_repo } diff --git a/spec/controllers/team_repositories_controller_spec.rb b/spec/controllers/team_repositories_controller_spec.rb index ca256fe15..99a043c7d 100644 --- a/spec/controllers/team_repositories_controller_spec.rb +++ b/spec/controllers/team_repositories_controller_spec.rb @@ -12,11 +12,11 @@ describe TeamRepositoriesController, type: :controller do describe 'DELETE destroy' do let(:second_team) { create :team, created_by: user } - let(:team_repository) { create :team_repository, :read, team: second_team, repository: repository } + let(:team_repository) { create :team_shared_object, :read, team: second_team, shared_object: repository } context 'when resource can be deleted' do let(:action) do - delete :destroy, params: { repository_id: repository.id, team_id: team.id, id: team_repository.id } + delete :destroy, params: { team_id: team.id, id: team_repository.id } end it 'renders 204' do diff --git a/spec/factories/settings.rb b/spec/factories/settings.rb index b3f02d575..37b0012aa 100644 --- a/spec/factories/settings.rb +++ b/spec/factories/settings.rb @@ -4,5 +4,15 @@ FactoryBot.define do factory :settings do type { Faker::Lorem.sentence.split(' ').sample } values { { key_of_data: Faker::Lorem.sentence.split(' ').sample } } + + trait :with_load_values_from_env_defined do + after(:build) do |application_settings| + application_settings.define_singleton_method(:load_values_from_env) do + { + some_key: Faker::Lorem.sentence.split(' ').sample + } + end + end + end end end diff --git a/spec/factories/team_shared_objects.rb b/spec/factories/team_shared_objects.rb index 23cc8ab15..3f94db7cd 100644 --- a/spec/factories/team_shared_objects.rb +++ b/spec/factories/team_shared_objects.rb @@ -1,10 +1,7 @@ # frozen_string_literal: true -# frozen_string_literal: true - FactoryBot.define do factory :team_shared_object do - repository trait :read do permission_level { :shared_read } end diff --git a/spec/factories/user_assignments.rb b/spec/factories/user_assignments.rb index e2024830c..a68c27ee3 100644 --- a/spec/factories/user_assignments.rb +++ b/spec/factories/user_assignments.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.define do factory :user_assignment do end diff --git a/spec/factories/user_roles.rb b/spec/factories/user_roles.rb index 1366c0fa6..5cee11a01 100644 --- a/spec/factories/user_roles.rb +++ b/spec/factories/user_roles.rb @@ -2,9 +2,7 @@ FactoryBot.define do factory :user_role do factory :owner_role do name { I18n.t('user_roles.predefined.owner') } - permissions { ProjectPermissions.constants.map { |const| ProjectPermissions.const_get(const) } + - ExperimentPermissions.constants.map { |const| ExperimentPermissions.const_get(const) } + - MyModulePermissions.constants.map { |const| MyModulePermissions.const_get(const) } } + permissions { PredefinedRoles::OWNER_PERMISSIONS } predefined { true } end diff --git a/spec/fixtures/files/protocol_importers/normalized_single_protocol.json b/spec/fixtures/files/protocol_importers/normalized_single_protocol.json index 29b823e1b..53224da46 100644 --- a/spec/fixtures/files/protocol_importers/normalized_single_protocol.json +++ b/spec/fixtures/files/protocol_importers/normalized_single_protocol.json @@ -6,9 +6,9 @@ "published_on": 1516132805, "version": 0, "source_id": 9451, - "name": "CUT\u0026RUN: Targeted in situ genome-wide profiling with high efficiency for low cell numbers", + "name": "CUT&RUN: Targeted in situ genome-wide profiling with high efficiency for low cell numbers", "description": { - "body": "\u003cdiv class = \"text-blocks\"\u003e\u003cdiv class = \"text-block\"\u003eCleavage Under Targets and Release Using Nuclease (CUT\u0026RUN) is an epigenomic profiling strategy in which antibody-targeted controlled cleavage by micrococcal nuclease releases specific protein-DNA complexes into the supernatant for paired-end DNA sequencing. As only the targeted fragments enter into solution, and the vast majority of DNA is left behind, CUT\u0026RUN has exceptionally low background levels. CUT\u0026RUN outperforms the most widely used Chromatin Immunoprecipitation (ChIP) protocols in resolution, signal-to-noise, and depth of sequencing required. In contrast to ChIP, CUT\u0026RUN is free of solubility and DNA accessibility artifacts and can be used to profile insoluble chromatin and to detect long-range 3D contacts without cross-linking. Here we present an improved CUT\u0026RUN protocol that does not require isolation of nuclei and provides high-quality data starting with only 100 cells for a histone modification and 1000 cells for a transcription factor. From cells to purified DNA CUT\u0026RUN requires less than a day at the lab bench.\u003c/div\u003e\u003cdiv class = \"text-block\"\u003eIn summary, CUT\u0026RUN has several advantages over ChIP-seq: (1) The method is performed in situ in non-crosslinked cells and does not require chromatin fragmentation or solubilization; (2) The intrinsically low background allows low sequence depth and identification of low signal genomic features invisible to ChIP; (3) The simple procedure can be completed within a day and is suitable for robotic automation; (4) The method can be used with low cell numbers compared to existing methodologies; (5) A simple spike-in strategy can be used for accurate quantitation of protein-DNA interactions. As such, CUT\u0026RUN represents an attractive replacement for ChIPseq, which is one of the most popular methods in biological research.\u003c/div\u003e\u003c/div\u003e", + "body": "
Cleavage Under Targets and Release Using Nuclease (CUT&RUN) is an epigenomic profiling strategy in which antibody-targeted controlled cleavage by micrococcal nuclease releases specific protein-DNA complexes into the supernatant for paired-end DNA sequencing. As only the targeted fragments enter into solution, and the vast majority of DNA is left behind, CUT&RUN has exceptionally low background levels. CUT&RUN outperforms the most widely used Chromatin Immunoprecipitation (ChIP) protocols in resolution, signal-to-noise, and depth of sequencing required. In contrast to ChIP, CUT&RUN is free of solubility and DNA accessibility artifacts and can be used to profile insoluble chromatin and to detect long-range 3D contacts without cross-linking. Here we present an improved CUT&RUN protocol that does not require isolation of nuclei and provides high-quality data starting with only 100 cells for a histone modification and 1000 cells for a transcription factor. From cells to purified DNA CUT&RUN requires less than a day at the lab bench.
In summary, CUT&RUN has several advantages over ChIP-seq: (1) The method is performed in situ in non-crosslinked cells and does not require chromatin fragmentation or solubilization; (2) The intrinsically low background allows low sequence depth and identification of low signal genomic features invisible to ChIP; (3) The simple procedure can be completed within a day and is suitable for robotic automation; (4) The method can be used with low cell numbers compared to existing methodologies; (5) A simple spike-in strategy can be used for accurate quantitation of protein-DNA interactions. As such, CUT&RUN represents an attractive replacement for ChIPseq, which is one of the most popular methods in biological research.
", "image": "https://s3.amazonaws.com/pr-journal/rzxfw26.png", "extra_content": [] }, @@ -17,8 +17,22 @@ { "source_id": 601564, "name": "Binding cells to beads", + "attachments": [ + { + "url": "https://pbs.twimg.com/media/Cwu3zrZWQAA7axs.jpg", + "name": "First file" + }, + { + "url": "http://something.com/wp-content/uploads/2014/11/14506718045_5b3e71dacd_o.jpg", + "name": "Second file" + }, + { + "url": "http://something.com/wp-content/uploads/2014/11/14506718045_5b3e71dacd_o.jpg", + "name": "14506718045_5b3e71dacd_o.jpg" + } + ], "description": { - "body": "\u003cdiv class = \"text-blocks\"\u003e\u003cdiv class = \"text-block\"\u003e\u003cspan style = \":justify;\"\u003eHarvest fresh culture(s) at room temperature and count cells. The same protocol can be used for 100 to 250,000 mammalian cells per sample and/or digestion time point.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e", + "body": "
Harvest fresh culture(s) at room temperature and count cells. The same protocol can be used for 100 to 250,000 mammalian cells per sample and/or digestion time point.
", "components": [ { "type": "amount", @@ -60,11 +74,11 @@ }, { "type": "result", - "body": "\u003cdiv class = \"text-blocks\"\u003e\u003cdiv class = \"text-block\"\u003eCentrifuge 3 min... This is expected result with HTML.\u003c/div\u003e\u003c/div\u003e" + "body": "
Centrifuge 3 min... This is expected result with HTML.
" }, { "type": "warning", - "body": "\u003cdiv class = \"text-blocks\"\u003e\u003cdiv class = \"text-block\"\u003eCentrifuge 3 min... This is WARNING with HTML.\u003c/div\u003e\u003c/div\u003e", + "body": "
Centrifuge 3 min... This is WARNING with HTML.
", "details": { "link": "www.warnings.com/be_careful" } @@ -99,34 +113,20 @@ { "type": "note", "author": "Frank Jones", - "body": "\u003cdiv class = \"text-blocks\"\u003e\u003cdiv class = \"text-block\"\u003eCentrifuge 3 min... This is expected result with HTML.\u003c/div\u003e\u003c/div\u003e" + "body": "
Centrifuge 3 min... This is expected result with HTML.
" } ] }, - "attachments": [ - { - "url": "https://pbs.twimg.com/media/Cwu3zrZWQAA7axs.jpg", - "name": "First file" - }, - { - "url": "http://something.com/wp-content/uploads/2014/11/14506718045_5b3e71dacd_o.jpg", - "name": "Second file" - }, - { - "url": "http://something.com/wp-content/uploads/2014/11/14506718045_5b3e71dacd_o.jpg", - "name": "14506718045_5b3e71dacd_o.jpg" - } - ], "position": 0 }, { "source_id": 601565, "name": "Binding cells to beads 2", + "attachments": [], "description": { - "body": "\u003cdiv class = \"text-blocks\"\u003e\u003cdiv class = \"text-block\"\u003eCentrifuge 3 min 600 x g at room temperature and withdraw liquid.\u003c/div\u003e\u003c/div\u003e", + "body": "
Centrifuge 3 min 600 x g at room temperature and withdraw liquid.
", "components": [] }, - "attachments": [], "position": 1 } ] diff --git a/spec/jobs/user_assignments/propagate_assignment_job_spec.rb b/spec/jobs/user_assignments/propagate_assignment_job_spec.rb index eb8da07fd..d700a32af 100644 --- a/spec/jobs/user_assignments/propagate_assignment_job_spec.rb +++ b/spec/jobs/user_assignments/propagate_assignment_job_spec.rb @@ -42,7 +42,7 @@ module UserAssignments 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) + described_class.perform_now(project, user_two.id, technician_role, user_one, destroy: true) }.to change(UserAssignment, :count).by(-4) end diff --git a/spec/models/connection_spec.rb b/spec/models/connection_spec.rb index 7fd9b5ac5..4e8a9296f 100644 --- a/spec/models/connection_spec.rb +++ b/spec/models/connection_spec.rb @@ -13,8 +13,14 @@ describe Connection, type: :model do expect(subject.class).to eq Connection end + describe 'Database table' do + it { should have_db_column :id } + it { should have_db_column :input_id } + it { should have_db_column :output_id } + end + describe 'Relations' do - #it { should belong_to(:to).class_name('MyModule') } - #it { should belong_to(:from).class_name('MyModule') } + it { should belong_to(:to).class_name('MyModule').with_foreign_key('input_id').inverse_of(:inputs) } + it { should belong_to(:from).class_name('MyModule').with_foreign_key('output_id').inverse_of(:outputs) } end end diff --git a/spec/models/connection_step b/spec/models/connection_step deleted file mode 100644 index 78eda9935..000000000 --- a/spec/models/connection_step +++ /dev/null @@ -1,18 +0,0 @@ -require 'rails_helper' - -describe Connection, type: :model do - it 'should be of class Connection' do - expect(subject.class).to eq Connection - end - - describe 'Database table' do - it { should have_db_column :id } - it { should have_db_column :input_id } - it { should have_db_column :output_id } - end - - describe 'Relations' do - it { should belong_to(:to).class_name('MyModule') } - it { should belong_to(:from).class_name('MyModule') } - end -end diff --git a/spec/models/experiment_member_spec.rb b/spec/models/experiment_member_spec.rb deleted file mode 100644 index c05bd1391..000000000 --- a/spec/models/experiment_member_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe ExperimentMember, type: :model do - # let(:owner_role) { create :owner_role } - let!(:user) { create :user } - let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } - let!(:project) { create :project } - let!(:user_project) { create :user_project, user: user, project: project } - let!(:user_assignment) do - create :user_assignment, - assignable: project, - user: user, - user_role: owner_role, - assigned_by: user - end - let!(:experiment) { create :experiment, project: project } - let(:normal_user_role) { create :normal_user_role } - - let(:subject) { described_class.new(user, experiment, project) } - - describe '#update' do - let!(:experiment_user_assignment) do - create :user_assignment, - assignable: experiment, - user: user, - user_role: owner_role, - assigned_by: user - end - - let!(:valid_params) do - { - user_id: user.id, - user_role_id: normal_user_role.id - } - end - - let!(:subject) { described_class.new(user, experiment, project, user, experiment_user_assignment) } - - it 'updates the assigment user role' do - subject.update(valid_params) - expect(experiment_user_assignment.reload.user_role).to eq normal_user_role - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.update(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/my_module_member_spec.rb b/spec/models/my_module_member_spec.rb deleted file mode 100644 index 7c5a9e58f..000000000 --- a/spec/models/my_module_member_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe MyModuleMember, type: :model do - # let(:owner_role) { create :owner_role } - let!(:user) { create :user } - let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } - let!(:project) { create :project, created_by: user } - let!(:experiment) { create :experiment, project: project, created_by: project.created_by } - let!(:my_module) { create :my_module, experiment: experiment, created_by: experiment.created_by } - let(:normal_user_role) { create :normal_user_role } - - describe '#update' 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, user) } - - it 'updates the assigment user role' do - subject.update(valid_params) - expect(subject.user_assignment.user_role).to eq normal_user_role - end - - it 'logs a change_user_role_on_my_module activity' do - expect { - subject.update(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/project_member_spec.rb b/spec/models/project_member_spec.rb deleted file mode 100644 index 3c46ca189..000000000 --- a/spec/models/project_member_spec.rb +++ /dev/null @@ -1,117 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe ProjectMember, type: :model do - let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } - let!(:user) { create :user } - let!(:project) { create :project, created_by: user } - let(:normal_user_role) { create :normal_user_role } - - let(:subject) { described_class.new(user, project, user) } - - describe '#update' do - let!(:user_project) { create :user_project, user: user, project: project } - - it 'updates only the user assignment role' do - subject.user_role_id = normal_user_role.id - subject.update - expect(subject.user_assignment.user_role).to eq normal_user_role - end - - it 'logs a change_user_role_on_project activity' do - subject.user_role_id = normal_user_role.id - expect { - subject.update - }.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.id, normal_user_role, user.id - ) - subject.update - end - end - - describe '#destroy' do - let!(:user_two) { create :user } - let!(:user_project_two) { create :user_project, user: user_two, project: project } - let!(:user_assignment_two) do - create :user_assignment, - assignable: project, - user: user_two, - user_role: owner_role, - assigned_by: user - end - let!(:user_project) { create :user_project, user: user, project: project } - let!(:user_assignment) { project.user_assignments.first } - - it 'removes the user_assignment and user_project' do - expect { - subject.destroy - }.to change(UserAssignment, :count).by(-1).and \ - change(UserProject, :count).by(-1) - end - - it 'does not remove the user_assignment and user_project if the user is last owner' do - user_assignment_two.update!(user_role: normal_user_role) - - expect { - subject.destroy - }.to change(UserAssignment, :count).by(0).and \ - change(UserProject, :count).by(0) - end - - it 'logs a unassign_user_from_project activity' do - expect { - subject.destroy - }.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.id, owner_role, user.id, destroy: true - ) - subject.destroy - end - end - - describe 'validations' do - it 'validates presence or user, project, user_role_id when assign is true' do - subject = described_class.new(nil, nil) - subject.assign = true - subject.valid? - expect(subject.errors).to have_key(:project) - expect(subject.errors).to have_key(:user) - expect(subject.errors).to have_key(:user_role_id) - end - - it 'validates user project assignment existence' do - subject.assign = true - subject.user_assignment.user_role_id = owner_role.id - subject.valid? - expect(subject.errors).to have_key(:user_role_id) - end - - describe 'user_role' do - it 'adds an error when user role does not exist' do - subject.assign = true - subject.user_role_id = 1234 - subject.valid? - expect(subject.errors).to have_key(:user_role_id) - end - - it 'does not add an error when role exists' do - project.user_assignments.destroy_all - subject.assign = true - subject.user_role_id = owner_role.id - subject.valid? - expect(subject.errors).not_to have_key(:user_role_id) - end - end - end -end diff --git a/spec/models/protocol_spec.rb b/spec/models/protocol_spec.rb index da175c8ce..49ffbe44d 100644 --- a/spec/models/protocol_spec.rb +++ b/spec/models/protocol_spec.rb @@ -95,44 +95,6 @@ describe Protocol, type: :model do end end - describe '.publish(user)' do - let(:user) { create :user } - let(:team) { create :team, created_by: user } - let(:protocol) { create :protocol, :in_public_repository, team: team, added_by: user } - - it 'calls create activity for restoring protocol' do - expect(Activities::CreateActivityService) - .to(receive(:call) - .with(hash_including(activity_type: - :move_protocol_in_repository))) - - protocol.publish user - end - - it 'creats one new activity DB' do - expect { protocol.publish(user) }.to change { Activity.count }.by(1) - end - end - - describe '.make_private(user)' do - let(:user) { create :user } - let(:team) { create :team, created_by: user } - let(:protocol) { create :protocol, :in_public_repository, team: team, added_by: user } - - it 'calls create activity for restoring protocol' do - expect(Activities::CreateActivityService) - .to(receive(:call) - .with(hash_including(activity_type: - :move_protocol_in_repository))) - - protocol.make_private user - end - - it 'creats one new activity DB' do - expect { protocol.make_private(user) }.to change { Activity.count }.by(1) - end - end - describe '.deep_clone_repository' do let(:user) { create :user } let(:team) { create :team, created_by: user } diff --git a/spec/models/settings_spec.rb b/spec/models/settings_spec.rb index 3a932c0ba..d608e3894 100644 --- a/spec/models/settings_spec.rb +++ b/spec/models/settings_spec.rb @@ -3,14 +3,20 @@ require 'rails_helper' describe Settings, type: :model do - let(:settings) { build :settings } + let(:settings) { build(:settings) } + let(:application_settings) { build(:settings, :with_load_values_from_env_defined) } + + it 'raises not NotImplementedError' do + expect { settings.load_values_from_env }.to raise_error(NotImplementedError) + end + it 'is valid' do - expect(settings).to be_valid + expect(application_settings).to be_valid end it 'should be of class Settings' do - expect(subject.class).to eq Settings + expect(application_settings.class).to eq Settings end describe 'Database table' do diff --git a/spec/models/team_shared_object_spec.rb b/spec/models/team_shared_object_spec.rb index bd33c089b..f21e903a8 100644 --- a/spec/models/team_shared_object_spec.rb +++ b/spec/models/team_shared_object_spec.rb @@ -7,16 +7,19 @@ describe TeamSharedObject, type: :model do let(:team) { create :team, created_by: user } let(:another_team) { create :team, created_by: user } let(:repository) { create :repository, team: team, created_by: user } - let(:team_shared_object) { build :team_shared_object, :read, team: another_team, shared_repository: repository } + let(:team_shared_object) { create :team_shared_object, :read, team: another_team, shared_object: repository } it 'is valid' do expect(team_shared_object).to be_valid end + it 'should be of class TeamSharedObject' do + expect(subject.class).to eq TeamSharedObject + end - describe 'Associations' do - it { is_expected.to belong_to(:team) } - it { is_expected.to belong_to(:shared_repository) } - it { is_expected.to belong_to(:shared_object) } + describe 'Relations' do + it { should belong_to(:team) } + it { should belong_to(:shared_object) } + it { should belong_to(:shared_repository).optional } end end diff --git a/spec/permissions/controllers/experiments_controller_spec.rb b/spec/permissions/controllers/experiments_controller_spec.rb index 3a84b872c..ec53040ee 100644 --- a/spec/permissions/controllers/experiments_controller_spec.rb +++ b/spec/permissions/controllers/experiments_controller_spec.rb @@ -19,8 +19,20 @@ describe ExperimentsController, type: :controller do move: { id: 1 }, module_archive: { id: 1 }, fetch_workflow_img: { id: 1 }, - sidebar: { id: 1 } - }, [] + sidebar: { id: 1 }, + my_modules: { id: 1 }, + load_table: { id: 1 }, + permissions: { id: 1 }, + assigned_users_to_tasks: { id: 1 }, + batch_clone_my_modules: { id: 1 }, + search_tags: { id: 1 }, + actions_dropdown: { id: 1 }, + archive_my_modules: { id: 1 }, + table: { id: 1 }, + move_modules: { id: 1 }, + move_modules_modal: { id: 1 }, + view_type: { id: 1, view_type: 'table' }, + }, [:set_breadcrumbs_items, :my_modules_view_mode] login_user @@ -87,13 +99,13 @@ describe ExperimentsController, type: :controller do it_behaves_like "a controller action with permissions checking", :get, :clone_modal do let(:testable) { experiment } - let(:permissions) { [ExperimentPermissions::MANAGE] } + let(:permissions) { [ExperimentPermissions::READ] } let(:action_params) { { id: experiment.id } } end it_behaves_like "a controller action with permissions checking", :post, :clone do let(:testable) { experiment } - let(:permissions) { [ExperimentPermissions::MANAGE] } + let(:permissions) { [ExperimentPermissions::READ] } let(:action_params) { { id: experiment.id } } end diff --git a/spec/permissions/controllers/my_module_repositories_controller_spec.rb b/spec/permissions/controllers/my_module_repositories_controller_spec.rb index 9348ca6d4..bf1cb77c2 100644 --- a/spec/permissions/controllers/my_module_repositories_controller_spec.rb +++ b/spec/permissions/controllers/my_module_repositories_controller_spec.rb @@ -7,6 +7,7 @@ describe MyModuleRepositoriesController, type: :controller do it_behaves_like "a controller with authentication", { index_dt: { my_module_id: 1, id: 1 }, + create: { my_module_id: 1, id: 1, my_module_tag: { tag_id: 1, my_module_id: 1 } }, update: { my_module_id: 1, id: 1 }, update_repository_records_modal: { my_module_id: 1, id: 1 }, assign_repository_records_modal: { my_module_id: 1, id: 1 }, diff --git a/spec/permissions/controllers/my_modules_controller_spec.rb b/spec/permissions/controllers/my_modules_controller_spec.rb index 72515ecc2..e2755e769 100644 --- a/spec/permissions/controllers/my_modules_controller_spec.rb +++ b/spec/permissions/controllers/my_modules_controller_spec.rb @@ -16,12 +16,19 @@ describe MyModulesController, type: :controller do update_description: { id: 1 }, update_protocol_description: { id: 1 }, protocols: { id: 1 }, + protocol: { id: 1 }, + update_protocol: { id: 1 }, + provisioning_status: { id: 1 }, + actions_dropdown: { id: 1 }, + new: { id: 1, experiment_id: 1 }, + create: { id: 1, experiment_id: 1 }, + permissions: { id: 1 }, results: { id: 1 }, archive: { id: 1 }, restore_group: { id: 1 }, update_state: { id: 1 }, canvas_dropdown_menu: { id: 1 } - }, [] + }, [:set_breadcrumbs_items] login_user diff --git a/spec/permissions/controllers/projects_controller_spec.rb b/spec/permissions/controllers/projects_controller_spec.rb index 5ccc23676..e41094fe6 100644 --- a/spec/permissions/controllers/projects_controller_spec.rb +++ b/spec/permissions/controllers/projects_controller_spec.rb @@ -12,8 +12,10 @@ describe ProjectsController, type: :controller do show: { id: 1 }, experiments_cards: { id: 1 }, notifications: { id: 1 }, + permissions: { id: 1 }, + actions_dropdown: { id: 1 }, view_type: { id: 1 } - }, [:current_folder] + }, [:current_folder, :set_breadcrumbs_items, :create_tag] login_user diff --git a/spec/support/reference_project_structure_context.rb b/spec/support/reference_project_structure_context.rb index 55cfc0042..4af0c0dc1 100644 --- a/spec/support/reference_project_structure_context.rb +++ b/spec/support/reference_project_structure_context.rb @@ -34,10 +34,10 @@ RSpec.shared_context 'reference_project_structure' do |config| let!(:team_assignment) { create :user_assignment, user: user, assignable: team, user_role: owner_role } end - let!(:project) { create(:project, team: team, created_by: user) } - let!(:projects) { create_list(:project, config[:projects], team: team, created_by: user) } if config[:projects] + let!(:project) { create(:project, team: team, created_by: user, default_public_user_role_id: team_assignment.user_role.id) } + let!(:projects) { create_list(:project, config[:projects], team: team, created_by: user, default_public_user_role_id: team_assignment.user_role.id) } if config[:projects] - let!(:experiment) { create :experiment, project: project, created_by: project.created_by} unless config[:skip_experiment] + let!(:experiment) { create :experiment, project: project, created_by: project.created_by } unless config[:skip_experiment] let!(:experiments) { create_list :experiment, config[:experiments], project: project, created_by: project.created_by } if config[:experiments] let!(:my_module) { create :my_module, experiment: experiment, created_by: experiment.created_by } unless config[:skip_my_module] diff --git a/spec/utilities/protocol_importers/protocols_io/v3/api_client_spec.rb b/spec/utilities/protocol_importers/protocols_io/v3/api_client_spec.rb index 4b1a1b0a7..ea0de2e03 100644 --- a/spec/utilities/protocol_importers/protocols_io/v3/api_client_spec.rb +++ b/spec/utilities/protocol_importers/protocols_io/v3/api_client_spec.rb @@ -10,7 +10,7 @@ describe ProtocolImporters::ProtocolsIo::V3::ApiClient do URL_PUBLICATIONS = "#{CONSTANTS[:base_uri]}publications" let(:query_params) do - { latest: '50' } + { latest: '20' } end let(:stub_protocols) do diff --git a/spec/utilities/protocol_importers/protocols_io/v3/protocol_normalizer_spec.rb b/spec/utilities/protocol_importers/protocols_io/v3/protocol_normalizer_spec.rb index 0d4d9e5cf..d1be8792a 100644 --- a/spec/utilities/protocol_importers/protocols_io/v3/protocol_normalizer_spec.rb +++ b/spec/utilities/protocol_importers/protocols_io/v3/protocol_normalizer_spec.rb @@ -39,7 +39,7 @@ describe ProtocolImporters::ProtocolsIo::V3::ProtocolNormalizer do allow(client_data).to receive_message_chain(:parsed_response) .and_return(protocols_io_single_protocol) - expect(subject.normalize_protocol(client_data).deep_stringify_keys).to be == normalized_protocol + expect(subject.normalize_protocol(client_data).deep_stringify_keys).to eq(normalized_protocol) end end