diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index e43d4e4145..cd66e3d8c2 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -56,7 +56,7 @@ module Admin @rendering_options = rendering_options @data = Reporting::FrontendData.new(spree_current_user) - variant_id_in = params[:variant_id_in].reject(&:blank?) + variant_id_in = params[:variant_id_in]&.reject(&:blank?) load_selected_variant if variant_id_in.present? end diff --git a/lib/reporting/line_items.rb b/lib/reporting/line_items.rb index 714d071405..87afa58a64 100644 --- a/lib/reporting/line_items.rb +++ b/lib/reporting/line_items.rb @@ -23,6 +23,12 @@ module Reporting line_items = line_items.supplied_by_any(@params[:supplier_id_in]) end + # Filter by product + variant_id_in = @params[:variant_id_in].reject(&:blank?) + if variant_id_in.present? + line_items = line_items.where("spree_line_items.variant_id": variant_id_in) + end + if line_item_includes.present? line_items = line_items.includes(*line_item_includes).references(:line_items) end diff --git a/spec/lib/reports/line_items_spec.rb b/spec/lib/reports/line_items_spec.rb index 3a0bd9beb8..0814778837 100644 --- a/spec/lib/reports/line_items_spec.rb +++ b/spec/lib/reports/line_items_spec.rb @@ -9,13 +9,13 @@ describe Reporting::LineItems do # under test and the various objects it depends on. Other more common moking strategies where very # hard. class FakeOrderPermissions - def initialize(line_item, orders_relation) - @relation = Spree::LineItem.where(id: line_item.id) + def initialize(line_items, orders_relation) + @relations = Spree::LineItem.where(id: line_items.map(&:id)) @orders_relation = orders_relation end def visible_line_items - relation + relations end def editable_line_items @@ -29,7 +29,7 @@ describe Reporting::LineItems do private - attr_reader :relation, :orders_relation + attr_reader :relations, :orders_relation end describe '#list' do @@ -41,15 +41,39 @@ describe Reporting::LineItems do shipments: [build(:shipment)] ) end - let!(:line_item) { create(:line_item, order: order) } + let!(:line_item1) { create(:line_item, order: order) } let(:orders_relation) { Spree::Order.where(id: order.id) } - let(:order_permissions) { FakeOrderPermissions.new(line_item, orders_relation) } + let(:order_permissions) { FakeOrderPermissions.new([line_item1], orders_relation) } let(:params) { {} } it 'returns masked data' do line_items = reports_line_items.list expect(line_items.first.order.email).to eq('HIDDEN') end + + context "when filtering by product" do + subject(:line_items) { reports_line_items.list } + + let!(:line_item2) { create(:line_item, order: order) } + let!(:line_item3) { create(:line_item, order: order) } + let(:order_permissions) do + FakeOrderPermissions.new([line_item1, line_item2, line_item3], orders_relation) + end + let(:params) { { variant_id_in: [line_item3.variant.id, line_item1.variant.id] } } + + context "with an empty array" do + let(:params) { { variant_id_in: [""] } } + + it "does not filter" do + expect(line_items).to include(line_item1, line_item2, line_item3) + end + end + + it "includes selected products" do + expect(line_items).to include(line_item1, line_item3) + expect(line_items).not_to include(line_item2) + end + end end end