xeroizer 2.20.0 → 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 (117) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +126 -185
  3. data/lib/xeroizer/connection.rb +49 -0
  4. data/lib/xeroizer/exceptions.rb +2 -0
  5. data/lib/xeroizer/generic_application.rb +8 -3
  6. data/lib/xeroizer/http.rb +5 -80
  7. data/lib/xeroizer/http_response.rb +154 -0
  8. data/lib/xeroizer/models/bank_transaction.rb +1 -0
  9. data/lib/xeroizer/models/batch_payment.rb +4 -1
  10. data/lib/xeroizer/models/contact.rb +10 -4
  11. data/lib/xeroizer/models/credit_note.rb +20 -20
  12. data/lib/xeroizer/models/history_record.rb +72 -0
  13. data/lib/xeroizer/models/invoice.rb +5 -1
  14. data/lib/xeroizer/models/line_item.rb +4 -2
  15. data/lib/xeroizer/models/manual_journal.rb +2 -1
  16. data/lib/xeroizer/models/option.rb +1 -1
  17. data/lib/xeroizer/models/payroll/address.rb +53 -0
  18. data/lib/xeroizer/models/payroll/bank_account.rb +18 -6
  19. data/lib/xeroizer/models/payroll/benefit_line.rb +26 -0
  20. data/lib/xeroizer/models/payroll/benefit_type.rb +45 -0
  21. data/lib/xeroizer/models/payroll/deduction_line.rb +32 -0
  22. data/lib/xeroizer/models/payroll/deduction_type.rb +49 -0
  23. data/lib/xeroizer/models/payroll/earnings_line.rb +39 -0
  24. data/lib/xeroizer/models/payroll/earnings_type.rb +53 -0
  25. data/lib/xeroizer/models/payroll/employee.rb +30 -8
  26. data/lib/xeroizer/models/payroll/leave_application.rb +27 -0
  27. data/lib/xeroizer/models/payroll/leave_line.rb +30 -0
  28. data/lib/xeroizer/models/payroll/leave_period.rb +15 -0
  29. data/lib/xeroizer/models/payroll/pay_items.rb +22 -0
  30. data/lib/xeroizer/models/payroll/pay_run.rb +33 -0
  31. data/lib/xeroizer/models/payroll/pay_schedule.rb +40 -0
  32. data/lib/xeroizer/models/payroll/pay_template.rb +24 -0
  33. data/lib/xeroizer/models/payroll/payment_method.rb +24 -0
  34. data/lib/xeroizer/models/payroll/paystub.rb +44 -0
  35. data/lib/xeroizer/models/payroll/reimbursement_line.rb +21 -0
  36. data/lib/xeroizer/models/payroll/reimbursement_type.rb +22 -0
  37. data/lib/xeroizer/models/payroll/salary_and_wage.rb +29 -0
  38. data/lib/xeroizer/models/payroll/super_line.rb +40 -0
  39. data/lib/xeroizer/models/payroll/tax_declaration.rb +50 -0
  40. data/lib/xeroizer/models/payroll/time_off_line.rb +20 -0
  41. data/lib/xeroizer/models/payroll/time_off_type.rb +32 -0
  42. data/lib/xeroizer/models/payroll/work_location.rb +25 -0
  43. data/lib/xeroizer/models/quote.rb +76 -0
  44. data/lib/xeroizer/models/tax_component.rb +1 -0
  45. data/lib/xeroizer/oauth.rb +12 -1
  46. data/lib/xeroizer/oauth2.rb +82 -0
  47. data/lib/xeroizer/oauth2_application.rb +49 -0
  48. data/lib/xeroizer/payroll_application.rb +8 -3
  49. data/lib/xeroizer/record/base_model.rb +1 -1
  50. data/lib/xeroizer/record/base_model_http_proxy.rb +1 -0
  51. data/lib/xeroizer/record/payroll_base.rb +4 -0
  52. data/lib/xeroizer/record/record_association_helper.rb +4 -4
  53. data/lib/xeroizer/record/validators/associated_validator.rb +1 -0
  54. data/lib/xeroizer/record/xml_helper.rb +16 -16
  55. data/lib/xeroizer/response.rb +22 -17
  56. data/lib/xeroizer/version.rb +1 -1
  57. data/lib/xeroizer.rb +31 -4
  58. data/test/acceptance/about_creating_bank_transactions_test.rb +80 -82
  59. data/test/acceptance/about_creating_prepayment_test.rb +25 -30
  60. data/test/acceptance/about_fetching_bank_transactions_test.rb +10 -10
  61. data/test/acceptance/about_online_invoice_test.rb +6 -10
  62. data/test/acceptance/acceptance_test.rb +28 -26
  63. data/test/acceptance/bank_transfer_test.rb +12 -17
  64. data/test/acceptance/bulk_operations_test.rb +18 -16
  65. data/test/acceptance/connections_test.rb +11 -0
  66. data/test/stub_responses/bad_request.json +6 -0
  67. data/test/stub_responses/connections.json +16 -0
  68. data/test/stub_responses/expired_oauth2_token.json +6 -0
  69. data/test/stub_responses/generic_response_error.json +6 -0
  70. data/test/stub_responses/invalid_oauth2_request_token.json +6 -0
  71. data/test/stub_responses/invalid_tenant_header.json +6 -0
  72. data/test/stub_responses/object_not_found.json +6 -0
  73. data/test/test_helper.rb +16 -11
  74. data/test/unit/generic_application_test.rb +21 -10
  75. data/test/unit/http_test.rb +281 -9
  76. data/test/unit/models/address_test.rb +2 -2
  77. data/test/unit/models/bank_transaction_model_parsing_test.rb +2 -2
  78. data/test/unit/models/bank_transaction_test.rb +1 -1
  79. data/test/unit/models/bank_transaction_validation_test.rb +1 -1
  80. data/test/unit/models/contact_test.rb +2 -2
  81. data/test/unit/models/credit_note_test.rb +8 -8
  82. data/test/unit/models/employee_test.rb +4 -4
  83. data/test/unit/models/invoice_test.rb +12 -12
  84. data/test/unit/models/journal_line_test.rb +6 -6
  85. data/test/unit/models/journal_test.rb +4 -4
  86. data/test/unit/models/line_item_sum_test.rb +1 -1
  87. data/test/unit/models/line_item_test.rb +19 -2
  88. data/test/unit/models/manual_journal_test.rb +3 -3
  89. data/test/unit/models/organisation_test.rb +2 -2
  90. data/test/unit/models/payment_service_test.rb +2 -2
  91. data/test/unit/models/phone_test.rb +7 -7
  92. data/test/unit/models/prepayment_test.rb +4 -4
  93. data/test/unit/models/repeating_invoice_test.rb +2 -2
  94. data/test/unit/models/tax_rate_test.rb +2 -2
  95. data/test/unit/oauth2_test.rb +171 -0
  96. data/test/unit/oauth_config_test.rb +1 -1
  97. data/test/unit/record/base_model_test.rb +13 -13
  98. data/test/unit/record/base_test.rb +5 -4
  99. data/test/unit/record/block_validator_test.rb +1 -1
  100. data/test/unit/record/connection_test.rb +60 -0
  101. data/test/unit/record/model_definition_test.rb +36 -36
  102. data/test/unit/record/parse_params_test.rb +2 -2
  103. data/test/unit/record/parse_where_hash_test.rb +13 -13
  104. data/test/unit/record/record_association_test.rb +14 -14
  105. data/test/unit/record/validators_test.rb +43 -43
  106. data/test/unit/record_definition_test.rb +7 -7
  107. data/test/unit/report_definition_test.rb +7 -7
  108. data/test/unit/report_test.rb +20 -20
  109. data/test/unit_test_helper.rb +16 -0
  110. metadata +106 -23
  111. data/lib/xeroizer/models/payroll/home_address.rb +0 -24
  112. data/lib/xeroizer/partner_application.rb +0 -51
  113. data/lib/xeroizer/private_application.rb +0 -25
  114. data/lib/xeroizer/public_application.rb +0 -21
  115. data/test/unit/http_tsl_12_upgrade_test.rb +0 -31
  116. data/test/unit/oauth_test.rb +0 -118
  117. data/test/unit/private_application_test.rb +0 -20
