mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
97 lines
3.0 KiB
Ruby
97 lines
3.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
# Its pretty difficult to test this module in isolation b/c it needs to work in conjunction
|
|
# with an actual class that extends ActiveRecord::Base and has a corresponding table in the DB.
|
|
# So we'll just test it using Order and ShippingMethod. These classes are including the module.
|
|
RSpec.describe CalculatedAdjustments do
|
|
let(:calculator) { build(:calculator) }
|
|
let(:tax_rate) { Spree::TaxRate.new(calculator:) }
|
|
|
|
before do
|
|
allow(calculator).to receive(:compute) { 10 }
|
|
allow(calculator).to receive(:[]) { nil }
|
|
end
|
|
|
|
it "should add has_one :calculator relationship" do
|
|
assert Spree::ShippingMethod.
|
|
reflect_on_all_associations(:has_one).map(&:name).include?(:calculator)
|
|
end
|
|
|
|
context "#create_adjustment and its resulting adjustment" do
|
|
let(:order) { Spree::Order.create }
|
|
let(:target) { order }
|
|
|
|
it "should be associated with the target" do
|
|
expect(target.adjustments).to receive(:create)
|
|
tax_rate.create_adjustment("foo", target)
|
|
end
|
|
|
|
it "should be associated with the order" do
|
|
tax_rate.create_adjustment("foo", target)
|
|
expect(target.adjustments.first.order_id).to eq order.id
|
|
end
|
|
|
|
it "should have the correct originator and an amount derived " \
|
|
"from the calculator and supplied calculable" do
|
|
adjustment = tax_rate.create_adjustment("foo", target)
|
|
expect(adjustment).not_to be_nil
|
|
expect(adjustment.amount).to eq 10
|
|
expect(adjustment.adjustable).to eq order
|
|
expect(adjustment.originator).to eq tax_rate
|
|
end
|
|
|
|
it "should be mandatory if true is supplied for that parameter" do
|
|
adjustment = tax_rate.create_adjustment("foo", target, true)
|
|
expect(adjustment).to be_mandatory
|
|
end
|
|
|
|
context "when the calculator returns 0" do
|
|
before { allow(calculator).to receive_messages(compute: 0) }
|
|
|
|
context "when adjustment is mandatory" do
|
|
before { tax_rate.create_adjustment("foo", target, true) }
|
|
|
|
it "should create an adjustment" do
|
|
expect(Spree::Adjustment.count).to eq 1
|
|
end
|
|
end
|
|
|
|
context "when adjustment is not mandatory" do
|
|
before { tax_rate.create_adjustment("foo", target, order, false) }
|
|
|
|
it "should not create an adjustment" do
|
|
expect(Spree::Adjustment.count).to eq 0
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#calculator_type=" do
|
|
subject(:tax_rate) { Spree::TaxRate.new }
|
|
|
|
it "set the calculator to the given type" do
|
|
tax_rate.calculator_type = "Calculator::FlatRate"
|
|
|
|
expect(tax_rate.calculator).to be_a(Calculator::FlatRate)
|
|
end
|
|
|
|
context "when no argument given" do
|
|
it "returns nil" do
|
|
tax_rate.calculator_type = nil
|
|
|
|
expect(tax_rate.calculator).to be_nil
|
|
end
|
|
end
|
|
|
|
context "when not allowed calculator type given" do
|
|
it "returns nil" do
|
|
tax_rate.calculator_type = "Calculator::Wrong"
|
|
|
|
expect(tax_rate.calculator).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|