xeroizer 2.17.1 → 3.0.0

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.
Files changed (136) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +246 -213
  3. data/lib/xeroizer/connection.rb +49 -0
  4. data/lib/xeroizer/exceptions.rb +4 -0
  5. data/lib/xeroizer/generic_application.rb +13 -5
  6. data/lib/xeroizer/http.rb +7 -80
  7. data/lib/xeroizer/http_response.rb +154 -0
  8. data/lib/xeroizer/models/bank_account.rb +1 -0
  9. data/lib/xeroizer/models/bank_transaction.rb +1 -0
  10. data/lib/xeroizer/models/batch_payment.rb +27 -0
  11. data/lib/xeroizer/models/branding_theme.rb +49 -9
  12. data/lib/xeroizer/models/contact.rb +12 -6
  13. data/lib/xeroizer/models/contact_group.rb +45 -0
  14. data/lib/xeroizer/models/credit_note.rb +24 -22
  15. data/lib/xeroizer/models/currency.rb +14 -2
  16. data/lib/xeroizer/models/from_bank_account.rb +1 -0
  17. data/lib/xeroizer/models/history_record.rb +72 -0
  18. data/lib/xeroizer/models/invoice.rb +17 -3
  19. data/lib/xeroizer/models/item.rb +2 -1
  20. data/lib/xeroizer/models/item_purchase_details.rb +1 -1
  21. data/lib/xeroizer/models/line_item.rb +17 -5
  22. data/lib/xeroizer/models/manual_journal.rb +2 -1
  23. data/lib/xeroizer/models/online_invoice.rb +37 -0
  24. data/lib/xeroizer/models/option.rb +1 -1
  25. data/lib/xeroizer/models/organisation.rb +2 -0
  26. data/lib/xeroizer/models/payment_service.rb +22 -0
  27. data/lib/xeroizer/models/payroll/address.rb +53 -0
  28. data/lib/xeroizer/models/payroll/bank_account.rb +18 -6
  29. data/lib/xeroizer/models/payroll/benefit_line.rb +26 -0
  30. data/lib/xeroizer/models/payroll/benefit_type.rb +45 -0
  31. data/lib/xeroizer/models/payroll/deduction_line.rb +32 -0
  32. data/lib/xeroizer/models/payroll/deduction_type.rb +49 -0
  33. data/lib/xeroizer/models/payroll/earnings_line.rb +39 -0
  34. data/lib/xeroizer/models/payroll/earnings_type.rb +53 -0
  35. data/lib/xeroizer/models/payroll/employee.rb +30 -8
  36. data/lib/xeroizer/models/payroll/leave_application.rb +27 -0
  37. data/lib/xeroizer/models/payroll/leave_line.rb +30 -0
  38. data/lib/xeroizer/models/payroll/leave_period.rb +15 -0
  39. data/lib/xeroizer/models/payroll/pay_items.rb +22 -0
  40. data/lib/xeroizer/models/payroll/pay_run.rb +33 -0
  41. data/lib/xeroizer/models/payroll/pay_schedule.rb +40 -0
  42. data/lib/xeroizer/models/payroll/pay_template.rb +24 -0
  43. data/lib/xeroizer/models/payroll/payment_method.rb +24 -0
  44. data/lib/xeroizer/models/payroll/paystub.rb +44 -0
  45. data/lib/xeroizer/models/payroll/reimbursement_line.rb +21 -0
  46. data/lib/xeroizer/models/payroll/reimbursement_type.rb +22 -0
  47. data/lib/xeroizer/models/payroll/salary_and_wage.rb +29 -0
  48. data/lib/xeroizer/models/payroll/super_line.rb +40 -0
  49. data/lib/xeroizer/models/payroll/tax_declaration.rb +50 -0
  50. data/lib/xeroizer/models/payroll/time_off_line.rb +20 -0
  51. data/lib/xeroizer/models/payroll/time_off_type.rb +32 -0
  52. data/lib/xeroizer/models/payroll/work_location.rb +25 -0
  53. data/lib/xeroizer/models/prepayment.rb +1 -0
  54. data/lib/xeroizer/models/purchase_order.rb +6 -6
  55. data/lib/xeroizer/models/quote.rb +76 -0
  56. data/lib/xeroizer/models/schedule.rb +1 -0
  57. data/lib/xeroizer/models/tax_component.rb +1 -0
  58. data/lib/xeroizer/models/to_bank_account.rb +1 -0
  59. data/lib/xeroizer/oauth.rb +12 -1
  60. data/lib/xeroizer/oauth2.rb +82 -0
  61. data/lib/xeroizer/oauth2_application.rb +49 -0
  62. data/lib/xeroizer/payroll_application.rb +8 -3
  63. data/lib/xeroizer/record/base.rb +11 -2
  64. data/lib/xeroizer/record/base_model.rb +1 -1
  65. data/lib/xeroizer/record/base_model_http_proxy.rb +37 -17
  66. data/lib/xeroizer/record/model_definition_helper.rb +1 -1
  67. data/lib/xeroizer/record/payroll_base.rb +4 -0
  68. data/lib/xeroizer/record/record_association_helper.rb +4 -4
  69. data/lib/xeroizer/record/validators/associated_validator.rb +1 -0
  70. data/lib/xeroizer/record/xml_helper.rb +18 -18
  71. data/lib/xeroizer/report/aged_receivables_by_contact.rb +1 -1
  72. data/lib/xeroizer/report/cell_xml_helper.rb +13 -13
  73. data/lib/xeroizer/response.rb +22 -17
  74. data/lib/xeroizer/version.rb +1 -1
  75. data/lib/xeroizer.rb +34 -4
  76. data/test/acceptance/about_creating_bank_transactions_test.rb +89 -81
  77. data/test/acceptance/about_creating_prepayment_test.rb +25 -30
  78. data/test/acceptance/about_fetching_bank_transactions_test.rb +12 -12
  79. data/test/acceptance/about_online_invoice_test.rb +25 -0
  80. data/test/acceptance/acceptance_test.rb +28 -26
  81. data/test/acceptance/bank_transfer_test.rb +12 -17
  82. data/test/acceptance/bulk_operations_test.rb +18 -16
  83. data/test/acceptance/connections_test.rb +11 -0
  84. data/test/stub_responses/bad_request.json +6 -0
  85. data/test/stub_responses/connections.json +16 -0
  86. data/test/stub_responses/expired_oauth2_token.json +6 -0
  87. data/test/stub_responses/generic_response_error.json +6 -0
  88. data/test/stub_responses/invalid_oauth2_request_token.json +6 -0
  89. data/test/stub_responses/invalid_tenant_header.json +6 -0
  90. data/test/stub_responses/object_not_found.json +6 -0
  91. data/test/stub_responses/organisations.xml +10 -0
  92. data/test/stub_responses/payment_service.xml +15 -0
  93. data/test/test_helper.rb +17 -12
  94. data/test/unit/generic_application_test.rb +21 -10
  95. data/test/unit/http_test.rb +282 -10
  96. data/test/unit/models/address_test.rb +2 -2
  97. data/test/unit/models/bank_transaction_model_parsing_test.rb +2 -2
  98. data/test/unit/models/bank_transaction_test.rb +1 -1
  99. data/test/unit/models/bank_transaction_validation_test.rb +1 -1
  100. data/test/unit/models/contact_test.rb +20 -11
  101. data/test/unit/models/credit_note_test.rb +8 -8
  102. data/test/unit/models/employee_test.rb +4 -4
  103. data/test/unit/models/invoice_test.rb +12 -12
  104. data/test/unit/models/journal_line_test.rb +6 -6
  105. data/test/unit/models/journal_test.rb +4 -4
  106. data/test/unit/models/line_item_sum_test.rb +1 -1
  107. data/test/unit/models/line_item_test.rb +29 -37
  108. data/test/unit/models/manual_journal_test.rb +3 -3
  109. data/test/unit/models/organisation_test.rb +16 -2
  110. data/test/unit/models/payment_service_test.rb +29 -0
  111. data/test/unit/models/phone_test.rb +7 -7
  112. data/test/unit/models/prepayment_test.rb +4 -4
  113. data/test/unit/models/repeating_invoice_test.rb +3 -3
  114. data/test/unit/models/tax_rate_test.rb +2 -2
  115. data/test/unit/oauth2_test.rb +171 -0
  116. data/test/unit/oauth_config_test.rb +1 -1
  117. data/test/unit/record/base_model_test.rb +13 -13
  118. data/test/unit/record/base_test.rb +73 -4
  119. data/test/unit/record/block_validator_test.rb +1 -1
  120. data/test/unit/record/connection_test.rb +60 -0
  121. data/test/unit/record/model_definition_test.rb +36 -36
  122. data/test/unit/record/parse_params_test.rb +59 -0
  123. data/test/unit/record/parse_where_hash_test.rb +13 -13
  124. data/test/unit/record/record_association_test.rb +14 -14
  125. data/test/unit/record/validators_test.rb +43 -43
  126. data/test/unit/record_definition_test.rb +7 -7
  127. data/test/unit/report_definition_test.rb +7 -7
  128. data/test/unit/report_test.rb +20 -20
  129. data/test/unit_test_helper.rb +16 -0
  130. metadata +117 -27
  131. data/lib/xeroizer/models/payroll/home_address.rb +0 -24
  132. data/lib/xeroizer/partner_application.rb +0 -51
  133. data/lib/xeroizer/private_application.rb +0 -25
  134. data/lib/xeroizer/public_application.rb +0 -21
  135. data/test/unit/oauth_test.rb +0 -118
  136. data/test/unit/private_application_test.rb +0 -20
