netsuite 0.8.12 → 0.9.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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codeql-analysis.yml +3 -3
  3. data/HISTORY.md +21 -1
  4. data/lib/netsuite/actions/add.rb +2 -1
  5. data/lib/netsuite/actions/delete.rb +17 -0
  6. data/lib/netsuite/configuration.rb +16 -3
  7. data/lib/netsuite/records/assembly_item.rb +2 -1
  8. data/lib/netsuite/records/customer.rb +225 -23
  9. data/lib/netsuite/records/customer_refund.rb +1 -1
  10. data/lib/netsuite/records/description_item.rb +1 -1
  11. data/lib/netsuite/records/discount_item.rb +1 -1
  12. data/lib/netsuite/records/file.rb +1 -1
  13. data/lib/netsuite/records/gift_certificate_item.rb +1 -1
  14. data/lib/netsuite/records/item_availability.rb +46 -0
  15. data/lib/netsuite/records/item_fulfillment.rb +4 -1
  16. data/lib/netsuite/records/item_fulfillment_package_fed_ex.rb +28 -0
  17. data/lib/netsuite/records/item_fulfillment_package_fed_ex_list.rb +32 -0
  18. data/lib/netsuite/records/item_fulfillment_package_ups.rb +27 -0
  19. data/lib/netsuite/records/item_fulfillment_package_ups_list.rb +32 -0
  20. data/lib/netsuite/records/item_fulfillment_package_usps.rb +26 -0
  21. data/lib/netsuite/records/item_fulfillment_package_usps_list.rb +32 -0
  22. data/lib/netsuite/records/item_group.rb +1 -1
  23. data/lib/netsuite/records/kit_item.rb +1 -1
  24. data/lib/netsuite/records/lot_numbered_assembly_item.rb +1 -1
  25. data/lib/netsuite/records/non_inventory_purchase_item.rb +1 -1
  26. data/lib/netsuite/records/non_inventory_resale_item.rb +1 -1
  27. data/lib/netsuite/records/non_inventory_sale_item.rb +1 -1
  28. data/lib/netsuite/records/other_charge_sale_item.rb +1 -1
  29. data/lib/netsuite/records/payment_item.rb +1 -1
  30. data/lib/netsuite/records/sales_order.rb +1 -0
  31. data/lib/netsuite/records/sales_order_item.rb +2 -1
  32. data/lib/netsuite/records/serialized_assembly_item.rb +1 -1
  33. data/lib/netsuite/records/serialized_inventory_item.rb +1 -1
  34. data/lib/netsuite/records/service_resale_item.rb +1 -1
  35. data/lib/netsuite/records/service_sale_item.rb +1 -1
  36. data/lib/netsuite/records/{customer_subscription.rb → subscription.rb} +1 -1
  37. data/lib/netsuite/records/subscriptions_list.rb +10 -0
  38. data/lib/netsuite/records/subtotal_item.rb +1 -1
  39. data/lib/netsuite/support/sublist.rb +1 -1
  40. data/lib/netsuite/utilities.rb +20 -13
  41. data/lib/netsuite/version.rb +1 -1
  42. data/lib/netsuite.rb +9 -2
  43. data/netsuite.gemspec +3 -0
  44. data/spec/netsuite/actions/add_spec.rb +4 -2
  45. data/spec/netsuite/actions/delete_spec.rb +74 -14
  46. data/spec/netsuite/actions/get_select_value_spec.rb +43 -0
  47. data/spec/netsuite/configuration_spec.rb +35 -0
  48. data/spec/netsuite/records/customer_spec.rb +287 -20
  49. data/spec/netsuite/records/item_availability_spec.rb +59 -0
  50. data/spec/netsuite/records/item_fulfillment_package_fed_ex_list_spec.rb +27 -0
  51. data/spec/netsuite/records/item_fulfillment_package_ups_list_spec.rb +27 -0
  52. data/spec/netsuite/records/item_fulfillment_package_usps_list_spec.rb +27 -0
  53. data/spec/netsuite/records/sales_order_item_spec.rb +4 -3
  54. data/spec/netsuite/records/sales_order_spec.rb +17 -0
  55. data/spec/netsuite/records/{customer_subscription_spec.rb → subscription_spec.rb} +2 -2
  56. data/spec/netsuite/records/{customer_subscriptions_list_spec.rb → subscriptions_list_spec.rb} +2 -2
  57. data/spec/support/fixtures/add/add_invoice.xml +9 -5
  58. data/spec/support/fixtures/delete/delete_customer_error.xml +21 -0
  59. data/spec/support/fixtures/delete/delete_customer_multiple_errors.xml +25 -0
  60. data/spec/support/fixtures/get_item_availability/get_item_availability.xml +46 -0
  61. data/spec/support/fixtures/get_select_value/empty_result.xml +22 -0
  62. data/spec/support/fixtures/get_select_value/item_fulfillment_ship_method.xml +43 -0
  63. metadata +39 -10
  64. data/lib/netsuite/records/customer_subscriptions_list.rb +0 -10
