netsuite 0.2.6 → 0.3.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 (152) hide show
  1. data/.travis.yml +3 -0
  2. data/Gemfile +2 -0
  3. data/README.md +132 -54
  4. data/lib/netsuite.rb +123 -76
  5. data/lib/netsuite/actions/add.rb +1 -0
  6. data/lib/netsuite/actions/delete.rb +1 -0
  7. data/lib/netsuite/actions/get.rb +1 -0
  8. data/lib/netsuite/actions/get_all.rb +67 -0
  9. data/lib/netsuite/actions/get_list.rb +2 -1
  10. data/lib/netsuite/actions/get_select_value.rb +1 -0
  11. data/lib/netsuite/actions/initialize.rb +1 -0
  12. data/lib/netsuite/actions/login.rb +2 -0
  13. data/lib/netsuite/actions/search.rb +3 -2
  14. data/lib/netsuite/actions/update.rb +18 -0
  15. data/lib/netsuite/actions/upsert.rb +1 -0
  16. data/lib/netsuite/actions/upsert_list.rb +114 -0
  17. data/lib/netsuite/configuration.rb +5 -0
  18. data/lib/netsuite/namespaces/file_cabinet.rb +11 -0
  19. data/lib/netsuite/namespaces/list_emp.rb +12 -0
  20. data/lib/netsuite/namespaces/list_mkt.rb +12 -0
  21. data/lib/netsuite/namespaces/list_website.rb +11 -0
  22. data/lib/netsuite/namespaces/tran_invt.rb +11 -0
  23. data/lib/netsuite/records/accounting_period.rb +1 -1
  24. data/lib/netsuite/records/assembly_item.rb +10 -4
  25. data/lib/netsuite/records/billing_schedule.rb +33 -0
  26. data/lib/netsuite/records/billing_schedule_milestone.rb +28 -0
  27. data/lib/netsuite/records/billing_schedule_milestone_list.rb +33 -0
  28. data/lib/netsuite/records/billing_schedule_recurrence.rb +28 -0
  29. data/lib/netsuite/records/billing_schedule_recurrence_list.rb +33 -0
  30. data/lib/netsuite/records/bin.rb +22 -0
  31. data/lib/netsuite/records/campaign.rb +28 -0
  32. data/lib/netsuite/records/cash_refund.rb +1 -1
  33. data/lib/netsuite/records/classification.rb +1 -1
  34. data/lib/netsuite/records/contact.rb +1 -1
  35. data/lib/netsuite/records/contact_access_roles.rb +14 -0
  36. data/lib/netsuite/records/contact_access_roles_list.rb +9 -0
  37. data/lib/netsuite/records/custom_field.rb +2 -1
  38. data/lib/netsuite/records/custom_field_list.rb +23 -4
  39. data/lib/netsuite/records/custom_list.rb +27 -0
  40. data/lib/netsuite/records/custom_list_custom_value.rb +14 -0
  41. data/lib/netsuite/records/custom_list_custom_value_list.rb +13 -0
  42. data/lib/netsuite/records/custom_record.rb +1 -1
  43. data/lib/netsuite/records/custom_record_type.rb +1 -1
  44. data/lib/netsuite/records/customer.rb +4 -4
  45. data/lib/netsuite/records/customer_addressbook.rb +8 -5
  46. data/lib/netsuite/records/customer_addressbook_list.rb +13 -1
  47. data/lib/netsuite/records/customer_deposit.rb +3 -2
  48. data/lib/netsuite/records/customer_payment.rb +1 -1
  49. data/lib/netsuite/records/customer_refund.rb +1 -1
  50. data/lib/netsuite/records/department.rb +4 -2
  51. data/lib/netsuite/records/deposit.rb +1 -1
  52. data/lib/netsuite/records/deposit_cash_back.rb +2 -2
  53. data/lib/netsuite/records/deposit_other.rb +2 -2
  54. data/lib/netsuite/records/discount_item.rb +32 -0
  55. data/lib/netsuite/records/employee.rb +20 -0
  56. data/lib/netsuite/records/file.rb +28 -0
  57. data/lib/netsuite/records/inventory_assignment.rb +24 -0
  58. data/lib/netsuite/records/inventory_assignment_list.rb +32 -0
  59. data/lib/netsuite/records/inventory_detail.rb +18 -0
  60. data/lib/netsuite/records/inventory_transfer.rb +29 -0
  61. data/lib/netsuite/records/inventory_transfer_inventory.rb +21 -0
  62. data/lib/netsuite/records/inventory_transfer_inventory_list.rb +33 -0
  63. data/lib/netsuite/records/item_fulfillment.rb +1 -1
  64. data/lib/netsuite/records/item_fulfillment_item_list.rb +3 -21
  65. data/lib/netsuite/records/item_member.rb +21 -0
  66. data/lib/netsuite/records/journal_entry.rb +1 -1
  67. data/lib/netsuite/records/kit_item.rb +1 -1
  68. data/lib/netsuite/records/location.rb +3 -1
  69. data/lib/netsuite/records/member_list.rb +32 -0
  70. data/lib/netsuite/records/non_inventory_sale_item.rb +4 -1
  71. data/lib/netsuite/records/partner.rb +21 -0
  72. data/lib/netsuite/records/promotion_code.rb +38 -0
  73. data/lib/netsuite/records/record_ref_list.rb +40 -0
  74. data/lib/netsuite/records/role_list.rb +25 -0
  75. data/lib/netsuite/records/sales_order.rb +6 -2
  76. data/lib/netsuite/records/sales_tax_item.rb +32 -0
  77. data/lib/netsuite/records/site_category.rb +33 -0
  78. data/lib/netsuite/records/subsidiary.rb +38 -0
  79. data/lib/netsuite/records/tax_type.rb +22 -0
  80. data/lib/netsuite/records/term.rb +1 -1
  81. data/lib/netsuite/records/units_type.rb +25 -0
  82. data/lib/netsuite/records/units_type_uom.rb +20 -0
  83. data/lib/netsuite/records/units_type_uom_list.rb +33 -0
  84. data/lib/netsuite/records/work_order.rb +38 -0
  85. data/lib/netsuite/records/work_order_item.rb +31 -0
  86. data/lib/netsuite/records/work_order_item_list.rb +31 -0
  87. data/lib/netsuite/support/actions.rb +4 -0
  88. data/lib/netsuite/support/base.rb +21 -0
  89. data/lib/netsuite/support/country.rb +273 -0
  90. data/lib/netsuite/support/search_result.rb +4 -0
  91. data/lib/netsuite/support/sublist.rb +54 -0
  92. data/lib/netsuite/version.rb +1 -1
  93. data/spec/netsuite/actions/search_spec.rb +1 -1
  94. data/spec/netsuite/actions/update_spec.rb +62 -31
  95. data/spec/netsuite/actions/upsert_list_spec.rb +112 -0
  96. data/spec/netsuite/records/account_spec.rb +4 -4
  97. data/spec/netsuite/records/accounting_period_spec.rb +4 -4
  98. data/spec/netsuite/records/assembly_item_spec.rb +38 -0
  99. data/spec/netsuite/records/billing_schedule_milestone_list_spec.rb +24 -0
  100. data/spec/netsuite/records/billing_schedule_milestone_spec.rb +51 -0
  101. data/spec/netsuite/records/billing_schedule_recurrence_list_spec.rb +24 -0
  102. data/spec/netsuite/records/billing_schedule_recurrence_spec.rb +49 -0
  103. data/spec/netsuite/records/billing_schedule_spec.rb +164 -0
  104. data/spec/netsuite/records/campaign_spec.rb +43 -0
  105. data/spec/netsuite/records/cash_refund_spec.rb +1 -1
  106. data/spec/netsuite/records/classification_spec.rb +2 -2
  107. data/spec/netsuite/records/credit_memo_spec.rb +4 -4
  108. data/spec/netsuite/records/custom_field_list_spec.rb +10 -0
  109. data/spec/netsuite/records/custom_list_spec.rb +21 -0
  110. data/spec/netsuite/records/custom_record_spec.rb +5 -5
  111. data/spec/netsuite/records/custom_record_type_spec.rb +5 -5
  112. data/spec/netsuite/records/customer_addressbook_list_spec.rb +19 -1
  113. data/spec/netsuite/records/customer_addressbook_spec.rb +42 -13
  114. data/spec/netsuite/records/customer_payment_spec.rb +4 -4
  115. data/spec/netsuite/records/customer_refund_spec.rb +4 -4
  116. data/spec/netsuite/records/customer_spec.rb +80 -6
  117. data/spec/netsuite/records/department_spec.rb +4 -4
  118. data/spec/netsuite/records/deposit_spec.rb +22 -4
  119. data/spec/netsuite/records/discount_item_spec.rb +124 -0
  120. data/spec/netsuite/records/inventory_item_spec.rb +4 -4
  121. data/spec/netsuite/records/inventory_transfer_spec.rb +58 -0
  122. data/spec/netsuite/records/invoice_spec.rb +4 -4
  123. data/spec/netsuite/records/job_spec.rb +7 -7
  124. data/spec/netsuite/records/journal_entry_spec.rb +5 -5
  125. data/spec/netsuite/records/non_inventory_sale_item_spec.rb +4 -4
  126. data/spec/netsuite/records/payment_method_spec.rb +1 -1
  127. data/spec/netsuite/records/pomo_code_spec.rb +40 -0
  128. data/spec/netsuite/records/sales_order_spec.rb +18 -18
  129. data/spec/netsuite/records/sales_tax_item_spec.rb +30 -0
  130. data/spec/netsuite/records/service_sale_item_spec.rb +4 -4
  131. data/spec/netsuite/records/site_category_spec.rb +51 -0
  132. data/spec/netsuite/records/subsidiary_spec.rb +25 -0
  133. data/spec/netsuite/records/support_case_spec.rb +8 -8
  134. data/spec/netsuite/records/tax_type_spec.rb +11 -0
  135. data/spec/netsuite/records/term_spec.rb +4 -4
  136. data/spec/netsuite/records/units_type_spec.rb +33 -0
  137. data/spec/netsuite/records/units_type_uom_list_spec.rb +23 -0
  138. data/spec/netsuite/records/units_type_uom_spec.rb +14 -0
  139. data/spec/netsuite/records/work_order_item_list_spec.rb +26 -0
  140. data/spec/netsuite/records/work_order_item_spec.rb +45 -0
  141. data/spec/netsuite/records/work_order_spec.rb +92 -0
  142. data/spec/netsuite/support/record_refs_spec.rb +1 -1
  143. data/spec/netsuite/support/sublist_spec.rb +36 -0
  144. data/spec/spec_helper.rb +1 -0
  145. data/spec/support/fixtures/update/update_customer_error.xml +21 -0
  146. data/spec/support/fixtures/update/update_customer_multiple_errors.xml +25 -0
  147. data/spec/support/fixtures/upsert_list/upsert_list_customers.xml +21 -0
  148. data/spec/support/fixtures/upsert_list/upsert_list_one_customer.xml +17 -0
  149. data/spec/support/fixtures/upsert_list/upsert_list_with_errors.xml +32 -0
  150. data/spec/support/read_only_field_matcher.rb +1 -1
  151. metadata +115 -5
  152. checksums.yaml +0 -15
