suretax 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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