@@ -0,0 +1,32 @@
1
+ module NetSuite
2
+ module Records
3
+ class ItemFulfillmentPackageUpsList
4
+ include Support::Fields
5
+ include Support::Records
6
+ include Namespaces::TranSales
7
+
8
+ fields :package_ups
9
+
10
+ def initialize(attributes = {})
11
+ initialize_from_attributes_hash(attributes)
12
+ end
13
+
14
+ def package_ups=(packages)
15
+ case packages
16
+ when Hash
17
+ self.packages << ItemFulfillmentPackageUps.new(packages)
18
+ when Array
19
+ packages.each { |package| self.packages << ItemFulfillmentPackageUps.new(package) }
20
+ end
21
+ end
22
+
23
+ def packages
24
+ @packages ||= []
25
+ end
26
+
27
+ def to_record
28
+ { "#{record_namespace}:packageUps" => packages.map(&:to_record) }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ module NetSuite
2
+ module Records
3
+ class ItemFulfillmentPackageUsps
4
+ include Support::Fields
5
+ include Support::Records
6
+ include Namespaces::TranSales
7
+
8
+ fields :insured_value_usps, :package_descr_usps, :package_height_usps, :package_length_usps,
9
+ :package_tracking_number_usps, :package_weight_usps, :package_width_usps, :reference1_usps, :reference2_usps, :use_insured_value_usps
10
+
11
+
12
+ def initialize(attributes_or_record = {})
13
+ case attributes_or_record
14
+ when Hash
15
+ initialize_from_attributes_hash(attributes_or_record)
16
+ when self.class
17
+ initialize_from_record(attributes_or_record)
18
+ end
19
+ end
20
+
21
+ def initialize_from_record(record)
22
+ self.attributes = record.send(:attributes)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ module NetSuite
2
+ module Records
3
+ class ItemFulfillmentPackageUspsList
4
+ include Support::Fields
5
+ include Support::Records
6
+ include Namespaces::TranSales
7
+
8
+ fields :package_usps
9
+
10
+ def initialize(attributes = {})
11
+ initialize_from_attributes_hash(attributes)
12
+ end
13
+
14
+ def package_usps=(packages)
15
+ case packages
16
+ when Hash
17
+ self.packages << ItemFulfillmentPackageUsps.new(packages)
18
+ when Array
19
+ packages.each { |package| self.packages << ItemFulfillmentPackageUsps.new(package) }
20
+ end
21
+ end
22
+
23
+ def packages
24
+ @packages ||= []
25
+ end
26
+
27
+ def to_record
28
+ { "#{record_namespace}:packageUsps" => packages.map(&:to_record) }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  fields :available_to_partners, :created_date, :description, :display_name, :include_children, :include_start_end_lines,
13
13
  :is_inactive, :is_vsoe_bundle, :item_id, :last_modified_date, :print_items, :upc_code, :vendor_name
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  fields :available_to_partners, :cost_estimate, :created_date, :defer_rev_rec, :description, :display_name,
13
13
  :dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap, :featured_description, :handling_cost,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :get_select_value, :add, :delete, :update, :upsert, :upsert_list, :search
10
+ actions :get, :get_deleted, :get_list, :get_select_value, :add, :delete, :update, :update_list, :upsert, :upsert_list, :search
11
11
 