@@ -1,18 +1,290 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
- class HttpTest < Test::Unit::TestCase
3
+ class HttpTest < UnitTestCase
4
4
  include TestHelper
5
5
 
6
- def setup
7
- @headers = {"User-Agent" => "Xeroizer/2.15.5"}
8
- @application = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET, :default_headers => @headers)
6
+ setup do
7
+ @uri = "https://api.xero.com/path"
9
8
  end
10
9
 
11
- context "default_headers" do
12
- should "recognize default_headers" do
13
- Xeroizer::OAuth.any_instance.expects(:get).with("/test", has_entry(@headers)).returns(stub(:plain_body => "", :code => "200"))
14
- @application.http_get(@application.client, "http://example.com/test")
10
+ context "errors" do
11
+ setup do
12
+ @application = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET, tenant_id: TENANT_ID, access_token: ACCESS_TOKEN)
13
+ end
14
+
15
+ context "400" do
16
+ setup do
17
+ status_code = 400
18
+ @body = get_file_as_string("credit_note_not_found_error.xml")
19
+ stub_request(:get, @uri).to_return(status: status_code, body: @body)
20
+ end
21
+
22
+ should "raise an ApiException" do
23
+ error = assert_raises(Xeroizer::ApiException) { @application.http_get(@application.client, @uri) }
24
+ assert_equal ": \n Generated by the following XML: \n #{@body}", error.message
25
+ end
26
+ end
27
+
28
+ context "401" do
29
+ setup do
30
+ @status_code = 401
31
+ end
32
+
33
+ context "token_expired" do
34
+ setup do
35
+ body = get_file_as_string("token_expired")
36
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
37
+ end
38
+
39
+ should "raise an OAuth::TokenExpired" do
40
+ error = assert_raises(Xeroizer::OAuth::TokenExpired) { @application.http_get(@application.client, @uri) }
41
+ assert_equal "Unexpected token", error.message
42
+ end
43
+ end
44
+
45
+ context "token_rejected" do
46
+ setup do
47
+ body = "oauth_problem_advice=some advice&oauth_problem=token_rejected"
48
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
49
+ end
50
+
51
+ should "raise an OAuth::TokenInvalid" do
52
+ error = assert_raises(Xeroizer::OAuth::TokenInvalid) { @application.http_get(@application.client, @uri) }
53
+ assert_equal "some advice", error.message
54
+ end
55
+ end
56
+
57
+ context "rate limit exceeded" do
58
+ setup do
59
+ body = get_file_as_string("rate_limit_exceeded")
60
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
61
+ end
62
+
63
+ should "raise an OAuth::RateLimitExceeded" do
64
+ error = assert_raises(Xeroizer::OAuth::RateLimitExceeded) { @application.http_get(@application.client, @uri) }
65
+ assert_equal "please wait before retrying the xero api\n", error.message
66
+ end
67
+ end
68
+
69
+ context "consumer_key_unknown" do
70
+ setup do
71
+ body = "oauth_problem_advice=some more advice&oauth_problem=consumer_key_unknown"
72
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
73
+ end
74
+
75
+ should "raise an OAuth::ConsumerKeyUnknown" do
76
+ error = assert_raises(Xeroizer::OAuth::ConsumerKeyUnknown) { @application.http_get(@application.client, @uri) }
77
+ assert_equal "some more advice", error.message
78
+ end
79
+ end
80
+
81
+ context "nonce_used" do
82
+ setup do
83
+ body = get_file_as_string("nonce_used")
84
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
85
+ end
86
+
87
+ should "raise an OAuth::NonceUsed" do
88
+ error = assert_raises(Xeroizer::OAuth::NonceUsed) { @application.http_get(@application.client, @uri) }
89
+ assert_equal "The nonce value \"potatocakes\" has already been used ", error.message
90
+ end
91
+ end
92
+
93
+ context "organisation offline" do
94
+ setup do
95
+ body = "oauth_problem_advice=organisational advice&oauth_problem=organisation offline"
96
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
97
+ end
98
+
99
+ should "raise an OAuth::OrganisationOffline" do
100
+ error = assert_raises(Xeroizer::OAuth::OrganisationOffline) { @application.http_get(@application.client, @uri) }
101
+ assert_equal "organisational advice", error.message
102
+ end
103
+ end
104
+
105
+ context "unknown error" do
106
+ setup do
107
+ body = "oauth_problem_advice=unknown advice&oauth_problem=unknown error"
108
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
109
+ end
110
+
111
+ should "raise an OAuth::UnknownError" do
112
+ error = assert_raises(Xeroizer::OAuth::UnknownError) { @application.http_get(@application.client, @uri) }
113
+ assert_equal "unknown error:unknown advice", error.message
114
+ end
115
+ end
116
+ end
117
+
118
+ context "404" do
119
+ setup do
120
+ @status_code = 404
121
+ end
122
+
123
+ context "invoices" do
124
+ setup do
125
+ @uri = "https://api.xero.com/Invoices"
126
+ body = get_file_as_string("invoice_not_found_error.xml")
127
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
128
+ end
129
+
130
+ should "raise an InvoiceNotFoundError" do
131
+ error = assert_raises(Xeroizer::InvoiceNotFoundError) { @application.http_get(@application.client, @uri) }
132
+ assert_equal "Invoice not found in Xero.", error.message
133
+ end
134
+ end
135
+
136
+ context "credit notes" do
137
+ setup do
138
+ @uri = "https://api.xero.com/CreditNotes"
139
+ body = get_file_as_string("credit_note_not_found_error.xml")
140
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
141
+ end
142
+
143
+ should "raise an CreditNoteNotFoundError" do
144
+ error = assert_raises(Xeroizer::CreditNoteNotFoundError) { @application.http_get(@application.client, @uri) }
145
+ assert_equal "Credit Note not found in Xero.", error.message
146
+ end
147
+ end
148
+
149
+ context "anything else" do
150
+ setup do
151
+ stub_request(:get, @uri).to_return(status: @status_code, body: "body")
152
+ end
153
+
154
+ should "raise an ObjectNotFound" do
155
+ error = assert_raises(Xeroizer::ObjectNotFound) { @application.http_get(@application.client, @uri) }
156
+ assert_equal "Couldn't find object for API Endpoint #{@uri}", error.message
157
+ end
158
+ end
159
+ end
160
+
161
+ context "429" do
162
+ setup do
163
+ @status_code = 429
164
+ end
165
+
166
+ context "rate_limit_exceeded" do
167
+ setup do
168
+ stub_request(:get, @uri).to_return(
169
+ status: @status_code,
170
+ body: "",
171
+ headers: {
172
+ "x-daylimit-remaining" => "328",
173
+ "retry-after" => "42",
174
+ }
175
+ )
176
+ end
177
+
178
+ should "raise an OAuth::RateLimitExceeded" do
179
+ error = assert_raises(Xeroizer::OAuth::RateLimitExceeded){ @application.http_get(@application.client, @uri) }
180
+ assert_match /rate limit exceeded/i, error.message
181
+ assert_match /328 requests left for the day/i, error.message
182
+ assert_match /42 seconds until you can make another request/i, error.message
183
+ end
184
+ end
185
+ end
186
+
187
+ context "503" do
188
+ setup do
189
+ @status_code = 503
190
+ end
191
+
192
+ context "token_expired" do
193
+ setup do
194
+ body = get_file_as_string("token_expired")
195
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
196
+ end
197
+
198
+ should "raise an OAuth::TokenExpired" do
199
+ error = assert_raises(Xeroizer::OAuth::TokenExpired) { @application.http_get(@application.client, @uri) }
200
+ assert_equal "Unexpected token", error.message
201
+ end
202
+ end
203
+
204
+ context "token_rejected" do
205
+ setup do
206
+ body = "oauth_problem_advice=some advice&oauth_problem=token_rejected"
207
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
208
+ end
209
+
210
+ should "raise an OAuth::TokenInvalid" do
211
+ error = assert_raises(Xeroizer::OAuth::TokenInvalid) { @application.http_get(@application.client, @uri) }
212
+ assert_equal "some advice", error.message
213
+ end
214
+ end
215
+
216
+ context "rate limit exceeded" do
217
+ setup do
218
+ body = get_file_as_string("rate_limit_exceeded")
219
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
220
+ end
221
+
222
+ should "raise an OAuth::RateLimitExceeded" do
223
+ error = assert_raises(Xeroizer::OAuth::RateLimitExceeded) { @application.http_get(@application.client, @uri) }
224
+ assert_equal "please wait before retrying the xero api\n", error.message
225
+ end
226
+ end
227
+
228
+ context "consumer_key_unknown" do
229
+ setup do
230
+ body = "oauth_problem_advice=some more advice&oauth_problem=consumer_key_unknown"
231
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
232
+ end
233
+
234
+ should "raise an OAuth::ConsumerKeyUnknown" do
235
+ error = assert_raises(Xeroizer::OAuth::ConsumerKeyUnknown) { @application.http_get(@application.client, @uri) }
236
+ assert_equal "some more advice", error.message
237
+ end
238
+ end
239
+
240
+ context "nonce_used" do
241
+ setup do
242
+ body = get_file_as_string("nonce_used")
243
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
244
+ end
245
+
246
+ should "raise an OAuth::NonceUsed" do
247
+ error = assert_raises(Xeroizer::OAuth::NonceUsed) { @application.http_get(@application.client, @uri) }
248
+ assert_equal "The nonce value \"potatocakes\" has already been used ", error.message
249
+ end
250
+ end
251
+
252
+ context "organisation offline" do
253
+ setup do
254
+ body = "oauth_problem_advice=organisational advice&oauth_problem=organisation offline"
255
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
256
+ end
257
+
258
+ should "raise an OAuth::OrganisationOffline" do
259
+ error = assert_raises(Xeroizer::OAuth::OrganisationOffline) { @application.http_get(@application.client, @uri) }
260
+ assert_equal "organisational advice", error.message
261
+ end
262
+ end
263
+
264
+ context "unknown error" do
265
+ setup do
266
+ body = "oauth_problem_advice=unknown advice&oauth_problem=unknown error"
267
+ stub_request(:get, @uri).to_return(status: @status_code, body: body)
268
+ end
269
+
270
+ should "raise an OAuth::UnknownError" do
271
+ error = assert_raises(Xeroizer::OAuth::UnknownError) { @application.http_get(@application.client, @uri) }
272
+ assert_equal "unknown error:unknown advice", error.message
273
+ end
274
+ end
275
+ end
276
+
277
+ context "other status" do
278
+ setup do
279
+ body = get_file_as_string("token_expired")
280
+ stub_request(:get, @uri).to_return(status: 418, body: body)
281
+ end
282
+
283
+ should "raise an BadRespone" do
284
+ error = assert_raises(Xeroizer::BadResponse) { @application.http_get(@application.client, @uri) }
285
+ assert_equal "Unknown response code: 418", error.message
286
+ end
287
+
15
288
  end
