From 98ad42976927f002c9046169a570f4457577e82d Mon Sep 17 00:00:00 2001 From: khushiagl Date: Thu, 13 Jul 2023 15:54:36 -0400 Subject: [PATCH 1/2] Backend tests for filter by tags --- .../Components/Modals/filter_modal.jsx | 28 +++++++------ .../Components/Result/submission_selector.jsx | 1 + spec/controllers/results_controller_spec.rb | 40 +++++++++++++++++++ 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/Components/Modals/filter_modal.jsx b/app/assets/javascripts/Components/Modals/filter_modal.jsx index 355417b38d..3d86925bdf 100644 --- a/app/assets/javascripts/Components/Modals/filter_modal.jsx +++ b/app/assets/javascripts/Components/Modals/filter_modal.jsx @@ -68,15 +68,20 @@ export class FilterModal extends React.Component { }; renderTasDropdown = () => { - return ( - - ); + if (this.props.role !== "Ta") { + return ( +
+

{I18n.t("results.filters.tas")}

+ +
+ ); + } }; renderTagsDropdown = () => { @@ -299,10 +304,7 @@ export class FilterModal extends React.Component {
-
-

{I18n.t("results.filters.tas")}

- {this.renderTasDropdown()} -
+ {this.renderTasDropdown()}
); diff --git a/spec/controllers/results_controller_spec.rb b/spec/controllers/results_controller_spec.rb index e60572b719..265c1ec324 100644 --- a/spec/controllers/results_controller_spec.rb +++ b/spec/controllers/results_controller_spec.rb @@ -167,7 +167,47 @@ def self.test_unauthorized(route_name) # end # end # end + + context 'filter by tags' do + let!(:tag1) { create :tag, groupings: [grouping1, grouping3] } + let!(:tag2) { create :tag, groupings: [grouping2, grouping3] } + + context 'when a tag has been picked' do + it 'should return the next group with a larger group name that satisfies the constraints' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tags: [tag1.name] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping3.id) + end + + it 'should not return the next group that doesn\'t satisfy the constraint' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tags: [tag1.name] } } + expect(response.parsed_body['next_grouping']['id']).not_to eq(grouping2.id) + end + end + + context 'when multiple tags have been picked' do + it 'should return the next group with a larger group name that has atleast one of the tags' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tags: [tag1, tag2] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping2.id) + end + end + + context 'when no tag has been picked' do + it 'should return the next grouping without constraints' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tags: [] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping2.id) + end + end + end end + shared_examples 'shared ta and instructor tests' do context 'accessing next_grouping' do it 'should receive 200 when current grouping has a submission' do From 294debfe485d02e353bd768748b387dad8c9fdcf Mon Sep 17 00:00:00 2001 From: khushiagl Date: Thu, 13 Jul 2023 16:43:43 -0400 Subject: [PATCH 2/2] Backend tests for filtering by tas --- app/models/grouping.rb | 6 +- spec/controllers/results_controller_spec.rb | 62 ++++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/models/grouping.rb b/app/models/grouping.rb index 0e4dcf5c1f..964e2f33a5 100644 --- a/app/models/grouping.rb +++ b/app/models/grouping.rb @@ -720,7 +720,7 @@ def get_next_grouping(current_role, reversed, filter_data = nil) end results = results.joins(grouping: :group) if !filter_data.nil? - results = filter_groupings(results, filter_data) + results = filter_groupings(current_role, results, filter_data) order_and_get_next_grouping(results, filter_data, reversed) else results = results.order('groups.group_name') @@ -747,7 +747,7 @@ def get_random_incomplete(current_role) private - def filter_groupings(results, filter_data) + def filter_groupings(current_role, results, filter_data) unless filter_data['annotationValue'].nil? || filter_data['annotationValue'] == '' results = results.joins(annotations: :annotation_text) .where('annotation_texts.content LIKE ?', @@ -773,7 +773,7 @@ def filter_groupings(results, filter_data) .where('results.marking_state' => Result::MARKING_STATES[:incomplete]) end end - unless filter_data['tas'].nil? || filter_data['tas'] == [] + unless current_role.ta? || filter_data['tas'].nil? || filter_data['tas'] == [] results = results.joins(grouping: { tas: :user }).where('user.user_name': filter_data['tas']) end unless filter_data['tags'].nil? || filter_data['tags'] == [] diff --git a/spec/controllers/results_controller_spec.rb b/spec/controllers/results_controller_spec.rb index 265c1ec324..25877b3067 100644 --- a/spec/controllers/results_controller_spec.rb +++ b/spec/controllers/results_controller_spec.rb @@ -192,7 +192,7 @@ def self.test_unauthorized(route_name) it 'should return the next group with a larger group name that has atleast one of the tags' do get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, id: grouping1.current_result.id, - direction: 1, filterData: { tags: [tag1, tag2] } } + direction: 1, filterData: { tags: [tag1.name, tag2.name] } } expect(response.parsed_body['next_grouping']['id']).to eq(grouping2.id) end end @@ -1100,6 +1100,49 @@ def self.test_unauthorized(route_name) context 'accessing next_grouping' do include_examples 'ta and instructor #next_grouping with filters' + + context 'filter by tas' do + let(:ta1) { create :ta } + let(:ta2) { create :ta } + let!(:ta_membership1) { create :ta_membership, role: ta1, grouping: grouping1 } + let!(:ta_membership2) { create :ta_membership, role: ta1, grouping: grouping3 } + let!(:ta_membership3) { create :ta_membership, role: ta2, grouping: grouping3 } + let!(:ta_membership4) { create :ta_membership, role: ta2, grouping: grouping2 } + + context 'when a ta has been picked' do + it 'should return the next group with a larger group name that satisfies the constraints' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tas: [ta1.user.user_name] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping3.id) + end + + it 'should not return the next group that doesn\'t satisfy the constraint' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tas: [ta1.user.user_name] } } + expect(response.parsed_body['next_grouping']['id']).not_to eq(grouping2.id) + end + end + + context 'when multiple tas have been picked' do + it 'should return the next group with a larger group name that has atleast one of the tas' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tas: [ta1.user.user_name, ta2.user.user_name] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping2.id) + end + end + + context 'when no Ta is picked' do + it 'should return the next grouping without constraints' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tas: [] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping2.id) + end + end + end end describe '#random_incomplete_submission' do @@ -1399,6 +1442,23 @@ def self.test_unauthorized(route_name) end context 'accessing next_grouping with valid permissions' do include_examples 'ta and instructor #next_grouping with filters' + context 'filter by tas' do + let(:ta1) { create :ta } + let(:ta2) { create :ta } + let!(:ta_membership1) { create :ta_membership, role: ta1, grouping: grouping1 } + let!(:ta_membership2) { create :ta_membership, role: ta1, grouping: grouping3 } + let!(:ta_membership3) { create :ta_membership, role: ta2, grouping: grouping3 } + let!(:ta_membership4) { create :ta_membership, role: ta2, grouping: grouping2 } + + context 'when a ta has been picked' do + it 'should return the next group with a larger group name and not filter by selected ta' do + get :next_grouping, params: { course_id: course.id, grouping_id: grouping1.id, + id: grouping1.current_result.id, + direction: 1, filterData: { tas: [ta1.user.user_name] } } + expect(response.parsed_body['next_grouping']['id']).to eq(grouping2.id) + end + end + end end end end