12
12
  fields :auto_lead_time, :auto_preferred_stock_level, :auto_reorder_point, :available_to_partners, :average_cost, :build_entire_assembly,
13
13
  :copy_description, :cost, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :cost_units, :costing_method,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update_list, :upsert
11
11
 
12
12
  fields :available_to_partners, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :country_of_manufacture,
13
13
  :created_date, :display_name, :dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :upsert, :update
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :upsert, :update, :update_list
11
11
 
12
12
  fields :amortization_period,
13
13
  :available_to_partners,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  fields :available_to_partners,
13
13
  :contingent_revenue_handling,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :update, :delete, :upsert, :search
10
+ actions :get, :get_deleted, :get_list, :add, :update, :update_list, :delete, :upsert, :search
11
11
 
12
12
  attr_reader :internal_id
13
13
  attr_accessor :external_id
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  fields :available_to_partners, :created_date, :description, :display_name, :include_children, :is_inactive, :item_id, :last_modified_date, :undep_funds
13
13
 
@@ -33,6 +33,7 @@ module NetSuite
33
33
  field :gift_cert_redemption_list, GiftCertRedemptionList
34
34
  field :ship_group_list, SalesOrderShipGroupList
35
35
  field :promotions_list, PromotionsList
36
+ field :null_field_list, NullFieldList
36
37
 
37
38
  read_only_fields :applied, :discount_total, :sub_total, :tax_total, :total, :unapplied,
38
39
  :est_gross_profit_percent
@@ -17,7 +17,8 @@ module NetSuite
17
17
  :rev_rec_start_date, :rev_rec_term_in_months, :serial_numbers,
18
18
  :shipping_cost, :tax1_amt, :tax_rate1, :tax_rate2,
19
19
  :vsoe_allocation, :vsoe_amount, :vsoe_deferral,
20
- :vsoe_delivered, :vsoe_permit_discount, :vsoe_price
20
+ :vsoe_delivered, :vsoe_permit_discount, :vsoe_price,
21
+ :ship_group
21
22
 
22
23
  field :custom_field_list, CustomFieldList
23
24
 
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  fields :alternate_demand_source_item,
13
13
  :asset_account,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  record_refs :soft_descriptor,
13
13
  :stock_unit,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :update, :delete, :upsert, :search
10
+ actions :get, :get_deleted, :get_list, :add, :update, :update_list, :delete, :upsert, :search
11
11
 
12
12
  fields :amortization_period,
13
13
  :available_to_partners,
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :update, :delete, :upsert, :search
10
+ actions :get, :get_deleted, :get_list, :add, :update, :update_list, :delete, :upsert, :search
11
11
 
12
12
  fields :available_to_partners, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :create_job, :created_date,
13
13
  :display_name, :dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap, :featured_description,
@@ -1,6 +1,6 @@
1
1
  module NetSuite
2
2
  module Records
3
- class CustomerSubscription
3
+ class Subscription
4
4
  include Support::Fields
5
5
  include Support::Records
6
6
  include Support::RecordRefs
@@ -0,0 +1,10 @@
1
+ module NetSuite
2
+ module Records
3
+ class SubscriptionsList < Support::Sublist
4
+ include Namespaces::ListRel
5
+
6
+ sublist :subscriptions, Subscription
7
+
8
+ end
9
+ end
10
+ end
@@ -7,7 +7,7 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::ListAcct
9
9
 
10
- actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
10
+ actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
11
11
 
12
12
  fields :available_to_partners, :created_date, :description, :include_children, :is_inactive, :item_id, :last_modified_date
13
13
 
@@ -31,7 +31,7 @@ module NetSuite
31
31
  end
32
32
 
33
33
  def initialize(attributes = {})
34
- initialize_from_attributes_hash(attributes)
34
+ initialize_from_attributes_hash(attributes || {})
35
35
  end
36
36
 
37
37
  def to_record
@@ -7,11 +7,20 @@ module NetSuite
7
7
  # TODO need structured logger for various statements
8
8
 
9
9
  def clear_cache!
10
- @netsuite_get_record_cache = {}
11
- @netsuite_find_record_cache = {}
10
+ Thread.current[:netsuite_gem_netsuite_get_record_cache] = {}
11
+ Thread.current[:netsuite_gem_netsuite_find_record_cache] = {}
12
+
12
13
  DataCenter.clear_cache!