@@ -0,0 +1,60 @@
1
+ require 'unit_test_helper'
2
+
3
+ class ConnectionTest < UnitTestCase
4
+ include TestHelper
5
+
6
+ setup do
7
+ @client = Xeroizer::OAuth2Application.new("client id", "client secret", access_token: "access token")
8
+ end
9
+
10
+ context "when the request succeeds" do
11
+ setup do
12
+ stub_request(:get, "https://api.xero.com/connections").to_return(
13
+ body: [
14
+ {
15
+ id: "fe4cd81c-624a-4506-ab18-11c656742436",
16
+ tenantId: "c84e0419-ade8-4296-9794-289876d4bc22",
17
+ tenantType: "ORGANISATION",
18
+ createdDateUtc: "2019-12-13T18:10:43.3063640",
19
+ updatedDateUtc: "2019-12-13T18:10:43.3084790"
20
+ },
21
+ {
22
+ id: "fe4cd81c-624a-4506-ab18-11c656742436",
23
+ tenantId: "c84e0419-ade8-4296-9794-289876d4bc22",
24
+ tenantType: "ORGANISATION",
25
+ createdDateUtc: "2019-12-13T18:10:43.3063640",
26
+ updatedDateUtc: "2019-12-13T18:10:43.3084790"
27
+ }
28
+ ].to_json
29
+ )
30
+ end
31
+
32
+ it 'returns connections using the passed client' do
33
+ result = Xeroizer::Connection.current_connections(@client.client)
34
+ assert_equal 2, result.count
35
+ assert_equal "c84e0419-ade8-4296-9794-289876d4bc22", result.first.tenant_id
36
+ end
37
+ end
38
+
39
+ context 'when the request fails' do
40
+ setup do
41
+ @body = {
42
+ title: "Unauthorized",
43
+ status: 401,
44
+ detail: "AuthenticationUnsuccessful",
45
+ instance: "e1d2cb91-82bf-41a5-84dd-fe6a5c6f070c"
46
+ }.to_json
47
+
48
+ stub_request(:get, "https://api.xero.com/connections").to_return(
49
+ status: 401,
50
+ body: @body
51
+ )
52
+ end
53
+
54
+ it 'raises token_invalid error' do
55
+ assert_raises(Xeroizer::OAuth::TokenInvalid, @body) {
56
+ Xeroizer::Connection.current_connections(@client.client)
57
+ }
58
+ end
59
+ end
60
+ end
@@ -1,12 +1,12 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class ModelDefinitionsTest < Test::Unit::TestCase
4
4
  include TestHelper
