suretax 0.1.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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +27 -0
  3. data/.travis.yml +14 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +74 -0
  6. data/Gemfile.travis +12 -0
  7. data/LICENSE.txt +22 -0
  8. data/NOTES.md +3 -0
  9. data/README.md +58 -0
  10. data/Rakefile +1 -0
  11. data/circle.yml +7 -0
  12. data/lib/suretax.rb +24 -0
  13. data/lib/suretax/api.rb +7 -0
  14. data/lib/suretax/api/cancel_request.rb +64 -0
  15. data/lib/suretax/api/group.rb +16 -0
  16. data/lib/suretax/api/item_message.rb +13 -0
  17. data/lib/suretax/api/request.rb +133 -0
  18. data/lib/suretax/api/request_item.rb +84 -0
  19. data/lib/suretax/api/response.rb +53 -0
  20. data/lib/suretax/api/tax.rb +25 -0
  21. data/lib/suretax/api/tax_amount.rb +46 -0
  22. data/lib/suretax/concerns.rb +7 -0
  23. data/lib/suretax/concerns/validatable.rb +208 -0
  24. data/lib/suretax/configuration.rb +84 -0
  25. data/lib/suretax/connection.rb +48 -0
  26. data/lib/suretax/constants.rb +7 -0
  27. data/lib/suretax/constants/regulatory_codes.rb +11 -0
  28. data/lib/suretax/constants/response_groups.rb +8 -0
  29. data/lib/suretax/constants/sales_type_codes.rb +8 -0
  30. data/lib/suretax/constants/tax_situs_codes.rb +12 -0
  31. data/lib/suretax/constants/transaction_type_codes.rb +505 -0
  32. data/lib/suretax/response.rb +70 -0
  33. data/lib/suretax/version.rb +3 -0
  34. data/spec/lib/suretax/api/group_spec.rb +50 -0
  35. data/spec/lib/suretax/api/request_item_spec.rb +54 -0
  36. data/spec/lib/suretax/api/request_item_validations_spec.rb +237 -0
  37. data/spec/lib/suretax/api/request_spec.rb +197 -0
  38. data/spec/lib/suretax/api/request_validations_spec.rb +384 -0
  39. data/spec/lib/suretax/api/response_spec.rb +165 -0
  40. data/spec/lib/suretax/api/tax_amount_spec.rb +37 -0
  41. data/spec/lib/suretax/api/tax_spec.rb +59 -0
  42. data/spec/lib/suretax/configuration_spec.rb +97 -0
  43. data/spec/lib/suretax/connection_spec.rb +77 -0
  44. data/spec/lib/suretax/response_spec.rb +136 -0
  45. data/spec/spec_helper.rb +45 -0
  46. data/spec/support/cancellation_helper.rb +31 -0
  47. data/spec/support/connection_shared_examples.rb +37 -0
  48. data/spec/support/request_helper.rb +309 -0
  49. data/spec/support/suretax_helper.rb +27 -0
  50. data/spec/support/validations_shared_examples.rb +28 -0
  51. data/suretax.gemspec +33 -0
  52. metadata +281 -0