13
14
  end
14
15
 
16
+ def netsuite_get_record_cache
17
+ Thread.current[:netsuite_gem_netsuite_get_record_cache] ||= {}
18
+ end
19
+
20
+ def netsuite_find_record_cache
21
+ Thread.current[:netsuite_gem_netsuite_find_record_cache] ||= {}
22
+ end
23
+
15
24
  def append_memo(ns_record, added_memo, opts = {})
16
25
  opts[:skip_if_exists] ||= false
17
26
 
@@ -177,6 +186,7 @@ module NetSuite
177
186
  ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ServiceResaleItem, ns_item_internal_id, opts)
178
187
  ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::GiftCertificateItem, ns_item_internal_id, opts)
179
188
  ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::KitItem, ns_item_internal_id, opts)
189
+ ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ItemGroup, ns_item_internal_id, opts)
180
190
  ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedInventoryItem, ns_item_internal_id, opts)
181
191
  ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedAssemblyItem, ns_item_internal_id, opts)
182
192
  ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::LotNumberedAssemblyItem, ns_item_internal_id, opts)
@@ -193,11 +203,10 @@ module NetSuite
193
203
  opts[:external_id] ||= false
194
204
 
195
205
  if opts[:cache]
196
- @netsuite_get_record_cache ||= {}
197
- @netsuite_get_record_cache[record_klass.to_s] ||= {}
206
+ netsuite_get_record_cache[record_klass.to_s] ||= {}
198
207
 
199
- if @netsuite_get_record_cache[record_klass.to_s].has_key?(id.to_i)
200
- return @netsuite_get_record_cache[record_klass.to_s][id.to_i]
208
+ if netsuite_get_record_cache[record_klass.to_s].has_key?(id.to_i)
209
+ return netsuite_get_record_cache[record_klass.to_s][id.to_i]
201
210
  end
202
211
  end
203
212
 
@@ -211,14 +220,14 @@ module NetSuite
211
220
  end
212
221
 
213
222
  if opts[:cache]
214
- @netsuite_get_record_cache[record_klass.to_s][id.to_i] = ns_record
223
+ netsuite_get_record_cache[record_klass.to_s][id.to_i] = ns_record
215
224
  end
216
225
 
217
226
  return ns_record
218
227
  rescue ::NetSuite::RecordNotFound
219
228
  # log.warn("record not found", ns_record_type: record_klass.name, ns_record_id: id)
220
229
  if opts[:cache]
221
- @netsuite_get_record_cache[record_klass.to_s][id.to_i] = nil
230
+ netsuite_get_record_cache[record_klass.to_s][id.to_i] = nil
222
231
  end
223
232
 
224
233
  return nil
@@ -233,10 +242,8 @@ module NetSuite
233
242
  # FIXME: Records that have the same name but different types will break
234
243
  # the cache
235
244
  names.each do |name|
236
- @netsuite_find_record_cache ||= {}
237
-
238
- if @netsuite_find_record_cache.has_key?(name)
239
- return @netsuite_find_record_cache[name]
245
+ if netsuite_find_record_cache.has_key?(name)
246
+ return netsuite_find_record_cache[name]
240
247
  end
241
248
 
242
249
  # sniff for an email-like input; useful for employee/customer searches
@@ -262,7 +269,7 @@ module NetSuite
262
269
  }) }
263
270
 
264
271
  if search.results.first
265
- return @netsuite_find_record_cache[name] = search.results.first
272
+ return netsuite_find_record_cache[name] = search.results.first
266
273
  end
267
274
  end
268
275
 
@@ -1,3 +1,3 @@
1
1
  module NetSuite
2
- VERSION = '0.8.12'
2
+ VERSION = '0.9.0'
3
3
  end
data/lib/netsuite.rb CHANGED
@@ -133,8 +133,6 @@ module NetSuite
133
133
  autoload :CustomerRefundApplyList, 'netsuite/records/customer_refund_apply_list'
134
134
  autoload :CustomerRefundDeposit, 'netsuite/records/customer_refund_deposit'
