Prohlížeč zdrojového kódu

app/examples/invoice_calculator/invoice_calculator_spec.rb

require "rspec/core"
RSpec.reset
RSpec.configuration.start_time = Time.now
RSpec.describe "InvoiceCalculator" do
describe "#finalize" do
context "when having some items that have total_with_vat_unlocked" do
it "tweaks the items VAT so total VAT is more precise" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
# vat summed from individual items (0.66)
expect(ic.items.sum(&:vat)).to eq("0.66".to_d)
# is lower than vat computed from total (0.67)
expect((ic.items.sum(&:total) * "0.21".to_d).round(2)).to eq("0.67".to_d)
# let's fix that
ic.finalize
# now it's correct
expect(ic.items.collect(&:total_with_vat)).to eq ["1.29".to_d, "1.30".to_d, "1.29".to_d]
expect(ic.items.collect(&:vat)).to eq ["0.22".to_d, "0.23".to_d, "0.22".to_d]
expect(ic.items.sum(&:total_with_vat)).to eq("3.88".to_d)
expect(ic.items.sum(&:vat)).to eq("0.67".to_d)
end
it "respects given precision" do
ic = InvoiceCalculator.new(precision: 1)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
# vat summed from individual items (0.6)
expect(ic.items.sum(&:vat)).to eq("0.60".to_d)
# is lower than vat computed from total (0.7)
expect((ic.items.sum(&:total) * "0.21".to_d).round(1)).to eq("0.7".to_d)
# let's fix that
ic.finalize
# now it's correct
expect(ic.items.collect(&:total_with_vat)).to eq ["1.3".to_d, "1.4".to_d, "1.3".to_d]
expect(ic.items.collect(&:vat)).to eq ["0.2".to_d, "0.3".to_d, "0.2".to_d]
expect(ic.items.sum(&:total_with_vat)).to eq("4.0".to_d)
expect(ic.items.sum(&:vat)).to eq("0.7".to_d)
end
it "does not tweak locked items" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "1.07".to_d, unit_price_with_vat: "1.29".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, unit_price_with_vat: "1.29".to_d, vat_rate: 21)
ic.finalize
expect(ic.items.collect(&:vat)).to eq ["0.22".to_d, "0.23".to_d, "0.22".to_d]
end
end
context "when having some items that have total_unlocked" do
it "tweaks unlocked items" do
ic = InvoiceCalculator.new
ic.add_item(unit_price_with_vat: "1.29".to_d, vat_rate: 21)
ic.add_item(unit_price_with_vat: "1.29".to_d, vat_rate: 21)
ic.add_item(unit_price_with_vat: "1.29".to_d, vat_rate: 21)
k = (21.to_d / 121.to_d).round(4)
# vat summed from individual items (0.66)
expect(ic.items.sum(&:vat)).to eq("0.66".to_d)
# is lower than vat computed from total (0.67)
expect((ic.items.sum(&:total_with_vat) * k).round(2)).to eq("0.67".to_d)
# let's fix that
ic.finalize
# now it's correct
expect(ic.items.collect(&:total)).to eq ["1.07".to_d, "1.06".to_d, "1.07".to_d]
expect(ic.items.collect(&:vat)).to eq ["0.22".to_d, "0.23".to_d, "0.22".to_d]
expect(ic.items.sum(&:total)).to eq("3.2".to_d)
expect(ic.items.sum(&:vat)).to eq("0.67".to_d)
end
it "skips locked items" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "1.07".to_d, unit_price_with_vat: "1.29".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, unit_price_with_vat: "1.29".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.finalize
expect(ic.items.collect(&:total_with_vat)).to eq ["1.29".to_d, "1.29".to_d, "1.30".to_d]
end
end
context "with negative delta" do
it "applies delta to items proportionally" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "0.01".to_d, vat_rate: 21) # vat != precise_vat
ic.add_item(unit_price: 10, vat_rate: 21)
ic.add_item(unit_price: 500, vat_rate: 21)
ic.add_item(unit_price: 1000, vat_rate: 21)
ic.add_item(unit_price: 2000, unit_price_with_vat: 2430, vat_rate: 21) # off by 10
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 10.0 2.1 12.1",
"CZK 21.0 500.0 105.0 605.0",
"CZK 21.0 1000.0 210.0 1210.0",
"CZK 21.0 2000.0 430.0 2430.0",
]
ic.finalize(max_delta_per_item: 10)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 10.0 2.03 12.03",
"CZK 21.0 500.0 101.69 601.69",
"CZK 21.0 1000.0 203.38 1203.38",
"CZK 21.0 2000.0 430.0 2430.0",
]
end
end
context "with positive delta" do
it "applies delta to items proportionally" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "0.01".to_d, vat_rate: 21) # vat != precise_vat
ic.add_item(unit_price: 10, vat_rate: 21)
ic.add_item(unit_price: 500, vat_rate: 21)
ic.add_item(unit_price: 1000, vat_rate: 21)
ic.add_item(unit_price: 2000, unit_price_with_vat: 2410, vat_rate: 21) # off by 10
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 10.0 2.1 12.1",
"CZK 21.0 500.0 105.0 605.0",
"CZK 21.0 1000.0 210.0 1210.0",
"CZK 21.0 2000.0 410.0 2410.0",
]
ic.finalize(max_delta_per_item: 10)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 10.0 2.17 12.17",
"CZK 21.0 500.0 108.31 608.31",
"CZK 21.0 1000.0 216.62 1216.62",
"CZK 21.0 2000.0 410.0 2410.0",
]
end
end
it "handles different vat rates and locked/unlocked combinations and creates #vat_summary" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "22.2".to_d, vat_rate: 15, count: 17)
ic.add_item(unit_price: "150.66".to_d, vat_rate: 21, count: "0.57".to_d)
ic.add_item(unit_price_with_vat: "1000".to_d, vat_rate: 21)
ic.add_item(unit_price_with_vat: "1000".to_d, vat_rate: 15)
ic.add_item(unit_price_with_vat: 12, vat_rate: 0)
ic.add_item(unit_price: 2000, unit_price_with_vat: 2425, vat_rate: 21) # off by 5
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 15.0 377.4 56.61 434.01",
"CZK 21.0 85.88 18.03 103.91",
"CZK 21.0 826.45 173.55 1000.0",
"CZK 15.0 869.57 130.43 1000.0",
"CZK 0.0 12.0 0.0 12.0",
"CZK 21.0 2000.0 425.0 2425.0",
]
ic.finalize(max_delta_per_item: 20)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 15.0 377.4 56.61 434.01",
"CZK 21.0 85.88 18.03 103.91",
"CZK 21.0 830.57 169.43 1000.0",
"CZK 15.0 869.57 130.43 1000.0",
"CZK 0.0 12.0 0.0 12.0",
"CZK 21.0 2000.0 425.0 2425.0",
]
expect([0, 15, 21].collect {|vat_rate| ic.sum[vat_rate].values_at(:currency, :vat_rate, :total, :vat, :total_with_vat).collect(&:to_s).join " "}).
to eq [
"CZK 0.0 12.0 0.0 12.0",
"CZK 15.0 1246.97 187.04 1434.01",
"CZK 21.0 2916.45 612.46 3528.91",
]
end
it "handles negative items" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "860.77".to_d, vat_rate: 21)
ic.add_item(unit_price: "860.77".to_d, vat_rate: 21)
ic.add_item(unit_price: "0.01".to_d, vat_rate: 21)
ic.add_item(unit_price: -200, vat_rate: 21)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 860.77 180.76 1041.53",
"CZK 21.0 860.77 180.76 1041.53",
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 -200.0 -42.0 -242.0",
]
ic.finalize
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 860.77 180.76 1041.53",
"CZK 21.0 860.77 180.77 1041.54",
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 -200.0 -42.0 -242.0",
]
end
it "handles negative items with big delta" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "860.77".to_d, unit_price_with_vat: "1051".to_d, vat_rate: 21)
ic.add_item(unit_price: "0.01".to_d, vat_rate: 21)
ic.add_item(unit_price: -200, vat_rate: 21)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 860.77 190.23 1051.0",
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 -200.0 -42.0 -242.0",
]
ic.finalize(max_delta_per_item: 20)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 860.77 190.23 1051.0",
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 -200.0 -51.47 -251.47",
]
end
it "handles locked negative items" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "860.77".to_d, vat_rate: 21)
ic.add_item(unit_price: "0.01".to_d, vat_rate: 21)
ic.add_item(unit_price: -200, unit_price_with_vat: -230, vat_rate: 21)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 860.77 180.76 1041.53",
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 -200.0 -30.0 -230.0",
]
ic.finalize(max_delta_per_item: 20)
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 860.77 168.76 1029.53",
"CZK 21.0 0.01 0.0 0.01",
"CZK 21.0 -200.0 -30.0 -230.0",
]
end
end
describe "InvoiceCalculator::Item" do
it "complains if you try to pass float" do
expect {InvoiceCalculator::Item.new(unit_price: 1.20, vat_rate: 21, currency: "CZK")}.to raise_error(ArgumentError)
expect {InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21.0, currency: "CZK")}.to raise_error(ArgumentError)
expect {InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, count: 4.5, currency: "CZK")}.to raise_error(ArgumentError)
end
it "complains if currency is not given" do
expect {InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, count: 4, currency: "CZK")}.not_to raise_error
expect {InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, count: 4)}.to raise_error(ArgumentError)
end
it "computes total from unit price and count" do
i = InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, count: 20, currency: "CZK")
expect(i.total).to eq "20.00".to_d
expect(i.vat).to eq "4.20".to_d
expect(i.total_with_vat).to eq "24.20".to_d
end
it "computes missing VAT correctly" do
i = InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, currency: "CZK")
expect(i.total).to eq "1.00".to_d
expect(i.vat).to eq "0.21".to_d
expect(i.total_with_vat).to eq "1.21".to_d
i = InvoiceCalculator::Item.new(unit_price_with_vat: "1.21".to_d, vat_rate: 21, currency: "CZK")
expect(i.total).to eq "1.00".to_d
expect(i.vat).to eq "0.21".to_d
expect(i.total_with_vat).to eq "1.21".to_d
i = InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, unit_price_with_vat: "1.22".to_d, currency: "CZK")
expect(i.total).to eq "1.00".to_d
expect(i.vat).to eq "0.22".to_d
expect(i.total_with_vat).to eq "1.22".to_d
end
it "marks given value as locked" do
i = InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, currency: "CZK")
expect(i.total_unlocked?).to be false
expect(i.total_with_vat_unlocked?).to be true
i = InvoiceCalculator::Item.new(unit_price_with_vat: "1.21".to_d, vat_rate: 21, currency: "CZK")
expect(i.total_unlocked?).to be true
expect(i.total_with_vat_unlocked?).to be false
i = InvoiceCalculator::Item.new(unit_price: 1, unit_price_with_vat: "1.21".to_d, vat_rate: 21, currency: "CZK")
expect(i.total_unlocked?).to be false
expect(i.total_with_vat_unlocked?).to be false
end
describe "#apply_vat_delta" do
context "when total_unlocked?" do
it "subtracts delta from VAT and total_with_vat" do
i = InvoiceCalculator::Item.new(unit_price: 1, vat_rate: 21, currency: "CZK")
expect(i.vat).to eq "0.21".to_d
expect(i.total_with_vat).to eq "1.21".to_d
i.apply_vat_delta("0.01".to_d)
expect(i.vat).to eq "0.22".to_d
expect(i.total_with_vat).to eq "1.22".to_d
end
end
context "when total_with_vat_unlocked?" do
it "adds delta to VAT and adds to total" do
i = InvoiceCalculator::Item.new(unit_price_with_vat: "1.21".to_d, vat_rate: 21, currency: "CZK")
expect(i.vat).to eq "0.21".to_d
expect(i.total).to eq "1.00".to_d
i.apply_vat_delta("0.01".to_d)
expect(i.vat).to eq "0.22".to_d
expect(i.total).to eq "0.99".to_d
end
end
context "when locked" do
it "raises error" do
i = InvoiceCalculator::Item.new(unit_price: 1, unit_price_with_vat: "1.21".to_d, vat_rate: 21, currency: "CZK")
expect {i.apply_vat_delta("0.01".to_d)}.to raise_error("Cannot apply_vat_delta to locked item.")
end
end
end
end
describe "#sum" do
it "sums selected items and returns the result as a Hash" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["el_om", "el_om_1", "vt"], count: 20, unit: "kWh")
ic.add_item(unit_price: 5, vat_rate: 21, tags: ["el_om", "el_om_1", "nt"], count: 30, unit: "kWh")
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["el_om", "el_om_2", "vt"], count: 20, unit: "kWh")
ic.add_item(unit_price: 5, vat_rate: 21, tags: ["el_om", "el_om_2", "nt"], count: 30, unit: "kWh")
ic.finalize
expect(ic.sum.to_h).to eq({
total: 700,
vat: 147,
total_with_vat: 847,
vat_rate: 21,
count: 100,
unit: "kWh",
currency: "CZK",
extras: [{}, {}, {}, {}],
})
expect(ic.sum("el_om_1").to_h).to eq({
total: 350,
vat: "73.5".to_d,
total_with_vat: "423.5".to_d,
vat_rate: 21,
count: 50,
unit: "kWh",
currency: "CZK",
extras: [{}, {}],
})
expect(ic.sum("el_om_1", except: "vt").to_h).to eq({
total: 150,
vat: "31.5".to_d,
total_with_vat: "181.5".to_d,
vat_rate: 21,
count: 30,
unit: "kWh",
currency: "CZK",
extras: [{}],
})
end
it "doesn't mix apples and bananas" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["el_om", "el_om_1", "vt"], count: 20, unit: "kWh")
ic.add_item(unit_price: 5, vat_rate: 21, tags: ["el_om", "el_om_1", "nt"], count: 30, unit: "kWh")
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["gas_om", "gas_om_2"], count: 20, unit: "m3")
ic.add_item(unit_price: 100, vat_rate: 15, tags: ["books"], count: 2)
ic.finalize
expect(ic.sum.values_at(:currency, :vat_rate, :count, :unit)).to eq ["CZK", nil, nil, nil]
expect(ic.sum("el_om").values_at(:currency, :vat_rate, :count, :unit)).to eq ["CZK", 21, 50, "kWh"]
expect(ic.sum("gas_om").values_at(:currency, :vat_rate, :count, :unit)).to eq ["CZK", 21, 20, "m3"]
expect(ic.sum("books").values_at(:currency, :vat_rate, :count, :unit)).to eq ["CZK", 15, 2, nil]
end
it "allows to access the vat rates" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["el_om", "el_om_1", "vt"], count: 20, unit: "kWh")
ic.add_item(unit_price: 5, vat_rate: 21, tags: ["el_om", "el_om_1", "nt"], count: 30, unit: "kWh")
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["gas_om", "gas_om_2"], count: 20, unit: "m3")
ic.add_item(unit_price: 100, vat_rate: 15, tags: ["books"], count: 2)
ic.finalize
expect(ic.sum.total).to eq 750
expect(ic.sum[21].total).to eq 550
expect(ic.sum[15].total_with_vat).to eq 230
end
end
describe "totals" do
it "allows convenient access to total sum of invoice" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["el_om", "el_om_1", "vt"], count: 20, unit: "kWh")
ic.add_item(unit_price: 5, vat_rate: 21, tags: ["el_om", "el_om_1", "nt"], count: 30, unit: "kWh")
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["gas_om", "gas_om_2"], count: 20, unit: "m3")
ic.add_item(unit_price: 100, vat_rate: 15, tags: ["books"], count: 2)
# works without finalizing
expect(ic.total).to eq 750
expect(ic.vat).to eq 145.5
expect(ic.total_with_vat).to eq 895.5
ic.finalize
# and after finalizing too
expect(ic.total).to eq 750
expect(ic.vat).to eq 145.5
expect(ic.total_with_vat).to eq 895.5
end
it "updates with added items" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21, tags: ["el_om", "el_om_1", "vt"], count: 20, unit: "kWh")
expect(ic.total).to eq 200
ic.add_item(unit_price: 5, vat_rate: 21, tags: ["el_om", "el_om_1", "nt"], count: 30, unit: "kWh")
expect(ic.total).to eq 350
end
end
describe "currency handling" do
it "remembers the given currency" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21)
ic.add_item(unit_price: 1, vat_rate: 21, currency: "EUR")
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 10.0 2.1 12.1",
"EUR 21.0 1.0 0.21 1.21"
]
end
it "doesn't add different currencies together" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21)
ic.add_item(unit_price: 1, vat_rate: 21, currency: "EUR")
expect { ic.sum }.to raise_error(/wrong currency/)
end
it "can be converted to specific currency" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21)
ic.add_item(unit_price: 1, vat_rate: 21, currency: "EUR")
ic = ic.convert_to("EUR", {"EUR:CZK" => "25.00".to_d})
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"EUR 21.0 0.4 0.08 0.48",
"EUR 21.0 1.0 0.21 1.21"
]
expect(ic.sum.values_at(:currency, :total, :vat, :total_with_vat).collect(&:to_s).join(' ')).to eq("EUR 1.4 0.29 1.69")
end
it "can be converted to the other way" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: 10, vat_rate: 21)
ic.add_item(unit_price: 1, vat_rate: 21, currency: "EUR")
ic = ic.convert_to("CZK", {"EUR:CZK" => "25.00".to_d})
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 10.0 2.1 12.1",
"CZK 21.0 25.0 5.25 30.25"
]
expect(ic.sum.values_at(:currency, :total, :vat, :total_with_vat).collect(&:to_s).join(' ')).to eq("CZK 35.0 7.35 42.35")
end
it "can be finalized and converted and still make sense" do
ic = InvoiceCalculator.new
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.add_item(unit_price: "1.07".to_d, vat_rate: 21)
ic.finalize
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 1.07 0.22 1.29",
"CZK 21.0 1.07 0.23 1.3",
"CZK 21.0 1.07 0.22 1.29",
]
ic = ic.convert_to("EUR", {"EUR:CZK" => "26.70".to_d})
ic.finalize
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"EUR 21.0 0.04 0.01 0.05",
"EUR 21.0 0.04 0.01 0.05",
"EUR 21.0 0.04 0.01 0.05",
]
ic = ic.convert_to("CZK", {"EUR:CZK" => "26.70".to_d})
ic.finalize
expect(ic.items.collect {|i| [i.currency, i.vat_rate, i.total, i.vat, i.total_with_vat].collect(&:to_s).join(' ')}).
to eq [
"CZK 21.0 1.07 0.22 1.29",
"CZK 21.0 1.07 0.23 1.3",
"CZK 21.0 1.07 0.22 1.29",
]
end
end
end
run_rspec