16
289
  end
17
290
  end
18
-
@@ -1,10 +1,10 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class AddressTest < Test::Unit::TestCase
4
4
  include TestHelper
5
5
 
6
6
  def setup
7
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
7
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
8
8
  @contact = @client.Contact.build
9
9
  end
10
10
 
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require 'unit_test_helper'
2
2
 
3
3
  class BankTransactionModelParsingTest < Test::Unit::TestCase
4
4
  def setup
@@ -33,7 +33,7 @@ class BankTransactionModelParsingTest < Test::Unit::TestCase
33
33
  assert_equal "Inclusive", the_bank_transaction.line_amount_types
34
34
 
35
35
  assert_equal(Time.parse("2008-02-20T12:19:56.657Z"), the_bank_transaction.updated_date_utc)
36
-
36
+
37
37
  assert_equal Date.parse("2010-07-30T00:00:00"), the_bank_transaction.fully_paid_on_date
38
38
  assert_equal "d20b6c54-7f5d-4ce6-ab83-55f609719126", the_bank_transaction.bank_transaction_id
39
39
  assert_equal "SPEND", the_bank_transaction.type
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require 'unit_test_helper'
2
2
 
3
3
  class BankTransactionTest < Test::Unit::TestCase
4
4
  include Xeroizer::Record
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require 'unit_test_helper'
2
2
 
