Files
openfoodnetwork/spec/lib/reports/report_spec.rb
David Cook 96eaec908d Remove unused mock in specs
It looks like it was expected that the price and amount columns would be formatted, but this is not currently the case. So I cleaned this up to be less ambiguous.

If any of these columns were to be configured for formatting, this line could be added back to test for unformatted output.
2023-03-22 11:47:26 +00:00

291 lines
8.8 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
# rubocop:disable Metrics/ModuleLength
module Reporting
describe ReportTemplate do
let(:user) { create(:user) }
let(:params) { {} }
subject { described_class.new(user, params) }
# rubocop:disable Metrics/AbcSize
def check_report
# Mock using instance variables
allow(subject).to receive(:columns).and_return(@columns)
allow(subject).to receive(:query_result).and_return(@query_result)
allow(subject).to receive(:rules).and_return(@rules) if @rules.present?
if @custom_headers.present?
allow(subject).to receive(:custom_headers).and_return(@custom_headers)
end
# Check result depending on existing instance variables
expect(subject.rows.map(&:to_h)).to eq(@expected_rows) if @expected_rows.present?
expect(subject.table_rows).to eq(@expected_table_rows) if @expected_table_rows.present?
expect(subject.table_headers).to eq(@expected_headers) if @expected_headers.present?
end
# rubocop:enable Metrics/AbcSize
describe ".default_params" do
it "use correctly the default values" do
default_params = {
filter: "default__filter",
other_filter: "default_other_filter",
q: { hub: "default_hub", customer: "default_customer" }
}
real_params = {
filter: "test_filter",
q: { hub: "test_hub" }
}
expected_params = {
filter: "test_filter",
other_filter: "default_other_filter",
q: { hub: "test_hub", customer: "default_customer" }
}
allow_any_instance_of(described_class).to receive(:default_params)
.and_return(default_params)
report = described_class.new(user, real_params)
expect(report.params).to eq(expected_params)
end
end
describe ".columns" do
before do
@query_result = [
OpenStruct.new(hub: { name: "My Hub" }, product: { name: "Apple", price: 5 })
]
end
it "handle procs" do
@columns = {
hub: proc { |item| item.hub[:name] }
}
@expected_rows = [
{ hub: "My Hub" }
]
check_report
end
it "handles symbols" do
@columns = {
hub: :hub_name
}
allow(subject).to receive(:hub_name).and_return("Transformed Hub Name")
@expected_rows = [
{ hub: "Transformed Hub Name" }
]
check_report
end
end
describe ".table_headers" do
before do
@columns = {
hub: proc { |item| item.hub[:name] },
product: proc { |item| item.product[:name] },
price: proc { |item| item.product[:price] },
}
end
it "uses the columns keys" do
@expected_headers = ['Hub', 'Product', 'Price']
check_report
end
it "handles custom_headers" do
@custom_headers = {
product: 'Custom Product',
not_existing_key: "My Key"
}
@expected_headers = ['Hub', 'Custom Product', 'Price']
check_report
end
describe "fields_to_show" do
let(:params) { { fields_to_show: [:hub, :price] } }
it "works" do
@expected_headers = ['Hub', 'Price']
check_report
end
end
end
describe ".table_rows" do
before do
@columns = {
price: proc { |item| item.product[:price] },
hub: proc { |item| item.hub[:name] }
}
@query_result = [
OpenStruct.new(hub: { name: "My Hub" }, product: { name: "Apple", price: 5 }),
OpenStruct.new(hub: { name: "My Other Hub" }, product: { name: "Apple", price: 12 })
]
end
it "get correct data" do
allow(subject).to receive(:unformatted_render?).and_return(true)
@expected_table_rows = [
[5, "My Hub"],
[12, "My Other Hub"],
]
check_report
end
end
describe ".rules" do
describe "#group_by" do
before do
@columns = {
hub: proc { |item| item.hub },
customer: proc { |item| item.customer },
product: proc { |item| item.product },
quantity: proc { |item| item.quantity },
}
@query_result = [
OpenStruct.new(hub: "Hub 1", customer: "John", product: "Apple", quantity: 4),
OpenStruct.new(hub: "Hub 2", customer: "John", product: "Pear", quantity: 3),
OpenStruct.new(hub: "Hub 2", customer: "John", product: "Apple", quantity: 5),
OpenStruct.new(hub: "Hub 1", customer: "Abby", product: "Orange", quantity: 6),
]
end
it "works with symbol or proc" do
@rules = [
{ group_by: proc { |_i, row| row.hub }, fields_used_in_header: [:hub], header: true },
{ group_by: :customer, header: true }
]
allow(subject).to receive(:display_header_row?).and_return(true)
@expected_rows = [
{ header: "Hub 1" },
{ header: "Abby" },
{ product: "Orange", quantity: 6 },
{ header: "John" },
{ product: "Apple", quantity: 4 },
{ header: "Hub 2" },
{ header: "John" },
{ product: "Pear", quantity: 3 },
{ product: "Apple", quantity: 5 },
]
check_report
end
end
describe "#sort_by" do
before do
@columns = {
hub_name: proc { |item| item.hub[:name] }
}
hub1 = { name: "Hub 1", popularity: 5 }
hub2 = { name: "Hub 2", popularity: 2 }
@query_result = [
OpenStruct.new(hub: hub2),
OpenStruct.new(hub: hub1)
]
end
it "use default sort" do
@rules = [{
group_by: proc { |item, _row| item.hub }
}]
@expected_rows = [
{ hub_name: "Hub 1" },
{ hub_name: "Hub 2" },
]
check_report
end
it "use sort_by proc" do
@rules = [{
group_by: proc { |item, _row| item.hub },
sort_by: proc { |hub| hub[:popularity] }
}]
@expected_rows = [
{ hub_name: "Hub 2" },
{ hub_name: "Hub 1" }
]
check_report
end
end
describe "#summary_row" do
before do
@query_result = [
OpenStruct.new(hub: "Hub 1", customer: "John", product: "Apple", quantity: 4),
OpenStruct.new(hub: "Hub 2", customer: "John", product: "Pear", quantity: 3),
OpenStruct.new(hub: "Hub 2", customer: "John", product: "Apple", quantity: 5),
OpenStruct.new(hub: "Hub 1", customer: "Abby", product: "Orange", quantity: 6),
]
end
it "groups and sum" do
@columns = {
hub: proc { |item| item.hub },
quantity: proc { |item| item.quantity },
count: proc { |_item| "" },
}
@rules = [{
group_by: :hub,
summary_row: proc do |group_key, items, rows|
{ count: "#{group_key} count=#{items.count}", quantity: rows.sum(&:quantity) }
end,
summary_row_label: "TOTAL"
}]
@expetec_rows = [
{ hub: "Hub 1", quantity: 4, count: "" },
{ hub: "Hub 1", quantity: 6, count: "" },
{ hub: "TOTAL", quantity: 10, count: "Hub 1 count=2" },
{ hub: "Hub 2", quantity: 3, count: "" },
{ hub: "Hub 2", quantity: 5, count: "" },
{ hub: "TOTAL", quantity: 8, count: "Hub 2 count=2" }
]
check_report
end
end
describe "should not group when for JSON" do
before do
@query_result = [
OpenStruct.new(hub: "Hub 1", customer: "John", quantity: 4)
]
@columns = {
hub: proc { |item| item.hub },
customer: proc { |item| item.customer },
quantity: proc { |item| item.quantity },
}
@rules = [{
group_by: :hub,
header: true,
summary_row: proc do |_group_key, _items, rows|
{ quantity: rows.sum(&:quantity) }
end
}]
end
describe "for fields_to_show" do
let(:params) { { fields_to_show: [:hub, :quantity], report_format: 'json' } }
it "works" do
@expetec_rows = [
{ hub: "Hub 1", quantity: 4 }
]
check_report
end
end
describe "for fields_to_hide" do
let(:params) { { fields_to_hide: [:customer], report_format: 'json' } }
it "works" do
@expetec_rows = [
{ hub: "Hub 1", quantity: 4 }
]
check_report
end
end
end
end
end
end
# rubocop:enable Metrics/ModuleLength