5
-
5
+
6
6
  class FirstRecord < Xeroizer::Record::Base
7
-
7
+
8
8
  set_primary_key :primary_key_id
9
-
9
+
10
10
  guid :primary_key_id
11
11
  string :string1
12
12
  boolean :boolean1
@@ -14,14 +14,14 @@ class ModelDefinitionsTest < Test::Unit::TestCase
14
14
  decimal :decimal1
15
15
  date :date1
16
16
  datetime :datetime1
17
-
17
+
18
18
  end
19
19
  class Xeroizer::Record::FirstRecordModel < Xeroizer::Record::BaseModel; end
20
-
20
+
21
21
  class SecondRecord < Xeroizer::Record::Base
22
22
 
23
23
  set_primary_key :primary_key_id
24
-
24
+
25
25
  guid :primary_key_id
26
26
  string :string2
27
27
  boolean :boolean2
@@ -32,63 +32,63 @@ class ModelDefinitionsTest < Test::Unit::TestCase
32
32
 
33
33
  end
34
34
  class Xeroizer::Record::SecondRecordModel < Xeroizer::Record::BaseModel; end
35
-
35
+
36
36
  class TestRecord < Xeroizer::Record::Base
37
-
37
+
38
38
  string :xml_name, :api_name => 'ApiNameHere', :internal_name => :internal_name_here
39
39
  string :name