3
3
  class BankTransactionValidationTest < Test::Unit::TestCase
4
4
  include Xeroizer::Record
@@ -1,10 +1,10 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class ContactTest < Test::Unit::TestCase
4
4
  include TestHelper
5
5
 
6
6
  def setup
7
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
7
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
8
8
  end
9
9
 
10
10
  context "contact validators" do
@@ -21,6 +21,24 @@ class ContactTest < Test::Unit::TestCase
21
21
  assert_equal(0, contact.errors.size)
22
22
  end
23
23
 
24
+ should "be able to have no name if it has a contact_id" do
25
+ contact = @client.Contact.build
26
+
27
+ assert_equal(false, contact.valid?)
28
+ contact.contact_id = "1-2-3"
29
+ assert_equal(true, contact.valid?)
30
+ assert_equal(0, contact.errors.size)
31
+ end
32
+
33
+ should "be able to have no name if it has a contact_number" do
34
+ contact = @client.Contact.build
35
+
36
+ assert_equal(false, contact.valid?)
37
+ contact.contact_number = "abc123"
38
+ assert_equal(true, contact.valid?)
39
+ assert_equal(0, contact.errors.size)
40
+ end
41
+
24
42
  should "not allow invalid addresses" do
25
43
  contact = @client.Contact.build(name: "SOMETHING")
