diff --git a/app/controllers/my_module_repositories_controller.rb b/app/controllers/my_module_repositories_controller.rb index 10e2397f6..61d2b1194 100644 --- a/app/controllers/my_module_repositories_controller.rb +++ b/app/controllers/my_module_repositories_controller.rb @@ -151,7 +151,7 @@ class MyModuleRepositoriesController < ApplicationController end def check_my_module_view_permissions - render_403 unless can_read_experiment?(@my_module.experiment) + render_403 unless can_read_my_module?(@my_module) end def check_repository_view_permissions diff --git a/app/controllers/my_module_repository_snapshots_controller.rb b/app/controllers/my_module_repository_snapshots_controller.rb index de20380c1..e7d6593d7 100644 --- a/app/controllers/my_module_repository_snapshots_controller.rb +++ b/app/controllers/my_module_repository_snapshots_controller.rb @@ -5,7 +5,8 @@ class MyModuleRepositorySnapshotsController < ApplicationController before_action :load_repository, only: :create before_action :load_repository_snapshot, except: %i(create full_view_sidebar select) before_action :check_view_permissions, except: %i(create destroy select) - before_action :check_manage_permissions, only: %i(create destroy select) + before_action :check_manage_permissions, only: %i(destroy select) + before_action :check_create_permissions, only: %i(create) def index_dt @draw = params[:draw].to_i @@ -144,7 +145,11 @@ class MyModuleRepositorySnapshotsController < ApplicationController end def check_view_permissions - render_403 unless can_read_experiment?(@my_module.experiment) + render_403 unless can_read_my_module?(@my_module) + end + + def check_create_permissions + render_403 unless can_create_my_module_repository_snapshots?(@my_module) end def check_manage_permissions diff --git a/spec/factories/repository_snapshots.rb b/spec/factories/repository_snapshots.rb new file mode 100644 index 000000000..4a79ea86e --- /dev/null +++ b/spec/factories/repository_snapshots.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :repository_snapshot do + name { original_repository.name } + status { :ready } + created_by { original_repository.created_by } + team { original_repository.team } + original_repository { repository } + my_module + end +end diff --git a/spec/permissions/controllers/my_module_repositories_controller_spec.rb b/spec/permissions/controllers/my_module_repositories_controller_spec.rb new file mode 100644 index 000000000..935c3454a --- /dev/null +++ b/spec/permissions/controllers/my_module_repositories_controller_spec.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe MyModuleRepositoriesController, type: :controller do + include PermissionExtends + + it_behaves_like "a controller with authentication", { + index_dt: { my_module_id: 1, 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 }, + repositories_list_html: { my_module_id: 1 }, + full_view_table: { my_module_id: 1, id: 1 }, + repositories_dropdown_list: { my_module_id: 1 }, + export_repository: { my_module_id: 1, id: 1 } + }, [] + + login_user + + describe 'permissions checking' do + include_context 'reference_project_structure', { + team_role: :normal_user + } + + let(:repository) { create :repository, team: team } + let (:repository_row) { create :repository_row, repository: repository, created_by: user, last_modified_by: user } + + + it_behaves_like "a controller action with permissions checking", :get, :index_dt do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository.id } } + end + + it_behaves_like "a controller action with permissions checking", :put, :update do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::REPOSITORY_ROWS_ASSIGN] } + let(:action_params) { { my_module_id: my_module.id, id: repository.id, rows_to_assign: [repository_row.id] } } + end + + it_behaves_like "a controller action with permissions checking", :get, :update_repository_records_modal do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :assign_repository_records_modal do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :repositories_list_html do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :full_view_table do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :repositories_dropdown_list do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id } } + end + + it_behaves_like "a controller action with permissions checking", :post, :export_repository do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository.id } } + end + end +end diff --git a/spec/permissions/controllers/my_module_repository_snapshots_controller_spec.rb b/spec/permissions/controllers/my_module_repository_snapshots_controller_spec.rb new file mode 100644 index 000000000..126ca74fd --- /dev/null +++ b/spec/permissions/controllers/my_module_repository_snapshots_controller_spec.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe MyModuleRepositorySnapshotsController, type: :controller do + include PermissionExtends + + it_behaves_like "a controller with authentication", { + index_dt: { my_module_id: 1, id: 1 }, + create: { my_module_id: 1, repository_id: 1 }, + status: { my_module_id: 1, id: 1 }, + show: { my_module_id: 1, id: 1 }, + destroy: { my_module_id: 1, id: 1 }, + full_view_table: { my_module_id: 1, id: 1 }, + full_view_sidebar: { my_module_id: 1, repository_id: 1 }, + select: { my_module_id: 1 }, + export_repository_snapshot: { my_module_id: 1, id: 1 } + }, [] + + login_user + + describe 'permissions checking' do + include_context 'reference_project_structure', { + team_role: :normal_user + } + + let(:repository) { create :repository, team: team } + let (:repository_row) { create :repository_row, repository: repository, created_by: user, last_modified_by: user } + let (:repository_snapshot) { create :repository_snapshot, original_repository: repository, my_module: my_module } + + it_behaves_like "a controller action with permissions checking", :get, :index_dt do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository_snapshot.id } } + end + + it_behaves_like "a controller action with permissions checking", :post, :create do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::REPOSITORY_ROWS_MANAGE] } + let(:action_params) { { my_module_id: my_module.id, repository_id: repository.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :status do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository_snapshot.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :show do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository_snapshot.id } } + end + + it_behaves_like "a controller action with permissions checking", :delete, :destroy do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::REPOSITORY_ROWS_MANAGE] } + let(:action_params) { { my_module_id: my_module.id, id: repository_snapshot.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :full_view_table do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository_snapshot.id } } + end + + it_behaves_like "a controller action with permissions checking", :get, :full_view_sidebar do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, repository_id: repository.id } } + end + + it_behaves_like "a controller action with permissions checking", :post, :select do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::REPOSITORY_ROWS_MANAGE] } + let(:action_params) { { my_module_id: my_module.id, repository_snapshot_id: repository_snapshot.id } } + end + + it_behaves_like "a controller action with permissions checking", :post, :export_repository_snapshot do + let(:testable) { my_module } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: repository_snapshot.id } } + end + end +end