mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-01 21:47:16 +00:00
130 lines
4.2 KiB
Ruby
130 lines
4.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
require_relative '../../db/migrate/20210617203927_migrate_admin_tax_amounts'
|
|
|
|
RSpec.describe MigrateAdminTaxAmounts do
|
|
subject { MigrateAdminTaxAmounts.new }
|
|
|
|
let(:tax_category10) { create(:tax_category) }
|
|
let(:tax_category50) { create(:tax_category) }
|
|
let!(:tax_rate10) { create(:tax_rate, amount: 0.1, tax_category: tax_category10) }
|
|
let!(:tax_rate50) { create(:tax_rate, amount: 0.5, tax_category: tax_category50) }
|
|
let(:adjustment10) { create(:adjustment, amount: 100, included_tax: 10) }
|
|
let(:adjustment50) { create(:adjustment, amount: 100, included_tax: 50) }
|
|
|
|
describe '#migrate_admin_taxes!' do
|
|
context "when the adjustment has no tax" do
|
|
let!(:adjustment_without_tax) { create(:adjustment, included_tax: 0) }
|
|
|
|
it "doesn't move the tax to an adjustment" do
|
|
expect { subject.migrate_admin_taxes! }.not_to change {
|
|
Spree::Adjustment.count
|
|
}
|
|
end
|
|
end
|
|
|
|
context "when the adjustments have tax" do
|
|
before do
|
|
adjustment10; adjustment50
|
|
allow(subject).to receive(:applicable_rates) { [tax_rate10, tax_rate50] }
|
|
end
|
|
|
|
it "moves the tax to an adjustment" do
|
|
expect(Spree::Adjustment).to receive(:create!).at_least(:once).and_call_original
|
|
|
|
subject.migrate_admin_taxes!
|
|
expect(adjustment10.reload.tax_category).to eq tax_category10
|
|
expect(adjustment50.reload.tax_category).to eq tax_category50
|
|
|
|
tax_adjustment10 = Spree::Adjustment.tax.where(adjustable_id: adjustment10).first
|
|
|
|
expect(tax_adjustment10.amount).to eq adjustment10.included_tax
|
|
expect(tax_adjustment10.adjustable).to eq adjustment10
|
|
expect(tax_adjustment10.originator).to eq tax_rate10
|
|
expect(tax_adjustment10.state).to eq "closed"
|
|
expect(tax_adjustment10.included).to eq true
|
|
|
|
tax_adjustment50 = Spree::Adjustment.tax.where(adjustable_id: adjustment50).first
|
|
|
|
expect(tax_adjustment50.amount).to eq adjustment50.included_tax
|
|
expect(tax_adjustment50.adjustable).to eq adjustment50
|
|
expect(tax_adjustment50.originator).to eq tax_rate50
|
|
expect(tax_adjustment50.state).to eq "closed"
|
|
expect(tax_adjustment50.included).to eq true
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#find_tax_rate" do
|
|
before do
|
|
allow(subject).to receive(:applicable_rates) { [tax_rate10, tax_rate50] }
|
|
end
|
|
|
|
it "matches rates correctly" do
|
|
expect(subject.find_tax_rate(adjustment10)).to eq(tax_rate10)
|
|
|
|
expect(subject.find_tax_rate(adjustment50)).to eq(tax_rate50)
|
|
end
|
|
|
|
context "without a perfect match" do
|
|
let(:adjustment45) { create(:adjustment, amount: 100, included_tax: 45) }
|
|
|
|
it "finds the closest match" do
|
|
expect(subject.find_tax_rate(adjustment45)).to eq(tax_rate50)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#applicabe_rates" do
|
|
let(:distributor) { create(:enterprise) }
|
|
let(:order) { create(:order, distributor:) }
|
|
let!(:adjustment) { create(:adjustment, order:) }
|
|
|
|
context "when the order is nil" do
|
|
let(:order) { nil }
|
|
|
|
it "returns an empty array" do
|
|
expect(Spree::TaxRate).not_to receive(:match)
|
|
|
|
expect(subject.applicable_rates(adjustment)).to eq []
|
|
end
|
|
end
|
|
|
|
context "when the order has no distributor" do
|
|
let(:distributor) { nil }
|
|
|
|
it "returns an empty array" do
|
|
expect(Spree::TaxRate).not_to receive(:match)
|
|
|
|
expect(subject.applicable_rates(adjustment)).to eq []
|
|
end
|
|
end
|
|
|
|
context "when the order has a distributor" do
|
|
it "calls TaxRate#match for an array of applicable taxes for the order" do
|
|
expect(Spree::TaxRate).to receive(:match) { [tax_rate10] }
|
|
|
|
expect(subject.applicable_rates(adjustment)).to eq [tax_rate10]
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#tax_adjustment_label' do
|
|
let(:tax_rate) { create(:tax_rate, name: "Test Rate", amount: 0.20) }
|
|
|
|
context "when a tax rate is given" do
|
|
it "makes a detailed label" do
|
|
expect(subject.tax_adjustment_label(tax_rate)).
|
|
to eq("Test Rate 20.0% (Included in price)")
|
|
end
|
|
end
|
|
|
|
context "when the tax rate is nil" do
|
|
it "makes a basic label" do
|
|
expect(subject.tax_adjustment_label(nil)).to eq("Included tax")
|
|
end
|
|
end
|
|
end
|
|
end
|