135
135
  autoload :CustomerRefundDepositList, 'netsuite/records/customer_refund_deposit_list'
136
- autoload :CustomerSubscription, 'netsuite/records/customer_subscription'
137
- autoload :CustomerSubscriptionsList, 'netsuite/records/customer_subscriptions_list'
138
136
  autoload :CustomerStatus, 'netsuite/records/customer_status'
139
137
  autoload :CustomerPartner, 'netsuite/records/customer_partner'
140
138
  autoload :CustomerSalesTeam, 'netsuite/records/customer_sales_team'
@@ -193,11 +191,18 @@ module NetSuite
193
191
  autoload :Invoice, 'netsuite/records/invoice'
194
192
  autoload :InvoiceItem, 'netsuite/records/invoice_item'
195
193
  autoload :InvoiceItemList, 'netsuite/records/invoice_item_list'
194
+ autoload :ItemAvailability, 'netsuite/records/item_availability'
196
195
  autoload :ItemFulfillment, 'netsuite/records/item_fulfillment'
197
196
  autoload :ItemFulfillmentItem, 'netsuite/records/item_fulfillment_item'
198
197
  autoload :ItemFulfillmentItemList, 'netsuite/records/item_fulfillment_item_list'
199
198
  autoload :ItemFulfillmentPackage, 'netsuite/records/item_fulfillment_package'
200
199
  autoload :ItemFulfillmentPackageList, 'netsuite/records/item_fulfillment_package_list'
200
+ autoload :ItemFulfillmentPackageFedEx, 'netsuite/records/item_fulfillment_package_fed_ex'
201
+ autoload :ItemFulfillmentPackageUps, 'netsuite/records/item_fulfillment_package_ups'
202
+ autoload :ItemFulfillmentPackageUsps, 'netsuite/records/item_fulfillment_package_usps'
203
+ autoload :ItemFulfillmentPackageFedExList, 'netsuite/records/item_fulfillment_package_fed_ex_list'
204
+ autoload :ItemFulfillmentPackageUpsList, 'netsuite/records/item_fulfillment_package_ups_list'
205
+ autoload :ItemFulfillmentPackageUspsList, 'netsuite/records/item_fulfillment_package_usps_list'
201
206
  autoload :ItemGroup, 'netsuite/records/item_group'
202
207
  autoload :ItemMember, 'netsuite/records/item_member'
203
208
  autoload :ItemMemberList, 'netsuite/records/item_member_list'
@@ -271,6 +276,8 @@ module NetSuite
271
276
  autoload :SerializedInventoryItemLocationsList, 'netsuite/records/serialized_inventory_item_locations_list'
272
277
  autoload :ShipAddress, 'netsuite/records/ship_address'
273
278
  autoload :SiteCategory, 'netsuite/records/site_category'
279
+ autoload :Subscription, 'netsuite/records/subscription'
280
+ autoload :SubscriptionsList, 'netsuite/records/subscriptions_list'
274
281
  autoload :Subsidiary, 'netsuite/records/subsidiary'
275
282
  autoload :SubtotalItem, 'netsuite/records/subtotal_item'
276
283
  autoload :SupportCase, 'netsuite/records/support_case'
data/netsuite.gemspec CHANGED
@@ -15,7 +15,10 @@ Gem::Specification.new do |gem|
15
15
  gem.name = 'netsuite'
16
16
  gem.require_paths = ['lib']
17
17
  gem.version = NetSuite::VERSION
18
+ gem.required_ruby_version = '>= 2.1'
18
19
  gem.metadata['changelog_uri'] = 'https://github.com/netsweet/netsuite/blob/master/HISTORY.md'
20
+ gem.metadata['mailing_list_uri'] = 'http://opensuite-slackin.herokuapp.com'
21
+ gem.metadata['rubygems_mfa_required'] = 'true'
19
22
 
20
23
  gem.add_dependency 'savon', '>= 2.3.0'
21
24
 
@@ -53,10 +53,11 @@ describe NetSuite::Actions::Add do
53
53
  NetSuite::Actions::Add.call([invoice])
54
54
  end
55
55
 
56
- it 'returns a valid Response object' do
56
+ it 'returns a valid Response object with no errors' do
57
57
  response = NetSuite::Actions::Add.call([invoice])
