cashboard 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +26 -0
- data/.gitignore +2 -0
- data/LICENSE +19 -0
- data/README.textile +58 -0
- data/Rakefile +25 -0
- data/cashboard.gemspec +129 -0
- data/examples/create_account.rb +38 -0
- data/examples/list_stuff_in_account.rb +15 -0
- data/examples/simple_workflow.rb +35 -0
- data/examples/time_tracking.rb +30 -0
- data/examples/toggle_timer.rb +0 -0
- data/lib/cashboard/account.rb +21 -0
- data/lib/cashboard/base.rb +223 -0
- data/lib/cashboard/behaviors/base.rb +4 -0
- data/lib/cashboard/behaviors/lists_line_items.rb +32 -0
- data/lib/cashboard/behaviors/toggleable.rb +18 -0
- data/lib/cashboard/client_company.rb +25 -0
- data/lib/cashboard/client_contact.rb +32 -0
- data/lib/cashboard/company_membership.rb +6 -0
- data/lib/cashboard/document_template.rb +10 -0
- data/lib/cashboard/employee.rb +29 -0
- data/lib/cashboard/errors.rb +48 -0
- data/lib/cashboard/estimate.rb +43 -0
- data/lib/cashboard/expense.rb +14 -0
- data/lib/cashboard/invoice.rb +75 -0
- data/lib/cashboard/invoice_line_item.rb +15 -0
- data/lib/cashboard/invoice_payment.rb +7 -0
- data/lib/cashboard/line_item.rb +27 -0
- data/lib/cashboard/payment.rb +22 -0
- data/lib/cashboard/project.rb +38 -0
- data/lib/cashboard/project_assignment.rb +9 -0
- data/lib/cashboard/time_entry.rb +45 -0
- data/lib/cashboard/version.rb +3 -0
- data/lib/cashboard.rb +75 -0
- data/lib/typecasted_open_struct.rb +82 -0
- data/test/fixtures/account.xml +50 -0
- data/test/fixtures/cashboard_credentials.yml +3 -0
- data/test/fixtures/client_companies.xml +41 -0
- data/test/fixtures/client_contacts.xml +53 -0
- data/test/fixtures/company_memberships.xml +21 -0
- data/test/fixtures/document_templates.xml +53 -0
- data/test/fixtures/employees.xml +51 -0
- data/test/fixtures/estimates.xml +243 -0
- data/test/fixtures/expenses.xml +101 -0
- data/test/fixtures/invoice_line_items.xml +138 -0
- data/test/fixtures/invoice_payments.xml +10 -0
- data/test/fixtures/invoices.xml +231 -0
- data/test/fixtures/line_items.xml +243 -0
- data/test/fixtures/payments.xml +93 -0
- data/test/fixtures/project_assignments.xml +30 -0
- data/test/fixtures/projects.xml +129 -0
- data/test/fixtures/time_entries.xml +213 -0
- data/test/full.rb +3 -0
- data/test/test_helper.rb +112 -0
- data/test/unit/account_test.rb +85 -0
- data/test/unit/document_template_test.rb +18 -0
- data/test/unit/estimate_test.rb +166 -0
- data/test/unit/expense_test.rb +16 -0
- data/test/unit/invoice_test.rb +185 -0
- data/test/unit/project_test.rb +198 -0
- data/test/unit/time_entry_test.rb +225 -0
- metadata +220 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class AccountTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_create_success
|
6
|
+
FakeWeb.register_uri(
|
7
|
+
:post,
|
8
|
+
url_with_auth("/#{Cashboard::Account.resource_name}"),
|
9
|
+
:status => ["201", "Created"],
|
10
|
+
:body => get_xml_for_fixture('account')
|
11
|
+
) if MOCK_WEB_CONNECTIONS
|
12
|
+
|
13
|
+
acct = Cashboard::Account.create({
|
14
|
+
:subdomain => generate_random_string,
|
15
|
+
:currency_type => 'USD',
|
16
|
+
:date_format => 'mm_dd_yyyy',
|
17
|
+
:owner => {
|
18
|
+
:email_address => 'rza@wutang.com',
|
19
|
+
:first_name => 'The',
|
20
|
+
:last_name => 'Rza',
|
21
|
+
:password => '36chambers'
|
22
|
+
},
|
23
|
+
:company => {
|
24
|
+
:name => 'Wu Tang',
|
25
|
+
:address => '1 Shogun Way',
|
26
|
+
:city => 'Shaolin',
|
27
|
+
:state => 'NY'
|
28
|
+
}
|
29
|
+
})
|
30
|
+
|
31
|
+
assert_kind_of Cashboard::Struct, acct.owner
|
32
|
+
assert_kind_of Cashboard::Struct, acct.company
|
33
|
+
|
34
|
+
assert !acct.owner.api_key.blank?
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_create_fail
|
38
|
+
FakeWeb.register_uri(
|
39
|
+
:post,
|
40
|
+
url_with_auth("/#{Cashboard::Account.resource_name}"),
|
41
|
+
:status => ["400", "Bad Request"],
|
42
|
+
:body => GENERIC_ERROR_XML
|
43
|
+
) if MOCK_WEB_CONNECTIONS
|
44
|
+
|
45
|
+
assert_raises Cashboard::BadRequest do
|
46
|
+
Cashboard::Account.create()
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_update_success
|
51
|
+
acct = Cashboard::Account.new_from_url('/account')
|
52
|
+
|
53
|
+
FakeWeb.register_uri(
|
54
|
+
:put,
|
55
|
+
url_with_auth("/#{Cashboard::Account.resource_name}"),
|
56
|
+
:status => ["200", "Ok"],
|
57
|
+
:body => get_xml_for_fixture('account')
|
58
|
+
) if MOCK_WEB_CONNECTIONS
|
59
|
+
|
60
|
+
acct.date_format = 'yyyy_mm_dd'
|
61
|
+
assert acct.update, "Account didn't save properly"
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_update_fail
|
65
|
+
acct = Cashboard::Account.new_from_url('/account')
|
66
|
+
|
67
|
+
FakeWeb.register_uri(
|
68
|
+
:put,
|
69
|
+
url_with_auth("/#{Cashboard::Account.resource_name}"),
|
70
|
+
:status => ["400", "Bad Request"],
|
71
|
+
:body => GENERIC_ERROR_XML
|
72
|
+
) if MOCK_WEB_CONNECTIONS
|
73
|
+
|
74
|
+
acct.subdomain = ''
|
75
|
+
assert !acct.update, "Account shouldn't have saved with blank subdomain"
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_new_from_url
|
79
|
+
acct = Cashboard::Account.new_from_url('/account')
|
80
|
+
assert_kind_of Cashboard::Account, acct
|
81
|
+
assert_kind_of Cashboard::Struct, acct.owner
|
82
|
+
assert_kind_of Cashboard::Struct, acct.company
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class DocumentTemplateTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_list
|
6
|
+
templates = Cashboard::DocumentTemplate.list
|
7
|
+
assert templates.size > 0
|
8
|
+
templates.each do |dt|
|
9
|
+
assert_kind_of Cashboard::DocumentTemplate, dt
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_href
|
14
|
+
tmpl = Cashboard::DocumentTemplate.list[0]
|
15
|
+
assert_kind_of String, tmpl.href
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class EstimateTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
# CUSTOM ASSERTIONS ---------------------------------------------------------
|
6
|
+
|
7
|
+
def assert_list_type(method, type)
|
8
|
+
mock_sub_resource(
|
9
|
+
Cashboard::Estimate.resource_name,
|
10
|
+
'line_items',
|
11
|
+
'line_items'
|
12
|
+
) if MOCK_WEB_CONNECTIONS
|
13
|
+
|
14
|
+
est = Cashboard::Estimate.list[0]
|
15
|
+
collection = est.send(method)
|
16
|
+
assert collection.size > 0
|
17
|
+
collection.each do |item|
|
18
|
+
assert_kind_of Cashboard::LineItem, item
|
19
|
+
assert_equal Cashboard::LineItem::TYPE_CODES[type], item.type_code.to_i
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# TESTS ---------------------------------------------------------------------
|
25
|
+
|
26
|
+
def test_list
|
27
|
+
estimates = Cashboard::Estimate.list
|
28
|
+
assert estimates.size > 0
|
29
|
+
estimates.each do |est|
|
30
|
+
assert_kind_of Cashboard::Estimate, est
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_create
|
35
|
+
FakeWeb.register_uri(
|
36
|
+
:post,
|
37
|
+
url_with_auth("/#{Cashboard::Estimate.resource_name}"),
|
38
|
+
:status => ["201", "Created"],
|
39
|
+
:body => Cashboard::Estimate.list[0].to_xml
|
40
|
+
) if MOCK_WEB_CONNECTIONS
|
41
|
+
|
42
|
+
client = Cashboard::ClientCompany.list[0]
|
43
|
+
|
44
|
+
# Create random estimate name so even if not destroyed on
|
45
|
+
# a live connection we don't run into duplicate name validation errors.
|
46
|
+
est_name = "Test estimate - " + generate_random_string
|
47
|
+
assert_nothing_raised do
|
48
|
+
estimate = Cashboard::Estimate.create(
|
49
|
+
:name => est_name,
|
50
|
+
:client_id => client.id,
|
51
|
+
:client_type => 'Company'
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_update_success
|
57
|
+
est = Cashboard::Estimate.list[0]
|
58
|
+
|
59
|
+
FakeWeb.register_uri(
|
60
|
+
:put,
|
61
|
+
url_with_auth(est.href),
|
62
|
+
:status => ["200", "Ok"],
|
63
|
+
:body => est.to_xml
|
64
|
+
) if MOCK_WEB_CONNECTIONS
|
65
|
+
|
66
|
+
est.name = 'Some new name'
|
67
|
+
assert est.update, "Estimate didn't save properly"
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_update_fail
|
71
|
+
est = Cashboard::Estimate.list[0]
|
72
|
+
|
73
|
+
FakeWeb.register_uri(
|
74
|
+
:put,
|
75
|
+
url_with_auth(est.href),
|
76
|
+
:status => ["400", "Bad Request"],
|
77
|
+
:body => GENERIC_ERROR_XML
|
78
|
+
) if MOCK_WEB_CONNECTIONS
|
79
|
+
|
80
|
+
est.name = 'Some new name'
|
81
|
+
assert !est.update, "Estimate saved when it shouldn't have"
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_delete_success
|
85
|
+
est = Cashboard::Estimate.list[0]
|
86
|
+
|
87
|
+
FakeWeb.register_uri(
|
88
|
+
:delete,
|
89
|
+
url_with_auth(est.href),
|
90
|
+
:status => ["200", "Ok"]
|
91
|
+
) if MOCK_WEB_CONNECTIONS
|
92
|
+
|
93
|
+
assert est.delete, "Estimate wasn't deleted."
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_delete_fail
|
97
|
+
est = Cashboard::Estimate.list[0]
|
98
|
+
|
99
|
+
FakeWeb.register_uri(
|
100
|
+
:delete,
|
101
|
+
url_with_auth(est.href),
|
102
|
+
:status => ["404", "Not found"]
|
103
|
+
) if MOCK_WEB_CONNECTIONS
|
104
|
+
|
105
|
+
assert !est.delete, "Estimate was deleted when it shouldn't have been."
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_toggle_status_success
|
109
|
+
est = Cashboard::Estimate.list[0]
|
110
|
+
assert_equal false, est.is_active
|
111
|
+
|
112
|
+
FakeWeb.register_uri(
|
113
|
+
:put,
|
114
|
+
url_with_auth(est.links[:toggle_status]),
|
115
|
+
:status => ["200", "Ok"]
|
116
|
+
) if MOCK_WEB_CONNECTIONS
|
117
|
+
|
118
|
+
initial_status = est.is_active
|
119
|
+
|
120
|
+
assert est.toggle_status
|
121
|
+
assert true, est.is_active
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_toggle_status_failure
|
125
|
+
est = Cashboard::Estimate.list[0]
|
126
|
+
|
127
|
+
FakeWeb.register_uri(
|
128
|
+
:put,
|
129
|
+
url_with_auth(est.links[:toggle_status]),
|
130
|
+
:status => ["401", "Unauthorized"]
|
131
|
+
) if MOCK_WEB_CONNECTIONS
|
132
|
+
|
133
|
+
initial_status = est.is_active
|
134
|
+
|
135
|
+
assert !est.toggle_status
|
136
|
+
assert est.is_active == initial_status
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_line_items
|
140
|
+
mock_sub_resource(
|
141
|
+
Cashboard::Project.resource_name,
|
142
|
+
'line_items',
|
143
|
+
'line_items'
|
144
|
+
) if MOCK_WEB_CONNECTIONS
|
145
|
+
|
146
|
+
est = Cashboard::Estimate.list[0]
|
147
|
+
line_items = est.line_items
|
148
|
+
assert line_items.size > 0
|
149
|
+
line_items.each do |li|
|
150
|
+
assert_kind_of Cashboard::LineItem, li
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_tasks
|
155
|
+
assert_list_type :tasks, :task
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_products
|
159
|
+
assert_list_type :products, :product
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_custom_items
|
163
|
+
assert_list_type :custom_items, :custom
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class ExpenseTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_list
|
6
|
+
expenses = Cashboard::Expense.list
|
7
|
+
assert expenses.size > 0
|
8
|
+
expenses.each do |exp|
|
9
|
+
assert_kind_of Cashboard::Expense, exp
|
10
|
+
assert_kind_of DateTime, exp.created_on
|
11
|
+
assert_kind_of Float, exp.amount
|
12
|
+
assert exp.is_billable.class == TrueClass || exp.is_billable.class == FalseClass
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class InvoiceTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_list
|
6
|
+
invoices = Cashboard::Invoice.list
|
7
|
+
assert invoices.size > 0
|
8
|
+
invoices.each do |inv|
|
9
|
+
assert_kind_of Cashboard::Invoice, inv
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_create_success
|
14
|
+
FakeWeb.register_uri(
|
15
|
+
:post,
|
16
|
+
url_with_auth("/#{Cashboard::Invoice.resource_name}"),
|
17
|
+
:status => ["201", "Created"],
|
18
|
+
:body => Cashboard::Invoice.list[0].to_xml
|
19
|
+
) if MOCK_WEB_CONNECTIONS
|
20
|
+
|
21
|
+
client = Cashboard::ClientCompany.list[0]
|
22
|
+
|
23
|
+
assert_nothing_raised do
|
24
|
+
inv = Cashboard::Invoice.create(
|
25
|
+
:client_id => client.id,
|
26
|
+
:client_type => 'Company'
|
27
|
+
)
|
28
|
+
assert_kind_of Cashboard::Invoice, inv
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_create_fail
|
33
|
+
FakeWeb.register_uri(
|
34
|
+
:post,
|
35
|
+
url_with_auth("/#{Cashboard::Project.resource_name}"),
|
36
|
+
:status => ["400", "Bad Request"],
|
37
|
+
:body => GENERIC_ERROR_XML
|
38
|
+
) if MOCK_WEB_CONNECTIONS
|
39
|
+
|
40
|
+
assert_raise Cashboard::BadRequest do
|
41
|
+
prj = Cashboard::Project.create()
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_update_success
|
46
|
+
inv = Cashboard::Invoice.list[0]
|
47
|
+
|
48
|
+
FakeWeb.register_uri(
|
49
|
+
:put,
|
50
|
+
url_with_auth(inv.href),
|
51
|
+
:status => ["200", "Ok"],
|
52
|
+
:body => inv.to_xml
|
53
|
+
) if MOCK_WEB_CONNECTIONS
|
54
|
+
|
55
|
+
inv.created_on = Date.today
|
56
|
+
inv.due_date = Date.today + 1.week
|
57
|
+
assert inv.update, "Invoice didn't save properly"
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_update_fail
|
61
|
+
inv = Cashboard::Invoice.list[0]
|
62
|
+
|
63
|
+
FakeWeb.register_uri(
|
64
|
+
:put,
|
65
|
+
url_with_auth(inv.href),
|
66
|
+
:status => ["400", "Bad Request"],
|
67
|
+
:body => GENERIC_ERROR_XML
|
68
|
+
) if MOCK_WEB_CONNECTIONS
|
69
|
+
|
70
|
+
inv.client_id = nil
|
71
|
+
assert !inv.update, "Invoice saved when it shouldn't have"
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_delete_success
|
75
|
+
inv = Cashboard::Invoice.list[0]
|
76
|
+
|
77
|
+
FakeWeb.register_uri(
|
78
|
+
:delete,
|
79
|
+
url_with_auth(inv.href),
|
80
|
+
:status => ["200", "Ok"]
|
81
|
+
) if MOCK_WEB_CONNECTIONS
|
82
|
+
|
83
|
+
assert inv.delete, "Invoice wasn't deleted."
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_delete_fail
|
87
|
+
inv = Cashboard::Invoice.list[0]
|
88
|
+
|
89
|
+
FakeWeb.register_uri(
|
90
|
+
:delete,
|
91
|
+
url_with_auth(inv.href),
|
92
|
+
:status => ["404", "Not found"]
|
93
|
+
) if MOCK_WEB_CONNECTIONS
|
94
|
+
|
95
|
+
assert !inv.delete, "Invoice was deleted when it shouldn't have been."
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_line_items
|
99
|
+
mock_sub_resource(
|
100
|
+
Cashboard::Invoice.resource_name,
|
101
|
+
'line_items',
|
102
|
+
'invoice_line_items'
|
103
|
+
) if MOCK_WEB_CONNECTIONS
|
104
|
+
|
105
|
+
inv = Cashboard::Invoice.list[0]
|
106
|
+
|
107
|
+
line_items = inv.line_items
|
108
|
+
assert line_items.size > 0
|
109
|
+
|
110
|
+
line_items.each do |li|
|
111
|
+
assert_kind_of Cashboard::InvoiceLineItem, li
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def mock_import_items_response
|
116
|
+
FakeWeb.register_uri(
|
117
|
+
:put,
|
118
|
+
get_sub_url_regexp(Cashboard::Invoice.resource_name, 'import_uninvoiced_items'),
|
119
|
+
:body => get_xml_for_fixture('invoice_line_items'),
|
120
|
+
:status => ['200', 'OK']
|
121
|
+
) if MOCK_WEB_CONNECTIONS
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_import_uninvoiced_items_no_options
|
125
|
+
mock_import_items_response
|
126
|
+
inv = Cashboard::Invoice.list[0]
|
127
|
+
|
128
|
+
assert_nothing_raised do
|
129
|
+
items = inv.import_uninvoiced_items
|
130
|
+
assert items.size > 0
|
131
|
+
items.each do |li|
|
132
|
+
assert_kind_of Cashboard::InvoiceLineItem, li
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_import_uninvoiced_items_with_projects
|
138
|
+
mock_import_items_response
|
139
|
+
inv = Cashboard::Invoice.list[0]
|
140
|
+
|
141
|
+
inv.expects(:get_import_xml_options).with([12345], nil, nil)
|
142
|
+
|
143
|
+
inv.import_uninvoiced_items([12345])
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_get_import_xml_options_project_id
|
147
|
+
xml_options = %Q\
|
148
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
149
|
+
<projects>
|
150
|
+
<id>12345</id>
|
151
|
+
</projects>
|
152
|
+
<start_date></start_date>
|
153
|
+
<end_date></end_date>
|
154
|
+
\
|
155
|
+
inv = Cashboard::Invoice.list[0]
|
156
|
+
|
157
|
+
opts = inv.get_import_xml_options([12345], nil, nil)
|
158
|
+
|
159
|
+
assert_equal(
|
160
|
+
xml_options.gsub(/\s/, ''),
|
161
|
+
opts.gsub(/\s/, '')
|
162
|
+
)
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_get_import_xml_options_start_end_date
|
166
|
+
d1 = Date.today-1.week
|
167
|
+
d2 = Date.today
|
168
|
+
xml_options = %Q\
|
169
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
170
|
+
<projects>
|
171
|
+
</projects>
|
172
|
+
<start_date>#{d1.to_s}</start_date>
|
173
|
+
<end_date>#{d2.to_s}</end_date>
|
174
|
+
\
|
175
|
+
inv = Cashboard::Invoice.list[0]
|
176
|
+
|
177
|
+
opts = inv.get_import_xml_options(nil, d1, d2)
|
178
|
+
|
179
|
+
assert_equal(
|
180
|
+
xml_options.gsub(/\s/, ''),
|
181
|
+
opts.gsub(/\s/, '')
|
182
|
+
)
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class ProjectTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
# CUSTOM ASSERTIONS ---------------------------------------------------------
|
6
|
+
|
7
|
+
def assert_list_type(method, type)
|
8
|
+
mock_sub_resource(
|
9
|
+
Cashboard::Project.resource_name,
|
10
|
+
'line_items',
|
11
|
+
'line_items'
|
12
|
+
) if MOCK_WEB_CONNECTIONS
|
13
|
+
|
14
|
+
prj = Cashboard::Project.list[0]
|
15
|
+
collection = prj.send(method)
|
16
|
+
assert collection.size > 0
|
17
|
+
collection.each do |item|
|
18
|
+
assert_kind_of Cashboard::LineItem, item
|
19
|
+
assert_equal Cashboard::LineItem::TYPE_CODES[type], item.type_code.to_i
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# TESTS ---------------------------------------------------------------------
|
25
|
+
|
26
|
+
def test_list
|
27
|
+
projects = Cashboard::Project.list
|
28
|
+
assert projects.size > 0
|
29
|
+
projects.each do |prj|
|
30
|
+
assert_kind_of Cashboard::Project, prj
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_create_success
|
35
|
+
FakeWeb.register_uri(
|
36
|
+
:post,
|
37
|
+
url_with_auth("/#{Cashboard::Project.resource_name}"),
|
38
|
+
:status => ["201", "Created"],
|
39
|
+
:body => Cashboard::Project.list[0].to_xml
|
40
|
+
) if MOCK_WEB_CONNECTIONS
|
41
|
+
|
42
|
+
client = Cashboard::ClientCompany.list[0]
|
43
|
+
# Create random project name so even if not destroyed on
|
44
|
+
# a live connection we don't run into duplicate name validation errors.
|
45
|
+
project_name = "Test project - " + generate_random_string
|
46
|
+
assert_nothing_raised do
|
47
|
+
project = Cashboard::Project.create(
|
48
|
+
:name => project_name,
|
49
|
+
:client_id => client.id,
|
50
|
+
:client_type => 'Company'
|
51
|
+
)
|
52
|
+
assert_kind_of Cashboard::Project, project
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_create_fail
|
57
|
+
FakeWeb.register_uri(
|
58
|
+
:post,
|
59
|
+
url_with_auth("/#{Cashboard::Project.resource_name}"),
|
60
|
+
:status => ["400", "Bad Request"],
|
61
|
+
:body => GENERIC_ERROR_XML
|
62
|
+
) if MOCK_WEB_CONNECTIONS
|
63
|
+
|
64
|
+
assert_raise Cashboard::BadRequest do
|
65
|
+
prj = Cashboard::Project.create()
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_update_success
|
70
|
+
prj = Cashboard::Project.list[0]
|
71
|
+
|
72
|
+
FakeWeb.register_uri(
|
73
|
+
:put,
|
74
|
+
url_with_auth(prj.href),
|
75
|
+
:status => ["200", "Ok"],
|
76
|
+
:body => prj.to_xml
|
77
|
+
) if MOCK_WEB_CONNECTIONS
|
78
|
+
|
79
|
+
prj.name = 'Some new name'
|
80
|
+
assert prj.update, "Project didn't save properly"
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_update_fail
|
84
|
+
prj = Cashboard::Project.list[0]
|
85
|
+
|
86
|
+
FakeWeb.register_uri(
|
87
|
+
:put,
|
88
|
+
url_with_auth(prj.href),
|
89
|
+
:status => ["400", "Bad Request"],
|
90
|
+
:body => GENERIC_ERROR_XML
|
91
|
+
) if MOCK_WEB_CONNECTIONS
|
92
|
+
|
93
|
+
prj.name = 'Some new name'
|
94
|
+
assert !prj.update, "Project saved when it shouldn't have"
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_delete_success
|
98
|
+
prj = Cashboard::Project.list[0]
|
99
|
+
|
100
|
+
FakeWeb.register_uri(
|
101
|
+
:delete,
|
102
|
+
url_with_auth(prj.href),
|
103
|
+
:status => ["200", "Ok"]
|
104
|
+
) if MOCK_WEB_CONNECTIONS
|
105
|
+
|
106
|
+
assert prj.delete, "Project wasn't deleted."
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_delete_fail
|
110
|
+
prj = Cashboard::Project.list[0]
|
111
|
+
|
112
|
+
FakeWeb.register_uri(
|
113
|
+
:delete,
|
114
|
+
url_with_auth(prj.href),
|
115
|
+
:status => ["404", "Not found"]
|
116
|
+
) if MOCK_WEB_CONNECTIONS
|
117
|
+
|
118
|
+
assert !prj.delete, "Project was deleted when it shouldn't have been."
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_toggle_status_success
|
122
|
+
prj = Cashboard::Project.list[0]
|
123
|
+
assert_equal false, prj.is_active
|
124
|
+
|
125
|
+
FakeWeb.register_uri(
|
126
|
+
:put,
|
127
|
+
url_with_auth(prj.links[:toggle_status]),
|
128
|
+
:status => ["200", "Ok"]
|
129
|
+
) if MOCK_WEB_CONNECTIONS
|
130
|
+
|
131
|
+
initial_status = prj.is_active
|
132
|
+
|
133
|
+
assert prj.toggle_status
|
134
|
+
assert true, prj.is_active
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_toggle_status_failure
|
138
|
+
prj = Cashboard::Project.list[0]
|
139
|
+
|
140
|
+
FakeWeb.register_uri(
|
141
|
+
:put,
|
142
|
+
url_with_auth(prj.links[:toggle_status]),
|
143
|
+
:status => ["401", "Unauthorized"]
|
144
|
+
) if MOCK_WEB_CONNECTIONS
|
145
|
+
|
146
|
+
initial_status = prj.is_active
|
147
|
+
|
148
|
+
assert !prj.toggle_status
|
149
|
+
assert prj.is_active == initial_status
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_employee_project_assignments
|
153
|
+
mock_sub_resource(
|
154
|
+
Cashboard::Project.resource_name,
|
155
|
+
'assigned_employees',
|
156
|
+
'project_assignments'
|
157
|
+
) if MOCK_WEB_CONNECTIONS
|
158
|
+
|
159
|
+
prj = Cashboard::Project.list[0]
|
160
|
+
assignments = prj.employee_project_assignments
|
161
|
+
assert assignments.size > 0
|
162
|
+
assignments.each do |assn|
|
163
|
+
assert_kind_of Cashboard::ProjectAssignment, assn
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_line_items
|
168
|
+
mock_sub_resource(
|
169
|
+
Cashboard::Project.resource_name,
|
170
|
+
'line_items',
|
171
|
+
'line_items'
|
172
|
+
) if MOCK_WEB_CONNECTIONS
|
173
|
+
|
174
|
+
prj = Cashboard::Project.list[0]
|
175
|
+
line_items = prj.line_items
|
176
|
+
assert line_items.size > 0
|
177
|
+
line_items.each do |li|
|
178
|
+
assert_kind_of Cashboard::LineItem, li
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_tasks
|
183
|
+
assert_list_type :tasks, :task
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_products
|
187
|
+
assert_list_type :products, :product
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_custom_items
|
191
|
+
assert_list_type :custom_items, :custom
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_href
|
195
|
+
assert Cashboard::Project.list[0].href.include?(Cashboard::Base.api_url)
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|