@@ -0,0 +1,384 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Suretax API Request Validations" do
4
+
5
+ let(:request) do
6
+ Suretax::Api::Request.new(suretax_valid_request_params)
7
+ end
8
+
9
+ describe "#items" do
10
+ context "when valid" do
11
+ it "shows errors" do
12
+ expect(request.errors.any?).to eq false
13
+ end
14
+ end
15
+
16
+ context "when invalid" do
17
+ it "shows no errors" do
18
+ item = Suretax::Api::RequestItem.new(suretax_valid_request_item_params)
19
+ item.customer_number = 'a' * 9
20
+ item.regulatory_code = 11111
21
+ request.items = [item]
22
+
23
+ expect(request.errors.any?).to eq true
24
+ expect(request.errors.messages).to \
25
+ eq([%Q{Invalid items: ["Invalid customer_number: aaaaaaaaa, Invalid regulatory_code: 11111"]}])
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '#client_number' do
31
+ context 'when present' do
32
+ it 'can be ten characters or less' do
33
+ request.client_number = '1234567890'
34
+ expect(request.errors.any?).to eq false
35
+
36
+ request.client_number = '12345678901'
37
+ expect(request.errors.any?).to eq true
38
+ expect(request.errors.messages).to eq [%Q{Invalid client_number: 12345678901}]
39
+ end
40
+
41
+ it 'must be a number' do
42
+ request.client_number = '1'
43
+ expect(request.errors.any?).to eq false
44
+
45
+ request.client_number = 'abcdefghij'
46
+ expect(request.errors.any?).to eq true
47
+ expect(request.errors.messages).to eq [%Q{Invalid client_number: abcdefghij}]
48
+ end
49
+ end
50
+
51
+ context 'when absent' do
52
+ it 'should fail validation' do
53
+ request.client_number = nil
54
+ expect(request.errors.any?).to eq true
55
+ expect(request.errors.messages).to eq [%Q{Invalid client_number: nil}]
56
+ end
57
+ end
58
+ end
59
+
60
+ describe '#business_unit' do
61
+ context 'when present' do
62
+ it 'can be blank' do
63
+ request.business_unit = nil
64
+ expect(request.errors.any?).to eq false
65
+
66
+ request.business_unit = ''
67
+ expect(request.errors.any?).to eq false
68
+ end
69
+
70
+ it 'can be 20 characters or less' do
71
+ request.business_unit = 'a' * 5
72
+ expect(request.errors.any?).to eq false
73
+
74
+ request.business_unit = 'a' * 20
75
+ expect(request.errors.any?).to eq false
76
+
77
+ request.business_unit = 'a' * 21
78
+ expect(request.errors.any?).to eq true
79
+ expect(request.errors.messages).to eq [%Q{Invalid business_unit: #{'a' * 21}}]
80
+ end
81
+
82
+ it 'must be alphanumeric' do
83
+ request.business_unit = 'aa124'
84
+ expect(request.errors.any?).to eq false
85
+
86
+ request.business_unit = 'a_34'
87
+ expect(request.errors.any?).to eq true
88
+ expect(request.errors.messages).to eq [%Q{Invalid business_unit: a_34}]
89
+ end
90
+ end
91
+
92
+ context 'when absent' do
93
+ it 'should pass validation' do
94
+ request.business_unit = nil
95
+ expect(request.errors.any?).to eq false
96
+ end
97
+ end
98
+ end
99
+
100
+ describe '#validation_key' do
101
+ context 'when present' do
102
+ it 'must be a maximum of 36 characters' do
103
+ request.validation_key = 'a' * 36
104
+ expect(request.errors.any?).to eq false
105
+
106
+ request.validation_key = 'a' * 37
107
+ expect(request.errors.any?).to eq true
108
+ expect(request.errors.messages).to eq [%Q{Invalid validation_key: #{'a' * 37}}]
109
+ end
110
+ end
111
+
112
+ context 'when absent' do
113
+ it 'should fail validation' do
114
+ request.validation_key = nil
115
+ expect(request.errors.any?).to eq true
116
+ expect(request.errors.messages).to eq [%Q{Invalid validation_key: nil}]
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#data_year' do
122
+ context 'when present' do
123
+ it 'must be a number' do
124
+ request.data_year = 'b' * 4
125
+ expect(request.errors.any?).to eq true
126
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: #{'b' * 4}}]
127
+
128
+ request.data_year = '-' * 4
129
+ expect(request.errors.any?).to eq true
130
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: #{'-' * 4}}]
131
+
132
+ request.data_year = '2014'
133
+ expect(request.errors.any?).to eq false
134
+ end
135
+
136
+ it 'must be exactly four digits' do
137
+ request.data_year = '2014'
138
+ expect(request.errors.any?).to eq false
139
+
140
+ request.data_year = '20120'
141
+ expect(request.errors.any?).to eq true
142
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: 20120}]
143
+
144
+ request.data_year = '201'
145
+ expect(request.errors.any?).to eq true
146
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: 201}]
147
+ end
148
+
149
+ it 'must be in the range 1990-2050' do
150
+ request.data_year = '1989'
151
+ expect(request.errors.any?).to eq true
152
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: 1989}]
153
+
154
+ request.data_year = '2051'
155
+ expect(request.errors.any?).to eq true
156
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: 2051}]
157
+ end
158
+ end
159
+
160
+ context 'when absent' do
161
+ it 'fails validation' do
162
+ request.data_year = nil
163
+ expect(request.errors.any?).to eq true
164
+ expect(request.errors.messages).to eq [%Q{Invalid data_year: nil}]
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#data_month' do
170
+ context 'when present' do
171
+ it "must allow all valid month numbers" do
172
+ (1..12).each do |month_number|
173
+ request.data_month = month_number.to_s
174
+ expect(request.errors.any?).to eq false
175
+
176
+ request.data_month = "%02d" % month_number.to_s
177
+ expect(request.errors.any?).to eq false
178
+ end
179
+ end
180
+
181
+ it "must allow all valid month numbers with a preceding zero" do
182
+ (1..12).each do |month_number|
183
+ request.data_month = "%02d" % month_number.to_s
184
+ expect(request.errors.any?).to eq false
185
+ end
186
+ end
187
+
188
+ it 'must not allow invalid months' do
189
+ request.data_month = '13'
190
+ expect(request.errors.any?).to eq true
191
+ expect(request.errors.messages).to eq [%Q{Invalid data_month: 13}]
192
+ end
193
+ end
194
+
195
+ context 'when absent' do
196
+ it 'should fail validation' do
197
+ request.data_month = nil
198
+ expect(request.errors.any?).to eq true
199
+ expect(request.errors.messages).to eq [%Q{Invalid data_month: nil}]
200
+ end
201
+ end
202
+ end
203
+
204
+ describe '#total_revenue' do
205
+ context 'when present' do
206
+ it 'can only be digits and the minus symbol' do
207
+ request.total_revenue = 'abcdefghi.jklm'
208
+ expect(request.errors.any?).to eq true
209
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: abcdefghi.jklm}]
210
+
211
+ request.total_revenue = '+1234'
212
+ expect(request.errors.any?).to eq true
213
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: +1234}]
214
+ end
215
+
216
+ it 'can have up to four decimal places' do
217
+ request.total_revenue = '123456789.1234'
218
+ expect(request.errors.any?).to eq false
219
+
220
+ request.total_revenue = '123456789.1'
221
+ expect(request.errors.any?).to eq false
222
+ end
223
+
224
+ it 'must not have more than four decimal places' do
225
+ request.total_revenue = '123456789.12345'
226
+ expect(request.errors.any?).to eq true
227
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: 123456789.12345}]
228
+ end
229
+
230
+ context 'and when the value is positive' do
231
+ it 'should have no symbol' do
232
+ request.total_revenue = '+23456789.1234'
233
+ expect(request.errors.any?).to eq true
234
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: +23456789.1234}]
235
+ end
236
+
237
+ it 'can have up to nine positions to the left of the decimal' do
238
+ request.total_revenue = '123456789.1234'
239
+ expect(request.errors.any?).to eq false
240
+
241
+ request.total_revenue = '1.1234'
242
+ expect(request.errors.any?).to eq false
243
+
244
+ request.total_revenue = '1234567890.1234'
245
+ expect(request.errors.any?).to eq true
246
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: 1234567890.1234}]
247
+ end
248
+
249
+ it 'can be a simple integer' do
250
+ request.total_revenue = '1'
251
+ expect(request.errors.any?).to eq false
252
+ end
253
+
254
+ end
255
+
256
+ context 'and when the value is negative' do
257
+ it 'should have a "minus" symbol in the first position' do
258
+ request.total_revenue = '-23456789.1234'
259
+ expect(request.errors.any?).to eq false
260
+ end
261
+
262
+ it 'must have nine positions to the left of the decimal' do
263
+ request.total_revenue = '-23456789.1234'
264
+ expect(request.errors.any?).to eq false
265
+ end
266
+
267
+ it 'must not have more than nine positions to the left of the decimal' do
268
+ request.total_revenue = '-234567890.1234'
269
+ expect(request.errors.any?).to eq true
270
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: -234567890.1234}]
271
+ end
272
+ end
273
+ end
274
+
275
+ context 'when absent' do
276
+ it 'should fail validation' do
277
+ request.total_revenue = nil
278
+ expect(request.errors.any?).to eq true
279
+ expect(request.errors.messages).to eq [%Q{Invalid total_revenue: nil}]
280
+ end
281
+ end
282
+ end
283
+
284
+ describe '#client_tracking' do
285
+ context 'when present' do
286
+ it 'must not be longer than 100 characters' do
287
+ request.client_tracking = 'a' * 101
288
+ expect(request.errors.any?).to eq true
289
+ expect(request.errors.messages).to eq [%Q{Invalid client_tracking: #{'a' * 101}}]
290
+ end
291
+ end
292
+
293
+ context 'when absent' do
294
+ it 'should pass validation' do
295
+ request.client_tracking = nil
296
+ expect(request.errors.any?).to eq false
297
+ end
298
+ end
299
+ end
300
+
301
+ describe '#return_file_code' do
302
+ context 'when present' do
303
+ it 'must be a valid code' do
304
+ request.return_file_code = 0
305
+ expect(request.errors.any?).to eq false
306
+
307
+ request.return_file_code = 'Q'
308
+ expect(request.errors.any?).to eq false
309
+ end
310
+
311
+ it 'cannot be any other value' do
312
+ request.return_file_code = 'a'
313
+ expect(request.errors.any?).to eq true
314
+ expect(request.errors.messages).to eq [%Q{Invalid return_file_code: a}]
315
+
316
+ request.return_file_code = 1
317
+ expect(request.errors.any?).to eq true
318
+ expect(request.errors.messages).to eq [%Q{Invalid return_file_code: 1}]
319
+
320
+ request.return_file_code = '_'
321
+ expect(request.errors.any?).to eq true
322
+ expect(request.errors.messages).to eq [%Q{Invalid return_file_code: _}]
323
+ end
324
+ end
325
+
326
+ context 'when absent' do
327
+ it 'should fail validation' do
328
+ request.return_file_code = nil
329
+ expect(request.errors.any?).to eq true
330
+ expect(request.errors.messages).to eq [%Q{Invalid return_file_code: nil}]
331
+ end
332
+ end
333
+ end
334
+
335
+ describe '#response_group' do
336
+ context 'when present' do
337
+ it "must be a valid code" do
338
+ %w{00 01 02 03}.each do |code|
339
+ request.response_group = code
340
+ expect(request.errors.any?).to eq false
341
+ end
342
+
343
+ %w{a 04 _}.each do |wrong_value|
344
+ request.response_group = wrong_value
345
+ expect(request.errors.any?).to eq true
346
+ expect(request.errors.messages).to eq [%Q{Invalid response_group: #{wrong_value}}]
347
+ end
348
+ end
349
+ end
350
+
351
+ context 'when absent' do
352
+ it 'should fail validation' do
353
+ request.response_group = nil
354
+ expect(request.errors.any?).to eq true
355
+ expect(request.errors.messages).to eq [%Q{Invalid response_group: nil}]
356
+ end
357
+ end
358
+ end
359
+
360
+ describe '#response_type' do
361
+ context 'when present' do
362
+ it "must be a valid code combination'" do
363
+ %w{D1 D9 S1 S9}.each do |type|
364
+ request.response_type = type
365
+ expect(request.errors.any?).to eq false
366
+ end
367
+
368
+ %w{a D0 S10 _}.each do |bad_type|
369
+ request.response_type = bad_type
370
+ expect(request.errors.any?).to eq true
371
+ expect(request.errors.messages).to eq [%Q{Invalid response_type: #{bad_type}}]
372
+ end
373
+ end
374
+ end
375
+
376
+ context 'when absent' do
377
+ it 'should fail validation' do
378
+ request.response_type = nil
379
+ expect(request.errors.any?).to eq true
380
+ expect(request.errors.messages).to eq [%Q{Invalid response_type: nil}]
381
+ end
382
+ end
383
+ end
384
+ end
@@ -0,0 +1,165 @@
1
+ require 'spec_helper'
2
+
3
+ describe Suretax::Api::Response do
4
+
5
+ let(:api_response) { Suretax::Api::Response.new(response_body) }
6
+
7
+
8
+ context 'for a normal post request' do
9
+ context 'with a successful response' do
10
+ let(:response_body) { valid_test_response_body }
11
+
12
+ it 'should return the API status code' do
13
+ expect(api_response.status).to eql('9999')
14
+ end
15
+
16
+ it 'should be successful' do
17
+ expect(api_response).to be_success
18
+ end
19
+
20
+ it 'should not have item errors' do
21
+ expect(api_response).not_to be_item_errors
22
+ end
23
+
24
+ it 'should have a message of "Success"' do
25
+ expect(api_response.message).to eql('Success')
26
+ end
27
+
28
+ it 'should have the correct total tax' do
29
+ expect(api_response.total_tax.to_f).to eql(1.394490)
30
+ end
31
+
32
+ it 'should have a transaction id' do
33
+ expect(api_response.transaction).to eql('2664495')
34
+ end
35
+
36
+ context 'invoice groups' do
37
+ it 'should be the correct number' do
38
+ expect(api_response.groups.count).to eql(1)
39
+ end
40
+
41
+ it 'should respond to #invoice' do
42
+ expect(api_response.groups.first).to respond_to(:invoice)
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'with a partially successful response' do
48
+ let(:response_body) { success_with_item_errors }
49
+
50
+ describe '#status' do
51
+ it 'should return the API status code' do
52
+ expect(api_response.status).to eql('9001')
53
+ end
54
+ end
55
+
56
+ describe '#success?' do
57
+ it 'should be true' do
58
+ expect(api_response).to be_success
59
+ end
60
+ end
61
+
62
+ describe "#item_errors?" do
63
+ it 'should be true' do
64
+ expect(api_response).to be_item_errors
65
+ end
66
+ end
67
+
68
+ describe "#item_messages" do
69
+ it 'should be the correct number' do
70
+ expect(api_response.item_messages.size).to eql(1)
71
+ end
72
+
73
+ it 'should response to #message' do
74
+ expect(api_response.item_messages.first).to respond_to(:message)
75
+ end
76
+ end
77
+
78
+ describe '#message' do
79
+ it 'should start with "Failure"' do
80
+ expect(api_response.message).to match(/\ASuccess with item errors/i)
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'with a failure response' do
86
+ let(:response_body) { post_failed_response_body }
87
+
88
+ describe '#status' do
89
+ it 'should return the API status code' do
90
+ expect(api_response.status).to eql('1101')
91
+ end
92
+ end
93
+
94
+ describe '#success?' do
95
+ it 'should be false' do
96
+ expect(api_response.success?).to eql false
97
+ end
98
+ end
99
+
100
+ describe "#item_errors?" do
101
+ it 'should be false' do
102
+ expect(api_response).not_to be_item_errors
103
+ end
104
+ end
105
+
106
+ describe '#message' do
107
+ it 'should start with "Failure"' do
108
+ expect(api_response.message).to match(/\AFailure/)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ context 'for a cancel post request' do
115
+ context 'with a successful response' do
116
+ let(:response_body) { cancel_response_body }
117
+
118
+ it 'should return the API status code' do
119
+ expect(api_response.status).to eql('9999')
120
+ end
121
+
122
+ it 'should be successful' do
123
+ expect(api_response).to be_success
124
+ end
125
+
126
+ it 'should have a message of "Success"' do
127
+ expect(api_response.message).to eql('Success')
128
+ end
129
+
130
+ it 'should have a transaction id' do
131
+ expect(api_response.transaction).to eql('0')
132
+ end
133
+
134
+ it 'should have the client tracking code set' do
135
+ expect(api_response.client_tracking).to eql('test')
136
+ end
137
+ end
138
+
139
+ context 'with a failed request' do
140
+
141
+ let(:response_body) { cancel_failed_response_body }
142
+
143
+ it 'should return the API status code' do
144
+ expect(api_response.status).to be_nil
145
+ end
146
+
147
+ it 'should be successful' do
148
+ expect(api_response).to_not be_success
149
+ end
150
+
151
+ it 'should have a message of "Success"' do
152
+ expect(api_response.message).to be_nil
153
+ end
154
+
155
+ it 'should have a transaction id' do
156
+ expect(api_response.transaction).to eql('0')
157
+ end
158
+
159
+ it 'should have the client tracking code set' do
160
+ expect(api_response.client_tracking).to be_nil
161
+ end
162
+ end
163
+ end
164
+
165
+ end