58
58
  expect(response).to be_kind_of(NetSuite::Response)
59
59
  expect(response).to be_success
60
+ expect(response.errors).to be_empty
60
61
  end
61
62
  end
62
63
 
@@ -136,10 +137,11 @@ describe NetSuite::Actions::Add do
136
137
  NetSuite::Actions::Add.call([file])
137
138
  end
138
139
 
139
- it 'returns a valid Response object' do
140
+ it 'returns a valid Response object with no errors' do
140
141
  response = NetSuite::Actions::Add.call([file])
141
142
  expect(response).to be_kind_of(NetSuite::Response)
142
143
  expect(response).to be_success
144
+ expect(response.errors).to be_empty
143
145
  end
144
146
 
145
147
  it 'properly extracts internal ID from response' do
@@ -9,24 +9,84 @@ describe NetSuite::Actions::Delete do
9
9
  NetSuite::Records::Customer.new(:internal_id => '980', :entity_id => 'Shutter Fly', :company_name => 'Shutter Fly, Inc.')
10
10
  end
11
11
 
12
- before do
13
- savon.expects(:delete).with(:message => {
14
- 'platformMsgs:baseRef' => {
15
- '@internalId' => '980',
16
- '@type' => 'customer',
17
- '@xsi:type' => 'platformCore:RecordRef'
18
- },
19
- }).returns(File.read('spec/support/fixtures/delete/delete_customer.xml'))
12
+ context 'when successful' do
13
+ before do
14
+ savon.expects(:delete).with(:message => {
15
+ 'platformMsgs:baseRef' => {
16
+ '@internalId' => '980',
17
+ '@type' => 'customer',
18
+ '@xsi:type' => 'platformCore:RecordRef'
19
+ },
20
+ }).returns(File.read('spec/support/fixtures/delete/delete_customer.xml'))
21
+ end
22
+
23
+ it 'makes a valid request to the NetSuite API' do
24
+ NetSuite::Actions::Delete.call([customer])
25
+ end
26
+
27
+ it 'returns a valid Response object' do
28
+ response = NetSuite::Actions::Delete.call([customer])
29
+ expect(response).to be_kind_of(NetSuite::Response)
30
+ expect(response).to be_success
31
+ end
20
32
  end
21
33
 
22
- it 'makes a valid request to the NetSuite API' do
23
- NetSuite::Actions::Delete.call([customer])
34
+ context 'when not successful' do
35
+ before do
36
+ savon.expects(:delete).with(:message => {
37
+ 'platformMsgs:baseRef' => {
38
+ '@xsi:type' => 'platformCore:RecordRef',
39
+ '@internalId' => '980',
40
+ '@type' => 'customer',
41
+ },
42
+ }).returns(File.read('spec/support/fixtures/delete/delete_customer_error.xml'))
43
+ end
44
+
45
+ it 'provides an error method on the object with details about the error' do
46
+ customer.delete
47
+ error = customer.errors.first
48
+
49
+ expect(error).to be_kind_of(NetSuite::Error)
50
+ expect(error.type).to eq('ERROR')
51
+ expect(error.code).to eq('INSUFFICIENT_PERMISSION')
52
+ expect(error.message).to eq("Permission Violation: You need a higher level of the 'Lists -> Documents and Files' permission to access this page. Please contact your account administrator.")
53
+ end
54
+
55
+ it 'provides an error method on the response' do
56
+ response = NetSuite::Actions::Delete.call([customer])
57
+ expect(response.errors.first).to be_kind_of(NetSuite::Error)
58
+ end
24
59
  end
25
60
 
