diff --git a/Changelog.md b/Changelog.md index 3967191066..3d980d3176 100644 --- a/Changelog.md +++ b/Changelog.md @@ -29,6 +29,7 @@ ### 🔧 Internal changes - Fixed flaky test `can bulk assign duplicated TAs to grade entry students` in `/spec/models/grade_entry_student_spec.rb` (#7958) +- Added tests for `GroupsController` to fully cover `global_actions` (#7955) - Added tests for `graders_controller` to fully cover `grader_criteria_mapping` function (#7949) - Added tests for `GradersController` to fully cover `grader_groupers_mapping` (#7946) - Added seed task to assign TAs to A1 groupings and criteria (#7867) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 78ce50cb87..b73b3165a2 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -713,7 +713,7 @@ def add_member(student, grouping, assignment) # Generate a warning if a member is added to a group and they # have fewer grace days credits than already used by that group if student.remaining_grace_credits < grouping.grace_period_deduction_single - @warning_grace_day = I18n.t('groups.grace_day_over_limit', group: grouping.group.group_name) + flash_message(:warning, I18n.t('groups.grace_day_over_limit', group: grouping.group.group_name)) end grouping.reload diff --git a/doc/markus-contributors.txt b/doc/markus-contributors.txt index 3915d2ac4e..58c39f6d41 100644 --- a/doc/markus-contributors.txt +++ b/doc/markus-contributors.txt @@ -1,4 +1,5 @@ Aaron Lee +Aayush Karki Abdelhamid Benmouffok Adam Goucher Aimen Khan diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb index ce27a90f89..0ffea5db2c 100644 --- a/spec/controllers/groups_controller_spec.rb +++ b/spec/controllers/groups_controller_spec.rb @@ -797,6 +797,15 @@ describe '#validate_groupings' do let(:grouping) { create(:grouping_with_inviter) } + it 'should return a bad request when no grouping is selected.' do + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [], + global_actions: 'valid' } + expect(response).to have_http_status(:bad_request) + expect(flash[:error]).to have_message(I18n.t('groups.select_a_group')) + end + it 'should validate groupings' do post_as instructor, :global_actions, params: { course_id: course.id, assignment_id: grouping.assignment.id, @@ -844,6 +853,7 @@ describe '#add_members' do let(:grouping) { create(:grouping_with_inviter) } + let(:grouping2) { create(:grouping_with_inviter, assignment: grouping.assignment) } let(:student1) { create(:student) } let(:student2) { create(:student) } @@ -856,6 +866,85 @@ expect(grouping.students.size).to eq 3 end + + it 'should return bad request when more than one grouping is selected' do + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [grouping, grouping2], + students: [student1.id], + global_actions: 'assign' } + expect(response).to have_http_status(:bad_request) + expect(flash[:error]).to have_message(I18n.t('groups.select_only_one_group')) + end + + it 'should return bad request when no students are selected' do + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [grouping], + students: [], + global_actions: 'assign' } + expect(response).to have_http_status(:bad_request) + expect(flash[:error]).to have_message(I18n.t('groups.select_a_student')) + end + + it 'should return bad request when assigning would exceed group_max' do + grouping.assignment.update!(group_max: 1, student_form_groups: true) + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [grouping], + students: [student1.id], + global_actions: 'assign' } + expect(response).to have_http_status(:bad_request) + expect(flash[:error]).to have_message(I18n.t('groups.assign_over_limit', group: grouping.group.group_name)) + end + + it 'should assign inviter status when grouping has no members' do + empty_grouping = create(:grouping) + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: empty_grouping.assignment.id, + groupings: [empty_grouping], + students: [student1.id], + global_actions: 'assign' } + expect(empty_grouping.student_memberships.reload.find_by(role: student1).membership_status) + .to eq(StudentMembership::STATUSES[:inviter]) + end + + it 'should return bad request when student is already in a group for this assignment' do + create(:grouping_with_inviter, assignment: grouping.assignment, inviter: student1) + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [grouping], + students: [student1.id], + global_actions: 'assign' } + expect(response).to have_http_status(:bad_request) + expect(flash[:error]).to have_message(I18n.t('groups.invite_member.errors.already_grouped', + user_name: student1.user_name)) + end + + it 'should return bad request when student cannot be invited' do + diff_course_student = create(:student) + diff_course_student.update!(course: create(:course)) + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [grouping], + students: [diff_course_student.id], + global_actions: 'assign' } + expect(response).to have_http_status(:bad_request) + expect(flash[:error]).to have_message(I18n.t('groups.invite_member.errors.not_found', + user_name: diff_course_student.user_name)) + end + + it 'should flash a warning when student has insufficient grace credits' do + student1.update!(grace_credits: 0) + allow_any_instance_of(Grouping).to receive(:grace_period_deduction_single).and_return(1) + post_as instructor, :global_actions, params: { course_id: course.id, + assignment_id: grouping.assignment.id, + groupings: [grouping], + students: [student1.id], + global_actions: 'assign' } + expect(flash[:warning]).to have_message(I18n.t('groups.grace_day_over_limit', group: grouping.group.group_name)) + expect(grouping.student_memberships.reload.find_by(role: student1)).to be_present + end end describe '#remove_members' do