40
-
40
+
41
41
  end
42
42
  class Xeroizer::Record::TestRecordModel < Xeroizer::Record::BaseModel; end
43
-
43
+
44
44
  class SummaryOnlyRecord < Xeroizer::Record::Base
45
45
  class Xeroizer::Record::SummaryOnlyRecordModel < Xeroizer::Record::BaseModel; end
46
-
46
+
47
47
  list_contains_summary_only true
48
48
  set_possible_primary_keys :primary_key_id
49
49
  set_primary_key :primary_key_id
50
-
50
+
51
51
  string :primary_key_id
52
52
  string :name
53
53
  end
54
-
54
+
55
55
  class SummaryOnlyOffRecord < Xeroizer::Record::Base
56
56
  class Xeroizer::Record::SummaryOnlyOffRecordModel < Xeroizer::Record::BaseModel; end
57
-
57
+
58
58
  set_possible_primary_keys :primary_key_id
59
59
  set_primary_key :primary_key_id
60
-
60
+
61
61
  string :primary_key_id
62
62
  string :name
63
63
  end
64
-
64
+
65
65
  def setup
66
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
66
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
67
67
  parent = stub(:application => @client, :mark_dirty => nil)
68
68
  @first = FirstRecord.new(parent)
69
69
  @second = SecondRecord.new(parent)
70
70
  @record = TestRecord.build({}, @client.Contact)
71
71
  @contact = @client.Contact.build
72
72
  end
73
-
73
+
74
74
  context "list contains summary only test" do
75
-
75
+
76
76
  should "show download complete if not summary record and id set" do
77
77
  record = SummaryOnlyRecord.build({}, @client.Contact)
78
78
  record.id = "NOTBLANK"
79
79
  assert_equal(false, record.new_record?)
80
80
  assert_equal(false, record.complete_record_downloaded?)
81
-
81
+
82
82
  record = SummaryOnlyOffRecord.build({}, @client.Contact)
83
83
  record.id = "NOTBLANK"
84
84
  assert_equal(false, record.new_record?)
85
85
  assert_equal(true, record.complete_record_downloaded?)
86
86
  end
87
-
87
+
88
88
  end
89
-
89
+
90
90
  context "record field definition" do
91
-
91
+
92
92
  should "define primary key with real name" do
93
93
  assert_nil(@first.id)
94
94
  value = "PRIMARY KEY VALUE"
@@ -96,7 +96,7 @@ class ModelDefinitionsTest < Test::Unit::TestCase
96
96
  assert_equal(value, @first.primary_key_id)
97
97
  assert_equal(value, @first.id)
98
98
  end
99
-
99
+
100
100
  should "define primary key with shortcut #id method" do
101
101
  assert_nil(@first.id)
102
102
  value = "PRIMARY KEY VALUE"
@@ -104,7 +104,7 @@ class ModelDefinitionsTest < Test::Unit::TestCase
104
104
  assert_equal(value, @first.id)
105
105
  assert_equal(value, @first.primary_key_id)
106
106
  end
107
-
107
+
108
108
  should "only have proper fields" do
109
109
  fieldset = [:primary_key_id, :string1, :boolean1, :integer1, :decimal1, :date1, :datetime1]
110
110
  fieldset.each do | field |
@@ -116,16 +116,16 @@ class ModelDefinitionsTest < Test::Unit::TestCase
116
116
  fieldset.each do | field |
117
117
  assert(@second.class.fields.keys.include?(field), "#{field} not in SecondRecord.fields")
118
118
  end
119
- assert_equal(fieldset.size, @second.class.fields.size)
119
+ assert_equal(fieldset.size, @second.class.fields.size)
120
120
  end
121
-
121
+
122
122
  should "have correct names" do
123
123
  assert(@record.respond_to?(:internal_name_here), "Internal name should be internal_name_here")
124
124
  assert(@record.class.fields.keys.include?(:xml_name), "Field key name should be xml_name")
125
125
  assert_equal('ApiNameHere', @record.class.fields[:xml_name][:api_name])
126
126
  end