@@ -1,3 +1,3 @@
1
1
  module Netsuite
2
- VERSION = '0.2.6'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -81,7 +81,7 @@ describe NetSuite::Actions::Search do
81
81
 
82
82
  :attributes! => {
83
83
  "platformCore:customField" => {
84
- "internalId" => ["custentity_customerandcontacttypelist", "custentity_relatedthing"],
84
+ "scriptId" => ["custentity_customerandcontacttypelist", "custentity_relatedthing"],
85
85
  "operator" => ["anyOf", "anyOf"],
86
86
  "xsi:type" => ["platformCore:SearchMultiSelectCustomField", "platformCore:SearchMultiSelectCustomField"]
87
87
  }
@@ -7,9 +7,8 @@ describe NetSuite::Actions::Update do
7
7
  context 'Customer' do
8
8
  let(:customer) { NetSuite::Records::Customer.new }
9
9
  let(:attributes) { { :entity_id => 'Shutter Fly', :company_name => 'Shutter Fly, Inc.' } }
10
-
11
- before do
12
- savon.expects(:update).with(:message => {
10
+ let(:message) do
11
+ {
13
12
  'platformMsgs:record' => {
14
13
  :content! => {
15
14
  'listRel:entityId' => 'Shutter Fly',
@@ -17,44 +16,76 @@ describe NetSuite::Actions::Update do
17
16
  },
18
17
  '@xsi:type' => 'listRel:Customer'
19
18
  },
20
- }).returns(File.read('spec/support/fixtures/update/update_customer.xml'))
19
+ }
21
20
  end
22
21
 
23
- it 'makes a valid request to the NetSuite API' do
24
- NetSuite::Actions::Update.call([NetSuite::Records::Customer, attributes])
25
- end
26
22
 
27
- it 'returns a valid Response object' do
28
- response = NetSuite::Actions::Update.call([NetSuite::Records::Customer, attributes])
29
- response.should be_kind_of(NetSuite::Response)
30
- response.should be_success
31
- end
32
- end
23
+ context 'when successful' do
33
24
 
34
- context 'Invoice' do
35
- let(:invoice) { NetSuite::Records::Invoice.new }
36
- let(:attributes) { { :source => 'Google', :total => 100.0 } }
25
+ before do
26
+ savon.expects(:update).with(:message => message).returns(File.read('spec/support/fixtures/update/update_customer.xml'))
27
+ end
28
+
29
+ it 'makes a valid request to the NetSuite API' do
30
+ NetSuite::Actions::Update.call([NetSuite::Records::Customer, attributes])
31
+ end
32
+
33
+ it 'returns a valid Response object' do
34
+ response = NetSuite::Actions::Update.call([NetSuite::Records::Customer, attributes])
35
+ response.should be_kind_of(NetSuite::Response)
36
+ response.should be_success
37
+ end
37
38
 
38
- before do
39
- savon.expects(:update).with(:message => {
40
- 'platformMsgs:record' => {
41
- :content! => {
42
- 'tranSales:source' => 'Google',
43
- },
44
- '@xsi:type' => 'tranSales:Invoice'
45
- },
46
- }).returns(File.read('spec/support/fixtures/update/update_invoice.xml'))
47
39
  end
48
40
 
49
- it 'makes a valid request to the NetSuite API' do
50
- NetSuite::Actions::Update.call([NetSuite::Records::Invoice, attributes])
41
+ context 'when not successful' do
42
+
43
+ before do
44
+ savon.expects(:update).with(:message => message).returns(File.read('spec/support/fixtures/update/update_customer_error.xml'))
45
+ end
46
+
47
+ it 'provides an errors method on the object with details about the errors' do
48
+ customer.update(attributes)
49
+ error = customer.errors.first
50
+
51
+ error.should be_kind_of(NetSuite::Error)
52
+ error.type.should eq('ERROR')
53
+ error.code.should eq('INSUFFICIENT_PERMISSION')
54
+ error.message.should eq('You do not have permissions to set a value for element addrtext due to one of the following reasons: 1) The field is read-only; 2) An associated feature is disabled; 3) The field is available either when a record is created or updated, but not in both cases.')
55
+ end
56
+
57
+ it 'provides an errors method on the response' do
58
+ response = NetSuite::Actions::Update.call([NetSuite::Records::Customer, attributes])
59
+ response.errors.first.should be_kind_of(NetSuite::Error)
60
+ end
61
+
51
62
  end
52
63
 
53
- it 'returns a valid Response object' do
54
- response = NetSuite::Actions::Update.call([NetSuite::Records::Invoice, attributes])
55
- response.should be_kind_of(NetSuite::Response)
56
- response.should be_success
64
+ context 'when not successful with multiple errors' do
65
+
66
+ before do
67
+ savon.expects(:update).with(:message => message).returns(File.read('spec/support/fixtures/update/update_customer_multiple_errors.xml'))
68
+ end
69
+
70
+ it 'provides an errors method on the object with details about the errors' do
71
+ customer.update(attributes)
72
+ customer.errors.length.should eq(2)
73
+
74
+ first_error = customer.errors.first
75
+ first_error.should be_kind_of(NetSuite::Error)
76
+ first_error.type.should eq('ERROR')
77
+ first_error.code.should eq('First error code')
78
+ first_error.message.should eq('First error message')
79
+
80
+ second_error = customer.errors.last
81
+ second_error.should be_kind_of(NetSuite::Error)
82
+ second_error.type.should eq('WARNING')
83
+ second_error.code.should eq('Second error code')
84
+ second_error.message.should eq('Second error message')
85
+
86
+ end
57
87
  end
88
+
58
89
  end
59
90
 
60
91
  end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Actions::UpsertList do
4
+ before { savon.mock! }
5
+ after { savon.unmock! }
6
+
7
+ context 'Customers' do
8
+ context 'one customer' do
9
+ let(:customers) do
10
+ [
11
+ NetSuite::Records::Customer.new(external_id: 'ext2', entity_id: 'Target', company_name: 'Target')
12
+ ]
13
+ end
14
+
15
+ before do
16
+ savon.expects(:upsert_list).with(:message =>
17
+ {
18
+ 'record' => [{
19
+ 'listRel:entityId' => 'Target',
20
+ 'listRel:companyName' => 'Target',
21
+ '@xsi:type' => 'listRel:Customer',
22
+ '@externalId' => 'ext2'
23
+ }]
24
+ }).returns(File.read('spec/support/fixtures/upsert_list/upsert_list_one_customer.xml'))
25
+ end
26
+
27
+ it 'makes a valid request to the NetSuite API' do
28
+ NetSuite::Actions::UpsertList.call(customers)
29
+ end
30
+
31
+ it 'returns a valid Response object' do
32
+ response = NetSuite::Actions::UpsertList.call(customers)
33
+ response.should be_kind_of(NetSuite::Response)
34
+ response.should be_success
35
+ end
36
+ end
37
+
38
+ context 'two customers' do
39
+ let(:customers) do
40
+ [
41
+ NetSuite::Records::Customer.new(external_id: 'ext1', entity_id: 'Shutter Fly', company_name: 'Shutter Fly, Inc.'),
42
+ NetSuite::Records::Customer.new(external_id: 'ext2', entity_id: 'Target', company_name: 'Target')
43
+ ]
44
+ end
45
+
46
+ before do
47
+ savon.expects(:upsert_list).with(:message =>
48
+ {
49
+ 'record' => [{
50
+ 'listRel:entityId' => 'Shutter Fly',
51
+ 'listRel:companyName' => 'Shutter Fly, Inc.',
52
+ '@xsi:type' => 'listRel:Customer',
53
+ '@externalId' => 'ext1'
54
+ },
55
+ {
56
+ 'listRel:entityId' => 'Target',
57
+ 'listRel:companyName' => 'Target',
58
+ '@xsi:type' => 'listRel:Customer',
59
+ '@externalId' => 'ext2'
60
+ }
61
+ ]
62
+ }).returns(File.read('spec/support/fixtures/upsert_list/upsert_list_customers.xml'))
63
+ end
64
+
65
+ it 'makes a valid request to the NetSuite API' do
66
+ NetSuite::Actions::UpsertList.call(customers)
67
+ end
68
+
69
+ it 'returns a valid Response object' do
70
+ response = NetSuite::Actions::UpsertList.call(customers)
71
+ response.should be_kind_of(NetSuite::Response)
72
+ response.should be_success
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'with errors' do
78
+ let(:customers) do
79
+ [
80
+ NetSuite::Records::Customer.new(external_id: 'ext1-bad', entity_id: 'Shutter Fly', company_name: 'Shutter Fly, Inc.'),
81
+ NetSuite::Records::Customer.new(external_id: 'ext2-bad', entity_id: 'Target', company_name: 'Target')
82
+ ]
83
+ end
84
+
85
+ before do
86
+ savon.expects(:upsert_list).with(:message =>
87
+ {
88
+ 'record' => [{
89
+ 'listRel:entityId' => 'Shutter Fly',
90
+ 'listRel:companyName' => 'Shutter Fly, Inc.',
91
+ '@xsi:type' => 'listRel:Customer',
92
+ '@externalId' => 'ext1-bad'
93
+ },
94
+ {
95
+ 'listRel:entityId' => 'Target',
96
+ 'listRel:companyName' => 'Target',
97
+ '@xsi:type' => 'listRel:Customer',
98
+ '@externalId' => 'ext2-bad'
99
+ }
100
+ ]
101
+ }).returns(File.read('spec/support/fixtures/upsert_list/upsert_list_with_errors.xml'))
102
+ end
103
+
104
+ it 'constructs error objects' do
105
+ response = NetSuite::Actions::UpsertList.call(customers)
106
+ expect(response.errors.keys).to match_array(['ext1', 'ext2'])
107
+ expect(response.errors['ext1'].first.code).to eq('USER_ERROR')
108
+ expect(response.errors['ext1'].first.message).to eq('Please enter value(s) for: Item')
109
+ expect(response.errors['ext1'].first.type).to eq('ERROR')
110
+ end
111
+ end
112
+ end
@@ -71,7 +71,7 @@ describe NetSuite::Records::Account do
71
71
  NetSuite::Actions::Add.should_receive(:call).
72
72
  with([account], {}).
73
73
  and_return(response)
74
- account.add.should be_true
74
+ account.add.should be_truthy
75
75
  end
76
76
  end
77
77
 
@@ -83,7 +83,7 @@ describe NetSuite::Records::Account do
83
83
  NetSuite::Actions::Add.should_receive(:call).
84
84
  with([account], {}).
85
85
  and_return(response)
86
- account.add.should be_false
86
+ account.add.should be_falsey
87
87
  end
88
88
  end
89
89
  end
@@ -99,7 +99,7 @@ describe NetSuite::Records::Account do
99
99
  NetSuite::Actions::Delete.should_receive(:call).
100
100
  with([account], {}).
101
101
  and_return(response)
102
- account.delete.should be_true
102
+ account.delete.should be_truthy
103
103
  end
104
104
  end
105
105
 
@@ -111,7 +111,7 @@ describe NetSuite::Records::Account do
111
111
  NetSuite::Actions::Delete.should_receive(:call).
112
112
  with([account], {}).
113
113
  and_return(response)
114
- account.delete.should be_false
114
+ account.delete.should be_falsey
115
115
  end
116
116
  end
117
117
  end
@@ -91,7 +91,7 @@ describe NetSuite::Records::AccountingPeriod do
91
91
  NetSuite::Actions::Add.should_receive(:call).
92
92
  with([accounting_period], {}).
93
93
  and_return(response)
94
- accounting_period.add.should be_true
94
+ accounting_period.add.should be_truthy
95
95
  end
96
96
  end
97
97
 
@@ -103,7 +103,7 @@ describe NetSuite::Records::AccountingPeriod do
103
103
  NetSuite::Actions::Add.should_receive(:call).
104
104
  with([accounting_period], {}).
105
105
  and_return(response)
106
- accounting_period.add.should be_false
106
+ accounting_period.add.should be_falsey
107
107
  end
108
108
  end
109
109
  end
@@ -119,7 +119,7 @@ describe NetSuite::Records::AccountingPeriod do
119
119
  NetSuite::Actions::Delete.should_receive(:call).
120
120
  with([accounting_period], {}).
121
121
  and_return(response)
122
- accounting_period.delete.should be_true
122
+ accounting_period.delete.should be_truthy
123
123
  end
124
124
  end
125
125
 
@@ -131,7 +131,7 @@ describe NetSuite::Records::AccountingPeriod do
131
131
  NetSuite::Actions::Delete.should_receive(:call).
132
132
  with([accounting_period], {}).
133
133
  and_return(response)
134
- accounting_period.delete.should be_false
134
+ accounting_period.delete.should be_falsey
135
135
  end
136
136
  end
137
137
  end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::AssemblyItem do
4
+ let(:item) { described_class.new }
5
+
6
+ describe '#member_list' do
7
+ it 'can be set from attributes' do
8
+ attributes = {
9
+ :item_member => [{
10
+ :item => { :internal_id => 1 },
11
+ :quantity => 20
12
+ }]
13
+ }
14
+ item.member_list = attributes
15
+ item.member_list.should be_kind_of(NetSuite::Records::MemberList)
16
+ item.member_list.item_member.length.should eql(1)
17
+
18
+ expect(item.member_list.item_member.first.item.internal_id).to eq(1)
19
+ expect(item.member_list.item_member.first.quantity).to eq(20)
20
+ end
21
+ end
22
+
23
+ describe '#subsidiary_list' do
24
+ it 'creates record refs from attributes' do
25
+ item = described_class.new({
26
+ subsidiary_list: {
27
+ record_ref: [
28
+ { internal_id: 1 },
29
+ { internal_id: 2 },
30
+ ]
31
+ }
32
+ })
33
+
34
+ expect(item.subsidiary_list.record_ref[0].internal_id).to eq(1)
35
+ expect(item.subsidiary_list.record_ref[1].internal_id).to eq(2)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::BillingScheduleMilestoneList do
4
+ let(:list) { NetSuite::Records::BillingScheduleMilestoneList.new }
5
+ let(:milestone) { NetSuite::Records::BillingScheduleMilestone.new }
6
+
7
+ it 'can have milestones be added to it' do
8
+ list.milestones << milestone
9
+ milestone_list = list.milestones
10
+ milestone_list.should be_kind_of(Array)
11
+ milestone_list.length.should eql(1)
12
+ milestone_list.each { |i| i.should be_kind_of(NetSuite::Records::BillingScheduleMilestone) }
13
+ end
14
+
15
+ describe '#to_record' do
16
+ it 'can represent itself as a SOAP record' do
17
+ record = {
18
+ 'listAcct:billingScheduleMilestone' => []
19
+ }
20
+ list.to_record.should eql(record)
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::BillingScheduleMilestone do
4
+ let(:milestone) { NetSuite::Records::BillingScheduleMilestone.new }
5
+
6
+ it 'has the right fields' do
7
+ [
8
+ :comments, :milestone_actual_completion_date, :milestone_amount,
9
+ :milestone_completed, :milestone_date, :milestone_id
10
+ ].each do |field|
11
+ milestone.should have_field(field)
12
+ end
13
+ end
14
+
15
+ it 'has the right record_refs' do
16
+ [
17
+ :milestone_term, :project_task
18
+ ].each do |record_ref|
19
+ milestone.should have_record_ref(record_ref)
20
+ end
21
+ end
22
+
23
+ it 'can initialize from a record' do
24
+ record = NetSuite::Records::BillingScheduleMilestone.new(:comments => "foo")
25
+ milestone = NetSuite::Records::BillingScheduleMilestone.new(record)
26
+ milestone.should be_kind_of(NetSuite::Records::BillingScheduleMilestone)
27
+ milestone.comments.should eql("foo")
28
+ end
29
+
30
+ describe '#to_record' do
31
+ before do
32
+ milestone.comments = 'comment'
33
+ milestone.milestone_amount = 1
34
+ end
35
+
36
+ it 'can represent itself as a SOAP record' do
37
+ record = {
38
+ 'listAcct:comments' => 'comment',
39
+ 'listAcct:milestoneAmount' => 1
40
+ }
41
+ milestone.to_record.should eql(record)
42
+ end
43
+ end
44
+
45
+ describe '#record_type' do
46
+ it 'returns a string of the SOAP record type' do
47
+ milestone.record_type.should eql('listAcct:BillingScheduleMilestone')
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::BillingScheduleRecurrenceList do
4
+ let(:list) { NetSuite::Records::BillingScheduleRecurrenceList.new }
5
+ let(:recurrence) { NetSuite::Records::BillingScheduleRecurrence.new }
6
+
7
+ it 'can have recurrences be added to it' do
8
+ list.recurrences << recurrence
9
+ recurrence_list = list.recurrences
10
+ recurrence_list.should be_kind_of(Array)
11
+ recurrence_list.length.should eql(1)
12
+ recurrence_list.each { |i| i.should be_kind_of(NetSuite::Records::BillingScheduleRecurrence) }
13
+ end
14
+
15
+ describe '#to_record' do
16
+ it 'can represent itself as a SOAP record' do
17
+ record = {
18
+ 'listAcct:billingScheduleRecurrence' => []
19
+ }
20
+ list.to_record.should eql(record)
21
+ end
22
+ end
23
+
24
+ end