26
44
  address = contact.add_address(:type => "INVALID_TYPE")
@@ -66,15 +84,6 @@ class ContactTest < Test::Unit::TestCase
66
84
  assert_equal(contact.attributes.keys, keys)
67
85
  end
68
86
 
69
- should "be able to have no name if has a contact_id" do
70
- contact = @client.Contact.build
71
-
72
- assert_equal(false, contact.valid?)
73
- contact.contact_id = "1-2-3"
74
- assert_equal(true, contact.valid?)
75
- assert_equal(0, contact.errors.size)
76
- end
77
-
78
87
  it "parses extra attributes when present" do
79
88
  @instance = Xeroizer::Record::ContactModel.new(nil, "Contact")
80
89
  some_xml = get_record_xml("contact_with_details")
@@ -1,16 +1,16 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class CreditNoteTest < Test::Unit::TestCase
4
4
  include TestHelper
5
-
5
+
6
6
  def setup
7
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
7
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
8
8
  mock_api("CreditNotes")
9
9
  @credit_note = @client.CreditNote.first
10
10
  end
11
-
11
+
12
12
  context "credit note totals" do
13
-
13
+
14
14
  should "raise error when trying to set totals directly" do
15
15
  assert_raises Xeroizer::SettingTotalDirectlyNotSupported do