127
-
128
- should "have shortcut reader/writer" do
127
+
128
+ should "have shortcut reader/writer" do
129
129
  assert_nil(@first.string1)
130
130
  value = 'TEST VALUE'
131
131
  @first.string1 = value
@@ -136,30 +136,30 @@ class ModelDefinitionsTest < Test::Unit::TestCase
136
136
  @first[:string1] = value
137
137
  assert_equal(value, @first.attributes[:string1])
138
138
  end
139
-
139
+
140
140
  should "define reader/writer methods" do
141
141
  assert(@record.respond_to?(:name), "FirstRecord#name should exist.")
142
142
  assert(@record.respond_to?(:name=), "FirstRecord#name= should exist.")
143
-
143
+
144
144
  value = "TEST NAME"
145
145
  @record.attributes[:name] = value
146
146
  assert_equal(value, @record.attributes[:name])
147
147
  assert_equal(value, @record[:name])
148
148
  assert_equal(value, @record.name)
149
-
149
+
150
150
  value = "TEST DIFFERENT"
151
151
  @record.name = value
152
152
  assert_equal(value, @record.attributes[:name])
153
153
  assert_equal(value, @record[:name])
154
154
  assert_equal(value, @record.name)
155
-
155
+
156
156
  value = "TEST DIFFERENT AGAIN"
157
157
  @record[:name] = value
158
158
  assert_equal(value, @record.attributes[:name])
159
159
  assert_equal(value, @record[:name])
160
160
  assert_equal(value, @record.name)
161
161
  end
162
-
162
+
163
163
  end
164
-
164
+
165
165
  end
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  module Xeroizer
4
4
  module Record
@@ -27,7 +27,7 @@ class ParseParamsTest < Test::Unit::TestCase
27
27
  include TestHelper
28
28
 
29
29
  def setup
30
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
30
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
31
31
  @model = Xeroizer::Record::ParseParamTestModel.new(@client, "ParseParamTest")
32
32
  end
33
33
 
@@ -1,11 +1,11 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  module Xeroizer
4
4
  module Record
5
-
5
+
6
6
  class WhereHashTestModel < BaseModel
7
7
  end
8
-
8
+
9
9
  class WhereHashTest < Base
10
10
 
11
11
  set_primary_key :primary_key_id
@@ -19,32 +19,32 @@ module Xeroizer
19
19
  datetime :datetime1
20
20
 
21
21
  end
22
-
22
+
23
23
  end
24
- end
24
+ end
25
25
 
26
26
  class ParseWhereHashTest < Test::Unit::TestCase
27
27
  include TestHelper
28
-
28
+
29
29
  def setup
30
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
30
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
31
31
  @model = Xeroizer::Record::WhereHashTestModel.new(@client, "WhereHashTest")
32
32
  end
33
-
33
+
34
34
  context "where hash" do
35
-
35
+
36
36
  should "parse valid hash" do
37
37
  @model.send(:parse_where_hash, {
38
- :primary_key_id => 'f7eca431-5c97-4d24-93fd-004bb8a6c644',
39
- :string1 => 'test',
40
- :boolean1 => true,
38
+ :primary_key_id => 'f7eca431-5c97-4d24-93fd-004bb8a6c644',
39
+ :string1 => 'test',
40
+ :boolean1 => true,
41
41
  :integer1 => 10,
42
42
  :decimal1 => 123.45,
43
43
  :date1 => Date.parse("2010-01-05"),
44
44
  :datetime1 => Time.parse("2010-02-30 09:10:20")
45
45
  })
46
46
  end
47
-
47
+
48
48
  should 'have valid expression components' do
49
49
  assert_equal('String1=="abc"', CGI.unescape(@model.send(:parse_where_hash, {:string1 => 'abc'})))
50
50
  assert_equal('String1<>"abc"', CGI.unescape(@model.send(:parse_where_hash, {:string1_is_not => 'abc'})))
@@ -1,16 +1,16 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class RecordAssociationTest < 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
  @client.stubs(:http_put).returns(get_record_xml(:invoice, "762aa45d-4632-45b5-8087-b4f47690665e"))
10
10
  end
