#!/usr/bin/env ruby
# encoding: utf-8
# TestInvoice -- ydim -- 11.01.2006 -- hwyss@ywesee.com
$: << File.expand_path('../lib', File.dirname(__FILE__))
require 'minitest/autorun'
require 'flexmock/test_unit'
require 'ydim/invoice'
module YDIM
class TestInvoice < Minitest::Test
include FlexMock::TestCase
def setup
@invoice = Invoice.new(23)
end
def test_add_item
assert_equal([], @invoice.items)
item_id = 0
item = FlexMock.new
item.should_receive(:index=, 2).and_return { |idx|
assert_equal(item_id, idx)
item_id += 1
}
retval = @invoice.add_item(item)
assert_equal([item], @invoice.items)
assert_equal(item, retval)
retval = @invoice.add_item(item)
assert_equal([item, item], @invoice.items)
assert_equal(item, retval)
end
def test_item
item = flexmock('item')
item.should_receive(:index).and_return(4)
@invoice.items.push(item)
assert_nil(@invoice.item(0))
assert_equal(item, @invoice.item(4))
end
def test_debitor_writer
debitor = FlexMock.new
debitor.should_receive(:add_invoice, 1).and_return { |arg|
assert_equal(@invoice, arg)
}
@invoice.debitor = debitor
debitor2 = FlexMock.new
debitor.should_receive(:delete_invoice, 1).and_return { |arg|
assert_equal(@invoice, arg)
}
debitor2.should_receive(:add_invoice, 1).and_return { |arg|
assert_equal(@invoice, arg)
}
@invoice.debitor = debitor2
end
def test_due_date
@invoice.payment_period = nil
assert_nil(@invoice.due_date)
today = Date.today
@invoice.date = today
assert_equal(today, @invoice.due_date)
@invoice.payment_period = 10
assert_equal(today + 10, @invoice.due_date)
@invoice.payment_received = true
assert_nil(@invoice.due_date)
end
def test_pdf_invoice
@invoice = Invoice.new(23)
debitor = FlexMock.new
debitor.should_receive(:add_invoice, 1).and_return { |arg|
assert_equal(@invoice, arg)
}
debitor.should_receive(:address).and_return { ['address'] }
@invoice.debitor = debitor
@invoice.description = 'description'
item = flexmock('item')
item_id = 0
item.should_receive(:index=).and_return { |idx| item_id += 1 }
item.should_receive(:vat_rate).and_return(7.6)
item.should_receive(:text).and_return('item text')
item.should_receive(:unit).and_return('hours')
item.should_receive(:quantity).and_return(3)
item.should_receive(:price).and_return(13)
item.should_receive(:vat).and_return(4)
@invoice.date = Date.new(2015, 1, 30)
item.should_receive(:time).and_return( @invoice.date.to_time)
@invoice.add_item(item)
user_pdfinvoice = File.join(Dir.home, '.pdfinvoice')
FileUtils.rm_rf(user_pdfinvoice)
FileUtils.makedirs(user_pdfinvoice)
FileUtils.cp(File.join(File.dirname(__FILE__), 'data', 'config.yml'), user_pdfinvoice)
FileUtils.cp(File.join(File.dirname(__FILE__), 'data', 'logo.png'), '/tmp/ywesee_logo.png')
pdf = @invoice.pdf_invoice({})
assert_instance_of(PdfInvoice::Invoice, pdf)
pdf_output = 'tst.pdf'
pdf_as_txt = 'tst.txt'
FileUtils.rm(pdf_output) if File.exist?(pdf_output)
FileUtils.rm(pdf_as_txt) if File.exist?(pdf_as_txt)
content = pdf.to_pdf
File.open(pdf_output, 'w+') {|f| f.write content } if $VERBOSE
assert_match(/Bedingungen/, content)
assert_match(/Rechnung 23/, content)
assert_match(/30.01.2015/, content)
assert_match(/Clearing/, content)
assert_match(/Beschreibung/, content)
assert_match(/Ohne Ihre Gegenmeldung/, content)
assert_match(/Mit freundlichen/, content)
assert_match(/MwSt/, content)
assert_equal(['address'], pdf.debitor_address)
assert_equal(23, pdf.invoice_number)
assert_equal('description', pdf.description)
assert(content.size > 10000, "PDF output must be > 10 Kb, or the Logo is missing. Is #{content.size} bytes. ")
end
def test_status
@invoice.date = Date.today
assert_equal('is_open', @invoice.status)
@invoice.date -= 2
@invoice.payment_period = 1
assert_equal('is_due', @invoice.status)
@invoice.payment_received = true
assert_equal('is_paid', @invoice.status)
@invoice.deleted = true
assert_equal('is_trash', @invoice.status)
end
def test_info
info = @invoice.info
assert_instance_of(Invoice::Info, info)
end
def test_empty
assert_equal(true, @invoice.empty?)
item = flexmock('item')
@invoice.items.push(item)
assert_equal(false, @invoice.empty?)
end
def test_date_must_be_current
refute_nil(@invoice.date, 'A new invoice must have the current year by default')
assert_equal(Date.today.year, @invoice.date.year)
end
def test_date_must_be_fixed
@invoice.date= Date.new(-4712, 1, 1)
item = Item.new({:time => Time.now})
@invoice.add_item(Item.new({:time => Time.now}))
assert_equal(Date.today.year, @invoice.date.year)
end
end
class TestAutoInvoice < Minitest::Test
def setup
@invoice = AutoInvoice.new(23)
end
def test_advance
assert_equal 10, @invoice.payment_period
today = Date.today
subj = 'Reminder for 2008, 2009 and 2010'
@invoice.reminder_subject = subj
retval = @invoice.advance(today)
assert_equal(today, @invoice.date)
assert_equal(@invoice.date, retval)
assert_equal subj, @invoice.reminder_subject
@invoice.invoice_interval = "inv_3"
retval = @invoice.advance(today)
assert_equal(today >> 3, @invoice.date)
assert_equal(@invoice.date, retval)
assert_equal subj, @invoice.reminder_subject
@invoice.invoice_interval = "inv_12"
retval = @invoice.advance(today - 2)
assert_equal((today - 2) >> 12, @invoice.date)
assert_equal(@invoice.date, retval)
subj = 'Reminder for 2009, 2010 and 2011'
assert_equal subj, @invoice.reminder_subject
assert_equal 10, @invoice.payment_period
@invoice.invoice_interval = "inv_24"
subj = 'Reminder for 2011, 2012 and 2013'
retval = @invoice.advance(today - 2)
assert_equal subj, @invoice.reminder_subject
end
end
end