From 50fc7f77c2a8ab3bfe6bbade9df5dfb138415258 Mon Sep 17 00:00:00 2001 From: "rasika.abeyrathna" Date: Fri, 27 Sep 2024 15:50:46 +0100 Subject: [PATCH 1/5] GL-1067: Implement Search Functionality for Exemptions on Category Assessments Page --- .../category_assessments_controller.rb | 35 ++++++++++++++++--- .../category_assessments_controller_spec.rb | 23 ++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/admin/green_lanes/category_assessments_controller.rb b/app/controllers/api/admin/green_lanes/category_assessments_controller.rb index 28990409b..31d46fef9 100644 --- a/app/controllers/api/admin/green_lanes/category_assessments_controller.rb +++ b/app/controllers/api/admin/green_lanes/category_assessments_controller.rb @@ -10,8 +10,8 @@ class CategoryAssessmentsController < AdminController def index options = { is_collection: true } options[:include] = %i[theme] - options[:meta] = pagination_meta(category_assessments) - render json: serialize(category_assessments.to_a, options) + options[:meta] = pagination_meta(category_assessments(search_param)) + render json: serialize(category_assessments(search_param).to_a, options) end def show @@ -99,12 +99,31 @@ def ca_params ) end + def search_param + params.dig(:query, :exemption_code) || '' + end + def record_count @category_assessments.pagination_record_count end - def category_assessments - @category_assessments ||= ::GreenLanes::CategoryAssessment.eager(:theme).order(:id).paginate(current_page, per_page) + def category_assessments(exemption_code) + @category_assessments ||= search_category_assessments(exemption_code) + end + + def search_category_assessments(exemption_code) + return ::GreenLanes::CategoryAssessment.eager(:theme).order(:id).paginate(ca_current_page, per_page) if exemption_code.blank? + + ::GreenLanes::CategoryAssessment + .association_join(:exemptions) + .where( + Sequel.|( + { Sequel[:exemptions][:code] => exemption_code } + ) + ) + .distinct(Sequel[:green_lanes_category_assessments][:id]) + .select_all(:green_lanes_category_assessments) + .eager(:theme).order(Sequel[:green_lanes_category_assessments][:id]).paginate(ca_current_page, per_page) end def green_lanes_measures(category_assessment) @@ -119,10 +138,16 @@ def serialize_errors(category_assessment) Api::Admin::ErrorSerializationService.new(category_assessment).call end + def ca_current_page + Integer(params.dig(:query, :page) || 1) + rescue ArgumentError + 1 + end + def pagination_meta(data_set) { pagination: { - page: current_page, + page: ca_current_page, per_page:, total_count: data_set.pagination_record_count, }, diff --git a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb index d27a1b741..3ff12a12c 100644 --- a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb +++ b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb @@ -23,6 +23,29 @@ it { expect(json_response).to include('meta') } end + context 'with some category assessments, search by exemption code' do + before do + category + end + + let(:make_request) do + authenticated_get api_admin_green_lanes_category_assessments_path(format: :json), params: search_data + end + + let :search_data do + { + query: { + exemption_code: category.exemptions[1].code, + page: 1, + }, + } + end + it { is_expected.to have_http_status :success } + it { expect(json_response).to include('data') } + it { expect(json_response).to include('meta') } + it { expect(json_response['data'].first['attributes']['measure_type_id']).to include(category.measure_type_id.to_s) } + end + context 'without any category assessments' do it { is_expected.to have_http_status :success } it { expect(json_response).to include('data' => []) } From 09c046ac52ec3254416088af4a6d586ef2fb3521 Mon Sep 17 00:00:00 2001 From: "rasika.abeyrathna" Date: Fri, 27 Sep 2024 16:07:48 +0100 Subject: [PATCH 2/5] GL-1067: Implement Search Functionality for Exemptions on Category Assessments Page --- .../api/admin/green_lanes/category_assessments_controller.rb | 4 ++-- .../admin/green_lanes/category_assessments_controller_spec.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/admin/green_lanes/category_assessments_controller.rb b/app/controllers/api/admin/green_lanes/category_assessments_controller.rb index 31d46fef9..92e3604b3 100644 --- a/app/controllers/api/admin/green_lanes/category_assessments_controller.rb +++ b/app/controllers/api/admin/green_lanes/category_assessments_controller.rb @@ -118,8 +118,8 @@ def search_category_assessments(exemption_code) .association_join(:exemptions) .where( Sequel.|( - { Sequel[:exemptions][:code] => exemption_code } - ) + { Sequel[:exemptions][:code] => exemption_code }, + ), ) .distinct(Sequel[:green_lanes_category_assessments][:id]) .select_all(:green_lanes_category_assessments) diff --git a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb index 3ff12a12c..e788b81a2 100644 --- a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb +++ b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb @@ -40,6 +40,7 @@ }, } end + it { is_expected.to have_http_status :success } it { expect(json_response).to include('data') } it { expect(json_response).to include('meta') } From f3e29f2b22db15836b541b83a379f1fc732b7ab1 Mon Sep 17 00:00:00 2001 From: "rasika.abeyrathna" Date: Fri, 4 Oct 2024 17:25:37 +0100 Subject: [PATCH 3/5] GL-1067: Implement Search Functionality for Exemptions on Category Assessments Page --- .../category_assessments_controller.rb | 33 ++++++++++++------- .../category_assessments_controller_spec.rb | 28 ++++++++++++++++ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/admin/green_lanes/category_assessments_controller.rb b/app/controllers/api/admin/green_lanes/category_assessments_controller.rb index 92e3604b3..96543eb7b 100644 --- a/app/controllers/api/admin/green_lanes/category_assessments_controller.rb +++ b/app/controllers/api/admin/green_lanes/category_assessments_controller.rb @@ -10,8 +10,9 @@ class CategoryAssessmentsController < AdminController def index options = { is_collection: true } options[:include] = %i[theme] - options[:meta] = pagination_meta(category_assessments(search_param)) - render json: serialize(category_assessments(search_param).to_a, options) + options[:meta] = pagination_meta(category_assessments) + + render json: serialize(category_assessments.to_a, options) end def show @@ -99,20 +100,29 @@ def ca_params ) end - def search_param - params.dig(:query, :exemption_code) || '' - end - def record_count @category_assessments.pagination_record_count end - def category_assessments(exemption_code) - @category_assessments ||= search_category_assessments(exemption_code) + def category_assessments + exemption_code = params.dig(:query, :filters, :exemption_code) || '' + sort_by = params.dig(:query, :sort) || 'id' + sort_order = params.dig(:query, :direction) || 'asc' + + order_expr = if sort_order == 'desc' + Sequel.desc(Sequel[:green_lanes_category_assessments][sort_by.to_sym]) + else + Sequel.asc(Sequel[:green_lanes_category_assessments][sort_by.to_sym]) + end + + @category_assessments ||= search_category_assessments(exemption_code, order_expr) end - def search_category_assessments(exemption_code) - return ::GreenLanes::CategoryAssessment.eager(:theme).order(:id).paginate(ca_current_page, per_page) if exemption_code.blank? + def search_category_assessments(exemption_code, order_expr) + if exemption_code.blank? + return ::GreenLanes::CategoryAssessment.eager(:theme).order(order_expr) + .paginate(ca_current_page, per_page) + end ::GreenLanes::CategoryAssessment .association_join(:exemptions) @@ -121,9 +131,8 @@ def search_category_assessments(exemption_code) { Sequel[:exemptions][:code] => exemption_code }, ), ) - .distinct(Sequel[:green_lanes_category_assessments][:id]) .select_all(:green_lanes_category_assessments) - .eager(:theme).order(Sequel[:green_lanes_category_assessments][:id]).paginate(ca_current_page, per_page) + .eager(:theme).order(order_expr).paginate(ca_current_page, per_page) end def green_lanes_measures(category_assessment) diff --git a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb index e788b81a2..3dcb6715f 100644 --- a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb +++ b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb @@ -47,6 +47,34 @@ it { expect(json_response['data'].first['attributes']['measure_type_id']).to include(category.measure_type_id.to_s) } end + context 'with some category assessments, sort by parameter present' do + before do + category + end + + let(:make_request) do + authenticated_get api_admin_green_lanes_category_assessments_path(format: :json), params: search_data + end + + let :search_data do + { + query: { + sort: 'regulation_id', + direction: 'desc', + page: 1, + }, + } + end + + let :regulation_ids do + json_response['data'].map { |assessment| assessment['attributes']['regulation_id'] } + end + + it { is_expected.to have_http_status :success } + + it { expect(regulation_ids).to eq(regulation_ids.sort.reverse) } + end + context 'without any category assessments' do it { is_expected.to have_http_status :success } it { expect(json_response).to include('data' => []) } From 4e0adfe7d0364f9313c2560b38bbad12411641f3 Mon Sep 17 00:00:00 2001 From: "rasika.abeyrathna" Date: Tue, 15 Oct 2024 12:06:06 +0100 Subject: [PATCH 4/5] test fix --- .../green_lanes/category_assessments_controller_spec.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb index 3dcb6715f..efc173b8e 100644 --- a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb +++ b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb @@ -44,7 +44,10 @@ it { is_expected.to have_http_status :success } it { expect(json_response).to include('data') } it { expect(json_response).to include('meta') } - it { expect(json_response['data'].first['attributes']['measure_type_id']).to include(category.measure_type_id.to_s) } + it 'expects measure_type_id to be in the json response' do + measure_type_ids = json_response['data'].map { |item| item['attributes']['measure_type_id'] } + expect(measure_type_ids).to include(category.measure_type_id.to_s) + end end context 'with some category assessments, sort by parameter present' do From fbfc1c6f52fe6d4eacbe0e4cfd2fda1205024e32 Mon Sep 17 00:00:00 2001 From: "rasika.abeyrathna" Date: Tue, 15 Oct 2024 12:20:24 +0100 Subject: [PATCH 5/5] test fix --- .../admin/green_lanes/category_assessments_controller_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb index efc173b8e..d6969f991 100644 --- a/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb +++ b/spec/requests/api/admin/green_lanes/category_assessments_controller_spec.rb @@ -44,6 +44,7 @@ it { is_expected.to have_http_status :success } it { expect(json_response).to include('data') } it { expect(json_response).to include('meta') } + it 'expects measure_type_id to be in the json response' do measure_type_ids = json_response['data'].map { |item| item['attributes']['measure_type_id'] } expect(measure_type_ids).to include(category.measure_type_id.to_s)