Files
openfoodnetwork/spec/lib/reports/line_items_spec.rb
David Cook e02ef08b06 Consolidate translations for hidden field
The string '< Hidden >' was agreed on as a good default, so we will use the hidden_field key.
I also moved the definition in en.yml up to the more general area at the start of admin.reports section (before it was hidden between report-specific keys.
2025-03-31 16:24:07 +11:00

82 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Reporting::LineItems do
# This object lets us add some test coverage despite the very deep coupling between the class
# under test and the various objects it depends on. Other more common moking strategies where very
# hard.
let(:fake_order_permissions) do
Class.new do
def initialize(line_items, orders_relation)
@relations = Spree::LineItem.where(id: line_items.map(&:id))
@orders_relation = orders_relation
end
def visible_line_items
relations
end
def editable_line_items
line_item = FactoryBot.create(:line_item)
Spree::LineItem.where(id: line_item.id)
end
def visible_orders
orders_relation
end
private
attr_reader :relations, :orders_relation
end
end
subject(:reports_line_items) { described_class.new(order_permissions, params) }
describe '#list' do
let!(:order) do
create(
:order,
distributor: create(:enterprise),
completed_at: 1.day.ago,
shipments: [build(:shipment)]
)
end
let!(:line_item1) { create(:line_item, order:) }
let(:orders_relation) { Spree::Order.where(id: order.id) }
let(:order_permissions) { fake_order_permissions.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:) }
let!(:line_item3) { create(:line_item, order:) }
let(:order_permissions) do
fake_order_permissions.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