16
16
  @credit_note.sub_total = 500.0
@@ -22,7 +22,7 @@ class CreditNoteTest < Test::Unit::TestCase
22
22
  @credit_note.total = 550.0
23
23
  end
24
24
  end
25
-
25
+
26
26
  should "large-scale testing from API XML" do
27
27
  credit_notes = @client.CreditNote.all
28
28
  credit_notes.each do | credit_note |
@@ -31,7 +31,7 @@ class CreditNoteTest < Test::Unit::TestCase
31
31
  assert_equal(credit_note.attributes[:total], credit_note.total)
32
32
  end
33
33
  end
34
-
34
+
35
35
  end
36
-
36
+
37
37
  end
@@ -1,11 +1,11 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
1
+ require 'unit_test_helper'
2
2
 
3
3
  class EmployeeTest < Test::Unit::TestCase
4
4
  include TestHelper
5
5
  include Xeroizer::Record
6
-
6
+
7
7
  def setup
8
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
8
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
9
9
  @employee = @client.Employee.build
10
10
 
11
11
  @employee.employee_id = 'GUID'
@@ -25,7 +25,7 @@ class EmployeeTest < Test::Unit::TestCase
25
25
  @employee.employee_group_name = "TEAM A"
26
26
  @doc = Nokogiri::XML(@employee.to_xml)
