From 4b4542ab8e6053291a1575d926672804d093de7b Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 20 Sep 2024 16:52:00 +0200 Subject: [PATCH] added test for organizer to edit series reg --- app/services/registration_checker.rb | 8 +++- .../registration_controller_spec.rb | 2 +- spec/services/registration_checker_spec.rb | 38 ++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/app/services/registration_checker.rb b/app/services/registration_checker.rb index 639589a5..ffb0e7a8 100644 --- a/app/services/registration_checker.rb +++ b/app/services/registration_checker.rb @@ -74,7 +74,8 @@ def user_can_modify_registration! raise RegistrationError.new(:unauthorized, ErrorCodes::USER_INSUFFICIENT_PERMISSIONS) unless can_administer_or_current_user? raise RegistrationError.new(:forbidden, ErrorCodes::USER_EDITS_NOT_ALLOWED) unless @competition_info.registration_edits_allowed? || UserApi.can_administer?(@requester_user_id, @competition_info.id) raise RegistrationError.new(:unauthorized, ErrorCodes::REGISTRATION_IS_REJECTED) if user_is_rejected? - raise RegistrationError.new(:forbidden, ErrorCodes::ALREADY_REGISTERED_IN_SERIES) if existing_registration_in_series? + raise RegistrationError.new(:forbidden, ErrorCodes::ALREADY_REGISTERED_IN_SERIES) if + existing_registration_in_series? && !UserApi.can_administer?(@requester_user_id, @competition_info.id) end def user_is_rejected? @@ -173,6 +174,8 @@ def validate_update_status! raise RegistrationError.new(:unprocessable_entity, ErrorCodes::INVALID_REQUEST_DATA) unless Registration::REGISTRATION_STATES.include?(new_status) raise RegistrationError.new(:forbidden, ErrorCodes::COMPETITOR_LIMIT_REACHED) if new_status == 'accepted' && Registration.accepted_competitors_count(@competition_info.competition_id) == @competition_info.competitor_limit + raise RegistrationError.new(:forbidden, ErrorCodes::ALREADY_REGISTERED_IN_SERIES) if + new_status == 'accepted' && existing_registration_in_series? # Otherwise, organizers can make any status change they want to return if UserApi.can_administer?(@requester_user_id, @competition_info.id) @@ -211,7 +214,8 @@ def existing_registration_in_series? return false if @competition_info.other_series_ids.nil? @competition_info.other_series_ids.each do |comp_id| - return Registration.find("#{comp_id}-#{@requestee_user_id}").competing_status != 'cancelled' + series_reg = Registration.find("#{comp_id}-#{@requestee_user_id}") + return !%w[cancelled rejected].include?(series_reg.competing_status) rescue Dynamoid::Errors::RecordNotFound next end diff --git a/spec/controllers/registration_controller_spec.rb b/spec/controllers/registration_controller_spec.rb index 5c3dfb3b..aa3d3e17 100644 --- a/spec/controllers/registration_controller_spec.rb +++ b/spec/controllers/registration_controller_spec.rb @@ -265,7 +265,7 @@ end end - describe '#list_admin', :tag do + describe '#list_admin' do before do @competition = FactoryBot.build(:competition) stub_json(CompetitionApi.url(@competition['id']), 200, @competition.except('qualifications')) diff --git a/spec/services/registration_checker_spec.rb b/spec/services/registration_checker_spec.rb index 339cf133..bcc8619b 100644 --- a/spec/services/registration_checker_spec.rb +++ b/spec/services/registration_checker_spec.rb @@ -1386,7 +1386,7 @@ end end - it 'cannot move to less than position 1', :tag2 do + it 'cannot move to less than position 1' do @waiting_list.add(FactoryBot.create(:registration, registration_status: 'waiting_list').user_id) @waiting_list.add(FactoryBot.create(:registration, registration_status: 'waiting_list').user_id) @waiting_list.add(FactoryBot.create(:registration, registration_status: 'waiting_list').user_id) @@ -1557,6 +1557,42 @@ it_behaves_like 'update succeed: qualification enforced', 'can register when minx average exists for ranking-average', ['minx'] end end + + describe '#update_registration_allowed!.organizer updates series reg' do + it 'organizer cant set status to accepted if attendee is accepted for another series comp' do + cancelled_registration = FactoryBot.create(:registration, registration_status: 'cancelled') + FactoryBot.create(:registration, user_id: cancelled_registration['user_id'], registration_status: 'accepted', competition_id: 'CubingZAWarmup2023') + + series_competition_info = CompetitionInfo.new(FactoryBot.build(:competition, :series)) + + update_request = FactoryBot.build(:update_request, :organizer_for_user, user_id: cancelled_registration[:user_id], competing: { 'status' => 'accepted' }) + + expect { + RegistrationChecker.update_registration_allowed!(update_request, series_competition_info, update_request['submitted_by']) + }.to raise_error(RegistrationError) do |error| + expect(error.error).to eq(ErrorCodes::ALREADY_REGISTERED_IN_SERIES) + expect(error.http_status).to eq(:forbidden) + end + end + + it 'organizer can update admin comment in attendees non-accepted series comp registration' do + cancelled_registration = FactoryBot.create(:registration, registration_status: 'cancelled') + FactoryBot.create(:registration, user_id: cancelled_registration['user_id'], registration_status: 'accepted', competition_id: 'CubingZAWarmup2023') + + series_competition_info = CompetitionInfo.new(FactoryBot.build(:competition, :series)) + + update_request = FactoryBot.build( + :update_request, + :organizer_for_user, + user_id: cancelled_registration[:user_id], + competing: { 'admin_comment' => 'why they were cancelled' } + ) + + expect { + RegistrationChecker.update_registration_allowed!(update_request, series_competition_info, update_request['submitted_by']) + }.not_to raise_error + end + end end describe '#bulk_update' do