payday 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +5 -0
- data/Gemfile +1 -0
- data/lib/payday/locale/zh-CN.yml +21 -0
- data/lib/payday/version.rb +1 -1
- data/spec/invoice_spec.rb +177 -0
- data/spec/line_item_spec.rb +26 -0
- data/spec/spec_helper.rb +10 -0
- metadata +52 -20
- data/test/invoice_test.rb +0 -175
- data/test/line_item_test.rb +0 -25
- data/test/test_helper.rb +0 -32
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
zh-CN:
|
2
|
+
payday:
|
3
|
+
status:
|
4
|
+
paid: 付款成功
|
5
|
+
overdue: 已过期
|
6
|
+
invoice:
|
7
|
+
bill_to: 账单地址
|
8
|
+
ship_to: 送货地址
|
9
|
+
invoice_no: "单号 #:"
|
10
|
+
due_date: "过期日期:"
|
11
|
+
paid_date: "支付日期:"
|
12
|
+
subtotal: "小计:"
|
13
|
+
shipping: "邮费:"
|
14
|
+
tax: "税费:"
|
15
|
+
total: "总计:"
|
16
|
+
notes: "备注"
|
17
|
+
line_item:
|
18
|
+
description: 描述
|
19
|
+
unit_price: 单价
|
20
|
+
quantity: 数量
|
21
|
+
amount: 合计
|
data/lib/payday/version.rb
CHANGED
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Payday
|
4
|
+
describe Invoice do
|
5
|
+
|
6
|
+
it "should be able to be initalized with a hash of options" do
|
7
|
+
i = Invoice.new(:invoice_number => 20, :bill_to => "Here", :ship_to => "There",
|
8
|
+
:notes => "These are some notes.",
|
9
|
+
:line_items => [LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")],
|
10
|
+
:shipping_rate => 15.00, :shipping_description => "USPS Priority Mail:",
|
11
|
+
:tax_rate => 0.125, :tax_description => "Local Sales Tax, 12.5%")
|
12
|
+
|
13
|
+
expect(i.invoice_number).to eq(20)
|
14
|
+
expect(i.bill_to).to eq("Here")
|
15
|
+
expect(i.ship_to).to eq("There")
|
16
|
+
expect(i.notes).to eq("These are some notes.")
|
17
|
+
expect(i.line_items[0].description).to eq("Shirts")
|
18
|
+
expect(i.shipping_rate).to eq(BigDecimal.new("15.00"))
|
19
|
+
expect(i.shipping_description).to eq("USPS Priority Mail:")
|
20
|
+
expect(i.tax_rate).to eq(BigDecimal.new("0.125"))
|
21
|
+
expect(i.tax_description).to eq("Local Sales Tax, 12.5%")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should total all of the line items into a subtotal correctly" do
|
25
|
+
i = Invoice.new
|
26
|
+
|
27
|
+
# $100 in Pants
|
28
|
+
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
29
|
+
|
30
|
+
# $30 in Shirts
|
31
|
+
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
32
|
+
|
33
|
+
# $1000 in Hats
|
34
|
+
i.line_items << LineItem.new(:price => 5, :quantity => 200, :description => "Hats")
|
35
|
+
|
36
|
+
expect(i.subtotal).to eq(BigDecimal.new("1130"))
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should calculate the correct tax amount, rounded to two decimal places" do
|
40
|
+
i = Invoice.new(:tax_rate => 0.1)
|
41
|
+
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
42
|
+
|
43
|
+
expect(i.tax).to eq(BigDecimal.new("10"))
|
44
|
+
end
|
45
|
+
|
46
|
+
it "shouldn't apply taxes to invoices with a subtotal of 0 or a negative amount" do
|
47
|
+
i = Invoice.new(:tax_rate => 0.1)
|
48
|
+
i.line_items << LineItem.new(:price => -1, :quantity => 100, :description => "Negative Priced Pants")
|
49
|
+
|
50
|
+
expect(i.tax).to eq(BigDecimal.new("0"))
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should calculate the total for an invoice correctly" do
|
54
|
+
i = Invoice.new(:tax_rate => 0.1)
|
55
|
+
|
56
|
+
# $100 in Pants
|
57
|
+
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
58
|
+
|
59
|
+
# $30 in Shirts
|
60
|
+
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
61
|
+
|
62
|
+
# $1000 in Hats
|
63
|
+
i.line_items << LineItem.new(:price => 5, :quantity => 200, :description => "Hats")
|
64
|
+
|
65
|
+
expect(i.total).to eq(BigDecimal.new("1234"))
|
66
|
+
end
|
67
|
+
|
68
|
+
it "is overdue when it's past date and unpaid" do
|
69
|
+
i = Invoice.new(:due_at => Date.today - 1)
|
70
|
+
expect(i.overdue?).to eq(true)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "isn't overdue when past due date and paid" do
|
74
|
+
i = Invoice.new(:due_at => Date.today - 1, :paid_at => Date.today)
|
75
|
+
expect(i.overdue?).not_to eq(true)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "is overdue when due date is a time before the current date" do
|
79
|
+
i = Invoice.new(:due_at => Time.parse("Jan 1 14:33:20 GMT 2011"))
|
80
|
+
expect(i.overdue?).to eq(true)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "shouldn't be paid when not marked paid" do
|
84
|
+
i = Invoice.new
|
85
|
+
expect(i.paid?).not_to eq(true)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should be paid when marked as paid" do
|
89
|
+
i = Invoice.new(:paid_at => Date.today)
|
90
|
+
expect(i.paid?).to eq(true)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should be able to iterate over details" do
|
94
|
+
i = Invoice.new(:invoice_details => [["Test", "Yes"], ["Awesome", "Absolutely"]])
|
95
|
+
details = []
|
96
|
+
i.each_detail do |key, value|
|
97
|
+
details << [key, value]
|
98
|
+
end
|
99
|
+
|
100
|
+
expect(details.length).to eq(2)
|
101
|
+
expect(details).to include(["Test", "Yes"])
|
102
|
+
expect(details).to include(["Awesome", "Absolutely"])
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should be able to iterate through invoice_details as a hash" do
|
106
|
+
i = Invoice.new(:invoice_details => {"Test" => "Yes", "Awesome" => "Absolutely"})
|
107
|
+
details = []
|
108
|
+
i.each_detail do |key, value|
|
109
|
+
details << [key, value]
|
110
|
+
end
|
111
|
+
|
112
|
+
expect(details.length).to eq(2)
|
113
|
+
expect(details).to include(["Test", "Yes"])
|
114
|
+
expect(details).to include(["Awesome", "Absolutely"])
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "rendering" do
|
118
|
+
before do
|
119
|
+
Dir.mkdir("tmp") unless File.exists?("tmp")
|
120
|
+
Config.default.reset
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should be able to render to a file" do
|
124
|
+
File.unlink("tmp/testing.pdf") if File.exists?("tmp/testing.pdf")
|
125
|
+
|
126
|
+
i = Invoice.new(:tax_rate => 0.1, :notes => "These are some crazy awesome notes!", :invoice_number => 12,
|
127
|
+
:due_at => Date.civil(2011, 1, 22), #:paid_at => Date.civil(2012, 2, 22),
|
128
|
+
:bill_to => "Alan Johnson\n101 This Way\nSomewhere, SC 22222",
|
129
|
+
:ship_to => "Frank Johnson\n101 That Way\nOther, SC 22229",
|
130
|
+
:invoice_details => {"Ordered By:" => "Alan Johnson", "Paid By:" => "Dude McDude"})
|
131
|
+
|
132
|
+
Payday::Config.default.company_details = "10 This Way\nManhattan, NY 10001\n800-111-2222\nawesome@awesomecorp.com"
|
133
|
+
|
134
|
+
30.times do
|
135
|
+
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
136
|
+
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
137
|
+
i.line_items << LineItem.new(:price => 5, :quantity => 200, :description => "Hats")
|
138
|
+
end
|
139
|
+
|
140
|
+
i.render_pdf_to_file("tmp/testing.pdf")
|
141
|
+
|
142
|
+
expect(File.exists?("tmp/testing.pdf")).to eq(true)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should be able to render to a string" do
|
146
|
+
i = Invoice.new(:tax_rate => 0.1, :notes => "These are some crazy awesome notes!", :invoice_number => 12,
|
147
|
+
:due_at => Date.civil(2011, 1, 22), :paid_at => Date.civil(2012, 2, 22),
|
148
|
+
:bill_to => "Alan Johnson\n101 This Way\nSomewhere, SC 22222", :ship_to => "Frank Johnson\n101 That Way\nOther, SC 22229")
|
149
|
+
|
150
|
+
3.times do
|
151
|
+
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
152
|
+
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
153
|
+
i.line_items << LineItem.new(:price => 5, :quantity => 200.0, :description => "Hats")
|
154
|
+
end
|
155
|
+
|
156
|
+
expect(i.render_pdf).not_to eq(nil)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should be able to render with an svg logo" do
|
160
|
+
Payday::Config.default.invoice_logo = { :filename => "assets/tiger.svg", :size => "100x100" }
|
161
|
+
i = Invoice.new(:tax_rate => 0.1, :notes => "These are some crazy awesome notes!", :invoice_number => 12,
|
162
|
+
:due_at => Date.civil(2011, 1, 22), :paid_at => Date.civil(2012, 2, 22),
|
163
|
+
:bill_to => "Alan Johnson\n101 This Way\nSomewhere, SC 22222", :ship_to => "Frank Johnson\n101 That Way\nOther, SC 22229")
|
164
|
+
|
165
|
+
3.times do
|
166
|
+
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
167
|
+
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
168
|
+
i.line_items << LineItem.new(:price => 5, :quantity => 200.0, :description => "Hats")
|
169
|
+
end
|
170
|
+
|
171
|
+
i.render_pdf_to_file("tmp/svg.pdf")
|
172
|
+
|
173
|
+
expect(i.render_pdf).not_to eq(nil)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Payday
|
4
|
+
describe LineItem do
|
5
|
+
it "should be able to be initilized with a price" do
|
6
|
+
li = LineItem.new(:price => BigDecimal.new("20"))
|
7
|
+
expect(li.price).to eq(BigDecimal.new("20"))
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to be initialized with a quantity" do
|
11
|
+
li = LineItem.new(:quantity => 30)
|
12
|
+
expect(li.quantity).to eq(BigDecimal.new("30"))
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be able to be initlialized with a description" do
|
16
|
+
li = LineItem.new(:description => "12 Pairs of Pants")
|
17
|
+
expect(li.description).to eq("12 Pairs of Pants")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return the correct amount" do
|
21
|
+
li = LineItem.new(:price => 10, :quantity => 12)
|
22
|
+
expect(li.amount).to eq(BigDecimal.new("120"))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: payday
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: prawn
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 0.12.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.12.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: money
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 3.6.1
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.6.1
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: prawn-svg
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: 0.9.1
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.1
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: i18n
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: 0.5.0
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.5.0
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: minitest
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,7 +85,12 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
description: Payday is a library for rendering invoices. At present it supports rendering
|
70
95
|
invoices to pdfs, but we're planning on adding support for other formats in the
|
71
96
|
near future.
|
@@ -76,6 +101,7 @@ extensions: []
|
|
76
101
|
extra_rdoc_files: []
|
77
102
|
files:
|
78
103
|
- .gitignore
|
104
|
+
- CHANGELOG.md
|
79
105
|
- Gemfile
|
80
106
|
- README.md
|
81
107
|
- Rakefile
|
@@ -97,12 +123,13 @@ files:
|
|
97
123
|
- lib/payday/locale/en.yml
|
98
124
|
- lib/payday/locale/es.yml
|
99
125
|
- lib/payday/locale/fr.yml
|
126
|
+
- lib/payday/locale/zh-CN.yml
|
100
127
|
- lib/payday/pdf_renderer.rb
|
101
128
|
- lib/payday/version.rb
|
102
129
|
- payday.gemspec
|
103
|
-
-
|
104
|
-
-
|
105
|
-
-
|
130
|
+
- spec/invoice_spec.rb
|
131
|
+
- spec/line_item_spec.rb
|
132
|
+
- spec/spec_helper.rb
|
106
133
|
homepage: ''
|
107
134
|
licenses: []
|
108
135
|
post_install_message:
|
@@ -115,20 +142,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
142
|
- - ! '>='
|
116
143
|
- !ruby/object:Gem::Version
|
117
144
|
version: '0'
|
145
|
+
segments:
|
146
|
+
- 0
|
147
|
+
hash: 2492971967055799217
|
118
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
149
|
none: false
|
120
150
|
requirements:
|
121
151
|
- - ! '>='
|
122
152
|
- !ruby/object:Gem::Version
|
123
153
|
version: '0'
|
154
|
+
segments:
|
155
|
+
- 0
|
156
|
+
hash: 2492971967055799217
|
124
157
|
requirements: []
|
125
158
|
rubyforge_project:
|
126
|
-
rubygems_version: 1.8.
|
159
|
+
rubygems_version: 1.8.23
|
127
160
|
signing_key:
|
128
161
|
specification_version: 3
|
129
162
|
summary: git remote add origin git@github.com:commondream/payday.git
|
130
163
|
test_files:
|
131
|
-
-
|
132
|
-
-
|
133
|
-
-
|
134
|
-
has_rdoc:
|
164
|
+
- spec/invoice_spec.rb
|
165
|
+
- spec/line_item_spec.rb
|
166
|
+
- spec/spec_helper.rb
|
data/test/invoice_test.rb
DELETED
@@ -1,175 +0,0 @@
|
|
1
|
-
require File.expand_path("test/test_helper")
|
2
|
-
|
3
|
-
module Payday
|
4
|
-
class InvoiceTest < MiniTest::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
Dir.mkdir("tmp") unless File.exists?("tmp")
|
7
|
-
Config.default.reset
|
8
|
-
end
|
9
|
-
|
10
|
-
test "that setting values through the options hash on initialization works" do
|
11
|
-
i = Invoice.new(:invoice_number => 20, :bill_to => "Here", :ship_to => "There",
|
12
|
-
:notes => "These are some notes.",
|
13
|
-
:line_items => [LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")],
|
14
|
-
:shipping_rate => 15.00, :shipping_description => "USPS Priority Mail:",
|
15
|
-
:tax_rate => 0.125, :tax_description => "Local Sales Tax, 12.5%")
|
16
|
-
|
17
|
-
assert_equal 20, i.invoice_number
|
18
|
-
assert_equal "Here", i.bill_to
|
19
|
-
assert_equal "There", i.ship_to
|
20
|
-
assert_equal "These are some notes.", i.notes
|
21
|
-
assert_equal "Shirts", i.line_items[0].description
|
22
|
-
assert_equal BigDecimal.new("15.00"), i.shipping_rate
|
23
|
-
assert_equal "USPS Priority Mail:", i.shipping_description
|
24
|
-
assert_equal BigDecimal.new("0.125"), i.tax_rate
|
25
|
-
assert_equal "Local Sales Tax, 12.5%", i.tax_description
|
26
|
-
end
|
27
|
-
|
28
|
-
test "that subtotal totals up all of the line items in an invoice correctly" do
|
29
|
-
i = Invoice.new
|
30
|
-
|
31
|
-
# $100 in Pants
|
32
|
-
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
33
|
-
|
34
|
-
# $30 in Shirts
|
35
|
-
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
36
|
-
|
37
|
-
# $1000 in Hats
|
38
|
-
i.line_items << LineItem.new(:price => 5, :quantity => 200, :description => "Hats")
|
39
|
-
|
40
|
-
assert_equal BigDecimal.new("1130"), i.subtotal
|
41
|
-
end
|
42
|
-
|
43
|
-
test "that tax returns the correct tax amount, rounded to two decimal places" do
|
44
|
-
i = Invoice.new(:tax_rate => 0.1)
|
45
|
-
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
46
|
-
|
47
|
-
assert_equal(BigDecimal.new("10"), i.tax)
|
48
|
-
end
|
49
|
-
|
50
|
-
test "that taxes aren't applied to invoices with a subtotal of 0 or a negative amount" do
|
51
|
-
i = Invoice.new(:tax_rate => 0.1)
|
52
|
-
i.line_items << LineItem.new(:price => -1, :quantity => 100, :description => "Negative Priced Pants")
|
53
|
-
|
54
|
-
assert_equal(BigDecimal.new("0"), i.tax)
|
55
|
-
end
|
56
|
-
|
57
|
-
test "that the total for this invoice calculates correctly" do
|
58
|
-
i = Invoice.new(:tax_rate => 0.1)
|
59
|
-
|
60
|
-
# $100 in Pants
|
61
|
-
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
62
|
-
|
63
|
-
# $30 in Shirts
|
64
|
-
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
65
|
-
|
66
|
-
# $1000 in Hats
|
67
|
-
i.line_items << LineItem.new(:price => 5, :quantity => 200, :description => "Hats")
|
68
|
-
|
69
|
-
assert_equal BigDecimal.new("1243"), i.total
|
70
|
-
end
|
71
|
-
|
72
|
-
test "overdue? is false when past date and unpaid" do
|
73
|
-
i = Invoice.new(:due_at => Date.today - 1)
|
74
|
-
assert i.overdue?
|
75
|
-
end
|
76
|
-
|
77
|
-
test "overdue? is true when past date but paid" do
|
78
|
-
i = Invoice.new(:due_at => Date.today - 1, :paid_at => Date.today)
|
79
|
-
assert !i.overdue?
|
80
|
-
end
|
81
|
-
|
82
|
-
test "overdue? when due_at is a time" do
|
83
|
-
i = Invoice.new(:due_at => Time.parse("Jan 1 14:33:20 GMT 2011"))
|
84
|
-
assert i.overdue?
|
85
|
-
end
|
86
|
-
|
87
|
-
test "paid is false when not paid" do
|
88
|
-
i = Invoice.new
|
89
|
-
assert !i.paid?
|
90
|
-
end
|
91
|
-
|
92
|
-
test "paid is true when paid" do
|
93
|
-
i = Invoice.new(:paid_at => Date.today)
|
94
|
-
assert i.paid?
|
95
|
-
end
|
96
|
-
|
97
|
-
test "iterating through invoice_details as two element arrays" do
|
98
|
-
i = Invoice.new(:invoice_details => [["Test", "Yes"], ["Awesome", "Absolutely"]])
|
99
|
-
details = []
|
100
|
-
i.each_detail do |key, value|
|
101
|
-
details << [key, value]
|
102
|
-
end
|
103
|
-
|
104
|
-
assert_equal 2, details.length
|
105
|
-
assert details.include?(["Test", "Yes"])
|
106
|
-
assert details.include?(["Awesome", "Absolutely"])
|
107
|
-
end
|
108
|
-
|
109
|
-
test "iterating through invoice_details as a hash" do
|
110
|
-
i = Invoice.new(:invoice_details => {"Test" => "Yes", "Awesome" => "Absolutely"})
|
111
|
-
details = []
|
112
|
-
i.each_detail do |key, value|
|
113
|
-
details << [key, value]
|
114
|
-
end
|
115
|
-
|
116
|
-
assert_equal 2, details.length
|
117
|
-
assert details.include?(["Test", "Yes"])
|
118
|
-
assert details.include?(["Awesome", "Absolutely"])
|
119
|
-
end
|
120
|
-
|
121
|
-
test "rendering to file" do
|
122
|
-
File.unlink("tmp/testing.pdf") if File.exists?("tmp/testing.pdf")
|
123
|
-
assert !File.exists?("tmp/testing.pdf")
|
124
|
-
|
125
|
-
i = Invoice.new(:tax_rate => 0.1, :notes => "These are some crazy awesome notes!", :invoice_number => 12,
|
126
|
-
:due_at => Date.civil(2011, 1, 22), #:paid_at => Date.civil(2012, 2, 22),
|
127
|
-
:bill_to => "Alan Johnson\n101 This Way\nSomewhere, SC 22222",
|
128
|
-
:ship_to => "Frank Johnson\n101 That Way\nOther, SC 22229",
|
129
|
-
:invoice_details => {"Ordered By:" => "Alan Johnson", "Paid By:" => "Dude McDude"})
|
130
|
-
|
131
|
-
Payday::Config.default.company_details = "10 This Way\nManhattan, NY 10001\n800-111-2222\nawesome@awesomecorp.com"
|
132
|
-
|
133
|
-
30.times do
|
134
|
-
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
135
|
-
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
136
|
-
i.line_items << LineItem.new(:price => 5, :quantity => 200, :description => "Hats")
|
137
|
-
end
|
138
|
-
|
139
|
-
i.render_pdf_to_file("tmp/testing.pdf")
|
140
|
-
|
141
|
-
assert File.exists?("tmp/testing.pdf")
|
142
|
-
end
|
143
|
-
|
144
|
-
test "rendering to string" do
|
145
|
-
i = Invoice.new(:tax_rate => 0.1, :notes => "These are some crazy awesome notes!", :invoice_number => 12,
|
146
|
-
:due_at => Date.civil(2011, 1, 22), :paid_at => Date.civil(2012, 2, 22),
|
147
|
-
:bill_to => "Alan Johnson\n101 This Way\nSomewhere, SC 22222", :ship_to => "Frank Johnson\n101 That Way\nOther, SC 22229")
|
148
|
-
|
149
|
-
3.times do
|
150
|
-
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
151
|
-
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
152
|
-
i.line_items << LineItem.new(:price => 5, :quantity => 200.0, :description => "Hats")
|
153
|
-
end
|
154
|
-
|
155
|
-
refute_nil i.render_pdf
|
156
|
-
end
|
157
|
-
|
158
|
-
test "rendering with an svg logo" do
|
159
|
-
Payday::Config.default.invoice_logo = { :filename => "assets/tiger.svg", :size => "100x100" }
|
160
|
-
i = Invoice.new(:tax_rate => 0.1, :notes => "These are some crazy awesome notes!", :invoice_number => 12,
|
161
|
-
:due_at => Date.civil(2011, 1, 22), :paid_at => Date.civil(2012, 2, 22),
|
162
|
-
:bill_to => "Alan Johnson\n101 This Way\nSomewhere, SC 22222", :ship_to => "Frank Johnson\n101 That Way\nOther, SC 22229")
|
163
|
-
|
164
|
-
3.times do
|
165
|
-
i.line_items << LineItem.new(:price => 20, :quantity => 5, :description => "Pants")
|
166
|
-
i.line_items << LineItem.new(:price => 10, :quantity => 3, :description => "Shirts")
|
167
|
-
i.line_items << LineItem.new(:price => 5, :quantity => 200.0, :description => "Hats")
|
168
|
-
end
|
169
|
-
|
170
|
-
i.render_pdf_to_file("tmp/svg.pdf")
|
171
|
-
|
172
|
-
refute_nil i.render_pdf
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
data/test/line_item_test.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require File.expand_path("test/test_helper")
|
2
|
-
|
3
|
-
module Payday
|
4
|
-
class LineItemTest < MiniTest::Unit::TestCase
|
5
|
-
test "initializing with a price" do
|
6
|
-
li = LineItem.new(:price => BigDecimal.new("20"))
|
7
|
-
assert_equal BigDecimal.new("20"), li.price
|
8
|
-
end
|
9
|
-
|
10
|
-
test "initializing with a quantity" do
|
11
|
-
li = LineItem.new(:quantity => 30)
|
12
|
-
assert_equal BigDecimal.new("30"), li.quantity
|
13
|
-
end
|
14
|
-
|
15
|
-
test "initializing with a description" do
|
16
|
-
li = LineItem.new(:description => "12 Pairs of Pants")
|
17
|
-
assert_equal "12 Pairs of Pants", li.description
|
18
|
-
end
|
19
|
-
|
20
|
-
test "that amount returns the correct amount" do
|
21
|
-
li = LineItem.new(:price => 10, :quantity => 12)
|
22
|
-
assert_equal BigDecimal.new("120"), li.amount
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require File.expand_path('lib/payday')
|
2
|
-
|
3
|
-
require 'minitest/autorun'
|
4
|
-
require 'date'
|
5
|
-
require 'time'
|
6
|
-
|
7
|
-
# Shamelessly ripped from jm's context library: https://github.com/jm/context/blob/master/lib/context/test.rb
|
8
|
-
class MiniTest::Unit::TestCase
|
9
|
-
class << self
|
10
|
-
# Create a test method. +name+ is a native-language string to describe the test
|
11
|
-
# (e.g., no more +test_this_crazy_thing_with_underscores+).
|
12
|
-
#
|
13
|
-
# test "A user should not be able to delete another user" do
|
14
|
-
# assert_false @user.can?(:delete, @other_user)
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
def test(name, opts={}, &block)
|
18
|
-
test_name = ["test:", name].reject { |n| n == "" }.join(' ')
|
19
|
-
# puts "running test #{test_name}"
|
20
|
-
defined = instance_method(test_name) rescue false
|
21
|
-
raise "#{test_name} is already defined in #{self}" if defined
|
22
|
-
|
23
|
-
if block_given?
|
24
|
-
define_method(test_name, &block)
|
25
|
-
else
|
26
|
-
define_method(test_name) do
|
27
|
-
flunk "No implementation provided for #{name}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|