27
27
  end
28
-
28
+
29
29
  it "should render" do
30
30
  assert_equal "GUID", @doc.xpath("//EmployeeID").text
31
31
  assert_equal "ACTIVE", @doc.xpath("//Status").text
@@ -1,10 +1,10 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class InvoiceTest < Test::Unit::TestCase
4
4
  include TestHelper
5
-
5
+
6
6
  def setup
7
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
7
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
8
8
  mock_api('Invoices')
9
9
  @invoice = @client.Invoice.first
10
10
  end
@@ -26,7 +26,7 @@ class InvoiceTest < Test::Unit::TestCase
26
26
  end
27
27
 
28
28
  context "invoice types" do
29
-
29
+
30
30
  should "have helpers to determine invoice type" do
31
31
  @invoice.type = 'ACCREC'
32
32
  assert_equal(true, @invoice.accounts_receivable?)
@@ -36,11 +36,11 @@ class InvoiceTest < Test::Unit::TestCase
36
36
  assert_equal(false, @invoice.accounts_receivable?)
37
37
  assert_equal(true, @invoice.accounts_payable?)
38
38
  end
39
-
39
+
40
40
  end
41
-
41
+
42
42
  context "invoice totals" do
43
-
43
+
44
44
  should "large-scale testing from API XML" do