26
- it 'returns a valid Response object' do
27
- response = NetSuite::Actions::Delete.call([customer])
28
- expect(response).to be_kind_of(NetSuite::Response)
29
- expect(response).to be_success
61
+ context 'when not successful with multiple errors' do
62
+ before do
63
+ savon.expects(:delete).with(:message => {
64
+ 'platformMsgs:baseRef' => {
65
+ '@xsi:type' => 'platformCore:RecordRef',
66
+ '@internalId' => '980',
67
+ '@type' => 'customer',
68
+ },
69
+ }).returns(File.read('spec/support/fixtures/delete/delete_customer_multiple_errors.xml'))
70
+ end
71
+
72
+ it 'provides an error method on the object with details about the error' do
73
+ customer.delete
74
+ expect(customer.errors.length).to eq(2)
75
+
76
+ error = customer.errors.first
77
+
78
+ expect(error).to be_kind_of(NetSuite::Error)
79
+ expect(error.type).to eq('ERROR')
80
+ expect(error.code).to eq('INSUFFICIENT_PERMISSION')
81
+ expect(error.message).to eq("Permission Violation: You need a higher level of the 'Lists -> Documents and Files' permission to access this page. Please contact your account administrator.")
82
+
83
+ error = customer.errors[1]
84
+
85
+ expect(error).to be_kind_of(NetSuite::Error)
86
+ expect(error.type).to eq('ERROR')
87
+ expect(error.code).to eq('SOMETHING_ELSE')
88
+ expect(error.message).to eq('Another error.')
89
+ end
30
90
  end
31
91
  end
32
92
 
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Actions::GetSelectValue do
4
+ before(:all) { savon.mock! }
5
+ after(:all) { savon.unmock! }
6
+
7
+ describe 'fulfillment ship method' do
8
+ subject do
9
+ NetSuite::Records::BaseRefList.get_select_value(recordType: 'itemFulfillment', field: 'shipMethod')
10
+ end
11
+
12
+ let(:response) { File.read('spec/support/fixtures/get_select_value/item_fulfillment_ship_method.xml') }
13
+
14
+ before do
15
+ savon.expects(:get_select_value).with(:message => {
16
+ pageIndex: 1,
17
+ fieldDescription: {
18
+ 'platformCore:recordType' => 'itemFulfillment',
19
+ 'platformCore:field' => 'shipMethod'
20
+ }
21
+ }).returns(response)
22
+ end
23
+
24
+ it 'makes a valid request to the NetSuite API' do
25
+ subject
26
+ end
27
+
28
+ it 'returns a BaseRefList object' do
29
+ expect(subject).to be_kind_of(NetSuite::Records::BaseRefList)
30
+ expect(subject.base_refs[0].internal_id).to eq('94')
31
+ expect(subject.base_refs[0].name).to eq('Ground (Custom)')
32
+ end
33
+
34
+ context 'with empty result' do
35
+ let(:response) { File.read('spec/support/fixtures/get_select_value/empty_result.xml') }
36
+
37
+ it 'returns an empty list' do
38
+ expect(subject).to be_kind_of(NetSuite::Records::BaseRefList)
39
+ expect(subject.base_refs).to be_empty
40
+ end
41
+ end
42
+ end
43
+ end
@@ -14,6 +14,20 @@ describe NetSuite::Configuration do
14
14
  config.reset!
15
15
  expect(config.attributes).to be_empty
16
16
  end
17
+
18
+ it 'ensures that attributes are not shared between threads' do
19
+ config.attributes[:blah] = 'something'
20
+ expect(config.attributes[:blah]).to eq('something')
21
+
22
+ thread = Thread.new {
23
+ config.attributes[:blah] = 'something_else'
24
+ expect(config.attributes[:blah]).to eq('something_else')
25
+ }
26
+
27
+ thread.join
28
+
29
+ expect(config.attributes[:blah]).to eq('something')
30
+ end
17
31
  end
18
32
 
19
33
  describe '#filters' do
@@ -476,4 +490,25 @@ describe NetSuite::Configuration do
476
490
  end
477
491
  end
478
492
 
493
+ describe '#proxy' do
494
+ it 'defaults to nil' do
495
+ expect(config.proxy).to be_nil
496
+ end
497
+
498
+ it 'can be set with proxy=' do
499
+ config.proxy = "https://my-proxy"
500
+
501
+ expect(config.proxy).to eql("https://my-proxy")
502
+
503
+ # ensure no exception is raised
504
+ config.connection
505
+ end
506
+
507
+ it 'can be set with proxy(value)' do
508
+ config.proxy("https://my-proxy")
509
+
510
+ expect(config.proxy).to eql("https://my-proxy")
511
+ end
512
+ end
513
+
479
514
  end