11
-
11
+
12
12
  context "belongs_to association" do
13
-
13
+
14
14
  should "auto-load complete record if summary" do
15
15
  invoice = @client.Invoice.first
16
16
  assert_nil(invoice.attributes[:contact].contact_status)
@@ -18,11 +18,11 @@ class RecordAssociationTest < Test::Unit::TestCase
18
18
  assert_not_nil(invoice.contact.contact_status)
19
19
  assert_equal(true, invoice.complete_record_downloaded?)
20
20
  end
21
-
21
+
22
22
  end
23
-
23
+
24
24
  context "has_many association" do
25
-
25
+
26
26
  should "auto-load complete records if summary" do
27
27
  invoice = @client.Invoice.first
28
28
  assert_nil(invoice.attributes[:line_items])
@@ -30,7 +30,7 @@ class RecordAssociationTest < Test::Unit::TestCase
30
30
  assert(invoice.line_items.size > 0, "There should be one or more line items.")
31
31
  assert_equal(true, invoice.complete_record_downloaded?)
32
32
  end
33
-
33
+
34
34
  should "auto-build belongs_to item when passed hash" do
35
35
  invoice = @client.Invoice.build
36
36
  assert_nil(invoice.contact)
@@ -38,7 +38,7 @@ class RecordAssociationTest < Test::Unit::TestCase
38
38
  assert_kind_of(Xeroizer::Record::Contact, invoice.contact)
39
39
  assert_equal("Test Contact", invoice.contact.name)
40
40
  end
41
-
41
+
42
42
  should "auto-build has_many items when passed hash" do
43
43
  contact = @client.Contact.build
44
44
  assert_equal([], contact.phones)
@@ -46,11 +46,11 @@ class RecordAssociationTest < Test::Unit::TestCase
46
46
  assert_kind_of(Xeroizer::Record::Phone, contact.phones.first)
47
47
  assert_equal("1234", contact.phones.first.number)
48
48
  end
49
-
49
+
50
50
  should "auto-build has_many items when passed array" do
51
51
  contact = @client.Contact.build
52
52
  assert_equal([], contact.phones)