45
45
  invoices = @client.Invoice.all
46
46
  invoices.each do | invoice |
@@ -51,7 +51,7 @@ class InvoiceTest < Test::Unit::TestCase
51
51
  end
52
52
 
53
53
  end
54
-
54
+
55
55
  context "invoice validations" do
56
56
 
57
57
  should "build an invalid invoice if there are no attributes" do
@@ -59,7 +59,7 @@ class InvoiceTest < Test::Unit::TestCase
59
59
  end
60
60
 
61
61
  should "build a valid DRAFT invoice with minimal attributes" do
62
- invoice = @client.Invoice.build :type => "ACCREC", :contact => { :name => "ABC Limited" }
62
+ invoice = @client.Invoice.build :type => "ACCREC", :date => Date.today, :contact => { :name => "ABC Limited" }
63
63
  assert_equal(true, invoice.valid?)
64
64
  end
65
65
 
@@ -105,7 +105,7 @@ class InvoiceTest < Test::Unit::TestCase
105
105
  end
106
106
 
107
107
  context "contact shortcuts" do
108
-
108
+
109
109
  should "have valid #contact_name and #contact_id without downloading full invoice" do
110
110
  invoices = @client.Invoice.all
111
111
  invoices.each do |invoice|
@@ -114,13 +114,13 @@ class InvoiceTest < Test::Unit::TestCase
114
114
  assert_equal(false, invoice.complete_record_downloaded?)
115
115
  end
116
116
  end
117
-
117
+
118
118
  end
119
119
 
120
120
  context "updated date" do
121
121
  should "get the updated date as utc" do
122
122
  invoices = @client.Invoice.all
123
-
123
+
124
124
  assert_equal(Time.parse("2008-9-16T10:28:51.5Z"), invoices[0].updated_date_utc)
125
125
 
126
126
  invoices.each do |invoice|
@@ -1,20 +1,20 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
1
+ require 'unit_test_helper'
2
2
 
3
3
  class JournalLineTest < Test::Unit::TestCase
4
4
  include TestHelper
5
5
  include Xeroizer::Record
6
-
6
+
7
7
  def setup
8
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
8
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
9
9
  end
10
-
10
+
11
11
  it "journal_line tracking specified correctly" do
12
12
  journal = @client.Journal.build
13
13
  journal_line = journal.add_journal_line({})
14
-
14
+
15
15
  journal_line.add_tracking_category(:name => "Name 1", :option => "Option 1")
16
16
  journal_line.add_tracking_category(:name => "Name 2", :option => "Option 2")
17
-
17
+
18
18
  doc = Nokogiri::XML(journal_line.to_xml)
19
19
  assert_equal 2, doc.xpath("/JournalLine/TrackingCategories/TrackingCategory").size
20
20
  end
@@ -1,11 +1,11 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
1
+ require 'unit_test_helper'
2
2
 
3
3
  class JournalTest < Test::Unit::TestCase
4
4
  include TestHelper
5
5
  include Xeroizer::Record
6
-
6
+
7
7
  def setup
8
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
8
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
9
9
 
10
10
  @journal = @client.Journal.build
11
11
  @journal.journal_id = "0d926df3-459f-4264-a3a3-49ac065eb0ed"
@@ -39,6 +39,6 @@ class JournalTest < Test::Unit::TestCase
39
39
  it "should render date" do
40
40
  assert_equal "2015-01-01", @doc.xpath("//JournalDate").text
41
41
  end
42
- end
42
+ end
43
43
 
44
44
  end
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require 'unit_test_helper'
2
2
 
3
3
  class LineItemSumTest < Test::Unit::TestCase
4
4
  include Xeroizer::Record