53
-
53
+
54
54
  data = [
55
55
  {:type => "DEFAULT", :number => "1111"},
56
56
  {:type => "FAX", :number => "2222"}
@@ -58,12 +58,12 @@ class RecordAssociationTest < Test::Unit::TestCase
58
58
  contact.phones = data.dup
59
59
 
60
60
  assert_equal(2, contact.phones.size)
61
- contact.phones.each_with_index do | phone, index |
61
+ contact.phones.each_with_index do | phone, index |
62
62
  assert_kind_of(Xeroizer::Record::Phone, phone)
63
63
  assert_equal(data[index][:number], phone.number)
64
64
  end
65
65
  end
66
-
66
+
67
67
  should "retain unsaved items after create" do
68
68
  invoice = @client.Invoice.build :type => "ACCREC", :contact => { :name => "A" }
69
69
  invoice.save
@@ -89,5 +89,5 @@ class RecordAssociationTest < Test::Unit::TestCase
89
89
  assert_equal(1, invoice.line_items.size, "There should be one line item.")
90
90
  end
91
91
  end
92
-
92
+
93
93
  end
@@ -1,13 +1,13 @@
1
- require 'test_helper'
1
+ require 'unit_test_helper'
2
2
 
3
3
  class ValidatorsTest < Test::Unit::TestCase
4
4
  include TestHelper
5
-
5
+
6
6
  class Xeroizer::Record::TestModel < Xeroizer::Record::BaseModel
7
7
  end
8
-
8
+
9
9
  class Xeroizer::Record::Test < Xeroizer::Record::Base
10
-
10
+
11
11
  string :name
12
12
  string :name_conditional_if
13
13
  string :name_conditional_unless
@@ -16,7 +16,7 @@ class ValidatorsTest < Test::Unit::TestCase
16
16
  string :type
17
17
  string :type_blank
18
18
  integer :value
19
-
19
+
20
20
  belongs_to :contact
21
21
  has_many :addresses
22
22
 
@@ -29,81 +29,81 @@ class ValidatorsTest < Test::Unit::TestCase
29
29
  validates_inclusion_of :type_blank, :in => %w(phone fax mobile), :message => "not_included_blank", :allow_blanks => true
30
30
  validates_associated :contact, :message => "association_invalid"
31
31
  validates_associated :addresses, :message => "association_invalid_blank", :allow_blanks => true
32
-
32
+
33
33
  def value_equals_ten?
34
34
  value == 10
35
35
  end
36
-
36
+
37
37
  def value_equals_twenty?
38
38
  value == 20
39
39
  end
40
40
  end
41
-
41
+
42
42
  def setup
43
- @client = Xeroizer::PublicApplication.new(CONSUMER_KEY, CONSUMER_SECRET)
43
+ @client = Xeroizer::OAuth2Application.new(CLIENT_ID, CLIENT_SECRET)
44
44
  @record = Xeroizer::Record::TestModel.new(@client, 'Test').build
45
45
  end
46
-
46
+
47
47
  context "associated validator" do
48
-
48
+
49
49
  should "exist and be valid" do
50
50
  # Nil contact
51
51
  assert_equal(false, @record.valid?)
52
52
  error = @record.errors_for(:contact).first
53
53
  assert_not_nil(error)
54
54
  assert_equal('association_invalid', error)
55
-
55
+
56
56
  # Valid contact
57
57
  @record.build_contact({:name => 'VALID NAME'})
58
58
  @record.valid?
59
59
  error = @record.errors_for(:contact).first
60
60
  assert_nil(error)
61
61
  end
62
-
62
+
63
63
  should "exist and be valid unless allowed to be blank" do
64
64
  # Nil address
65
65
  assert_equal(false, @record.valid?)
66
66
  error = @record.errors_for(:addresses).first
67
67
  assert_nil(error)
68
-
68
+
69
69
  # Valid address
70
70
  @record.add_address(:type => 'STREET')
71
71
  @record.valid?
72
72
  error = @record.errors_for(:addresses).first
73
73
  assert_nil(error)
74
-
74
+
75
75
  # Invalid address
76
76
  @record.addresses[0].type = "INVALID TYPE"
77
77
  @record.valid?
78
78
  error = @record.errors_for(:addresses).first
79
79
  assert_equal('association_invalid_blank', error)
80
-
80
+
81
81
  # One invalid address
82
82
  @record.add_address(:type => 'STREET')
83
83
  assert_equal(2, @record.addresses.size)
84
84
  @record.valid?
85
85
  error = @record.errors_for(:addresses).first
86
- assert_equal('association_invalid_blank', error)
86
+ assert_equal('association_invalid_blank', error)
87
87
  end
88
-
88
+
89
89
  end
90
-
90
+
91
91
  context "inclusion validator" do
92
-
92
+
93
93
  should "be included in list" do
94
94
  # Nil type
95
95
  assert_equal(false, @record.valid?)
96
96
  error = @record.errors_for(:type).first
97
97
  assert_not_nil(error)
98
98
  assert_equal('not_included', error)
99
-
99
+
100
100
  # Invalid type
101
101
  @record.type = 'phone not valid'
102
102
  @record.valid?
103
103
  error = @record.errors_for(:type).first
104
104
  assert_not_nil(error)
105
105
  assert_equal('not_included', error)
106
-
106
+
107
107
  # Valid type
108
108
  %w(phone fax mobile).each do | valid_type |
109
109
  @record.type = valid_type
@@ -112,20 +112,20 @@ class ValidatorsTest < Test::Unit::TestCase
112
112
  assert_nil(error)
113
113
  end
114
114
  end
115
-
115
+
116
116
  should "be included in list unless allowed to be blank" do
117
117
  # Nil type_blank
118
118
  assert_equal(false, @record.valid?)
119
119
  error = @record.errors_for(:type_blank).first
120
120
  assert_nil(error)
121
-
121
+
122
122
  # Invalid type_blank
123
123
  @record.type_blank = 'phone not valid'
124
124
  @record.valid?
125
125
  error = @record.errors_for(:type_blank).first
126
126
  assert_not_nil(error)
127
127
  assert_equal('not_included_blank', error)
128
-
128
+
129
129
  # Valid type_blank
130
130
  %w(phone fax mobile).each do | valid_type |
131
131
  @record.type_blank = valid_type
@@ -134,95 +134,95 @@ class ValidatorsTest < Test::Unit::TestCase
134
134
  assert_nil(error)
135
135
  end
136
136
  end
137
-
137
+
138
138
  end
139
-
139
+
140
140
  context "presence validator" do
141
-
141
+
142
142
  should "have name" do
143
143
  assert_equal(false, @record.valid?)
144
144
  error = @record.errors_for(:name).first
145
145
  assert_not_nil(error)
146
146
  assert_equal('blank', error)
147
-
147
+
148
148
  @record.name = "NOT BLANK"
149
149
  @record.valid?
150
150
  error = @record.errors_for(:name).first
151
151
  assert_nil(error)
152
152
  end
153
-
153
+
154
154
  should "have name if value is 10" do
155
155
  @record.value = 10
156
156
  assert_equal(false, @record.valid?)
157
157
  error = @record.errors_for(:name_conditional_if).first
158
158
  assert_equal('blank_if_10', error)
159
-
159
+
160
160
  @record.name_conditional_if = "NOT BLANK"
161
161
  @record.valid?
162
162
  error = @record.errors_for(:name_conditional_if).first
163
163
  assert_nil(error)
164
-
164
+
165
165
  @record.name_conditional_if = nil
166
166
  @record.value = 50
167
167
  @record.valid?
168
168
  error = @record.errors_for(:name_conditional_if).first
169
169
  assert_nil(error)
170
170
  end
171
-
171
+
172
172
  should "have name if value_equals_ten?" do
173
173
  @record.value = 10
174
174
  assert_equal(false, @record.valid?)
175
175
  error = @record.errors_for(:name_conditional_method_if).first
176
176
  assert_equal('blank_if_10', error)
177
-
177
+
178
178
  @record.name_conditional_method_if = "NOT BLANK"
179
179
  @record.valid?
180
180
  error = @record.errors_for(:name_conditional_method_if).first
181
181
  assert_nil(error)
182
-
182
+
183
183
  @record.name_conditional_method_if = nil
184
184
  @record.value = 50
185
185
  @record.valid?
186
186
  error = @record.errors_for(:name_conditional_method_if).first
187
187
  assert_nil(error)
188
188
  end
189
-
189
+
190
190
  should "have name unless value is 20" do
191
191
  @record.value = 50
192
192
  assert_equal(false, @record.valid?)
193
193
  error = @record.errors_for(:name_conditional_unless).first
194
194
  assert_equal('blank_unless_20', error)
195
-
195
+
196
196
  @record.name_conditional_unless = "NOT BLANK"
197
197
  @record.valid?
198
198
  error = @record.errors_for(:name_conditional_unless).first
199
199
  assert_nil(error)
200
-
200
+
201
201
  @record.name_conditional_unless = nil
202
202
  @record.value = 20
203
203
  @record.valid?
204
204
  error = @record.errors_for(:name_conditional_unless).first
205
205
  assert_nil(error)
206
206
  end
207
-
207
+
208
208
  should "have name unless value_equals_twenty?" do
209
209
  @record.value = 50
210
210
  assert_equal(false, @record.valid?)
211
211
  error = @record.errors_for(:name_conditional_method_unless).first
212
212
  assert_equal('blank_unless_20', error)
213
-
213
+
214
214
  @record.name_conditional_method_unless = "NOT BLANK"
215
215
  @record.valid?
216
216
  error = @record.errors_for(:name_conditional_method_unless).first
217
217
  assert_nil(error)
218
-
218
+
219
219
  @record.name_conditional_method_unless = nil
220
220
  @record.value = 20
221
221
  @record.valid?
222
222
  error = @record.errors_for(:name_conditional_method_unless).first
223
223
  assert_nil(error)
224
224
  end
225
-
225
+
226
226
  end
227
-
227
+
228
228
  end