netsuite 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/lib/netsuite.rb +17 -6
  2. data/lib/netsuite/actions/add.rb +7 -4
  3. data/lib/netsuite/actions/get.rb +1 -1
  4. data/lib/netsuite/actions/initialize.rb +1 -1
  5. data/lib/netsuite/namespaces/list_acct.rb +11 -0
  6. data/lib/netsuite/namespaces/list_rel.rb +11 -0
  7. data/lib/netsuite/namespaces/platform_common.rb +11 -0
  8. data/lib/netsuite/namespaces/platform_core.rb +11 -0
  9. data/lib/netsuite/namespaces/tran_sales.rb +11 -0
  10. data/lib/netsuite/records/bill_address.rb +3 -1
  11. data/lib/netsuite/records/classification.rb +27 -0
  12. data/lib/netsuite/records/customer.rb +4 -3
  13. data/lib/netsuite/records/customer_addressbook_list.rb +3 -2
  14. data/lib/netsuite/records/invoice.rb +18 -15
  15. data/lib/netsuite/records/invoice_item.rb +34 -0
  16. data/lib/netsuite/records/invoice_item_list.rb +11 -12
  17. data/lib/netsuite/records/non_inventory_sale_item.rb +4 -2
  18. data/lib/netsuite/records/record_ref.rb +8 -2
  19. data/lib/netsuite/records/ship_address.rb +3 -1
  20. data/lib/netsuite/support/attributes.rb +22 -0
  21. data/lib/netsuite/support/fields.rb +54 -0
  22. data/lib/netsuite/support/record_refs.rb +33 -0
  23. data/lib/netsuite/support/records.rb +40 -0
  24. data/lib/netsuite/{savon_support.rb → support/requests.rb} +2 -2
  25. data/lib/netsuite/version.rb +1 -1
  26. data/spec/netsuite/records/bill_address_spec.rb +37 -0
  27. data/spec/netsuite/records/classification_spec.rb +37 -0
  28. data/spec/netsuite/records/customer_addressbook_list_spec.rb +53 -28
  29. data/spec/netsuite/records/invoice_item_list_spec.rb +13 -13
  30. data/spec/netsuite/records/invoice_item_spec.rb +58 -0
  31. data/spec/netsuite/records/invoice_spec.rb +33 -83
  32. data/spec/netsuite/records/non_inventory_sale_item_spec.rb +21 -0
  33. data/spec/netsuite/records/record_ref_spec.rb +26 -0
  34. data/spec/netsuite/records/ship_address_spec.rb +21 -0
  35. data/spec/netsuite/support/attributes_spec.rb +5 -0
  36. data/spec/netsuite/support/fields_spec.rb +60 -0
  37. data/spec/netsuite/support/record_refs_spec.rb +5 -0
  38. data/spec/netsuite/{record_support_spec.rb → support/records_spec.rb} +6 -5
  39. data/spec/netsuite/{savon_support_spec.rb → support/requests_spec.rb} +2 -2
  40. data/spec/support/read_only_field_matcher.rb +7 -0
  41. metadata +32 -19
  42. data/lib/netsuite/attribute_support.rb +0 -16
  43. data/lib/netsuite/field_support.rb +0 -36
  44. data/lib/netsuite/record_ref_support.rb +0 -31
  45. data/lib/netsuite/record_support.rb +0 -17
  46. data/spec/netsuite/attribute_support_spec.rb +0 -5
  47. data/spec/netsuite/field_support_spec.rb +0 -34
  48. data/spec/netsuite/record_ref_support_spec.rb +0 -5
@@ -0,0 +1,33 @@
1
+ module NetSuite
2
+ module Support
3
+ module RecordRefs
4
+
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def record_refs(*names)
12
+ names.each do |name|
13
+ record_ref name
14
+ end
15
+ end
16
+
17
+ def record_ref(name)
18
+ name_sym = name.to_sym
19
+ fields << name_sym
20
+ define_method "#{name}=" do |attrs|
21
+ attributes[name_sym] = NetSuite::Records::RecordRef.new(attrs)
22
+ end
23
+
24
+ define_method name_sym do
25
+ attributes[name_sym]
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ module NetSuite
2
+ module Support
3
+ module Records
4
+ include Attributes
5
+ include Namespaces::PlatformCore
6
+
7
+ def to_record
8
+ attributes.reject { |k,v| self.class.read_only_fields.include?(k) }.inject({}) do |hash, (k,v)|
9
+ kname = if k == :klass
10
+ "#{record_namespace}:class"
11
+ else
12
+ "#{record_namespace}:#{k.to_s.lower_camelcase}"
13
+ end
14
+ if v.respond_to?(:internal_id) && v.internal_id
15
+ hash[:attributes!] ||= {}
16
+ hash[:attributes!][kname] ||= {}
17
+ hash[:attributes!][kname]['internalId'] = v.internal_id
18
+ end
19
+ if v.kind_of?(NetSuite::Records::RecordRef) && v.type
20
+ hash[:attributes!] ||= {}
21
+ hash[:attributes!][kname] ||= {}
22
+ hash[:attributes!][kname]['type'] = v.type.lower_camelcase
23
+ end
24
+ if Array === v
25
+ v = v.map { |i| i.respond_to?(:to_record) ? i.to_record : i }
26
+ else
27
+ v = v.to_record if v.respond_to?(:to_record)
28
+ end
29
+ hash[kname] = v
30
+ hash
31
+ end
32
+ end
33
+
34
+ def record_type
35
+ "#{record_namespace}:#{self.class.to_s.split('::').last}"
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -1,6 +1,6 @@
1
1
  module NetSuite
2
- module Actions
3
- module SavonSupport
2
+ module Support
3
+ module Requests
4
4
 
5
5
  def self.included(base)
6
6
  base.send(:extend, ClassMethods)
@@ -1,3 +1,3 @@
1
1
  module Netsuite
2
- VERSION = '0.0.10'
2
+ VERSION = '0.0.11'
3
3
  end
@@ -12,4 +12,41 @@ describe NetSuite::Records::BillAddress do
12
12
  end
13
13
  end
14
14
 
15
+ describe '#to_record' do
16
+ before do
17
+ bill_address.bill_attention = 'Mr. Smith'
18
+ bill_address.bill_addressee = 'Mr. Robert Smith'
19
+ bill_address.bill_phone = '1234567890'
20
+ bill_address.bill_addr1 = '123 Happy Lane'
21
+ bill_address.bill_addr2 = '#4'
22
+ bill_address.bill_addr3 = 'Box 6'
23
+ bill_address.bill_city = 'Los Angeles'
24
+ bill_address.bill_state = 'CA'
25
+ bill_address.bill_zip = '90007'
26
+ bill_address.bill_country = '_unitedStates'
27
+ end
28
+
29
+ it 'can represent itself as a SOAP record' do
30
+ record = {
31
+ 'platformCommon:billAttention' => 'Mr. Smith',
32
+ 'platformCommon:billAddressee' => 'Mr. Robert Smith',
33
+ 'platformCommon:billPhone' => '1234567890',
34
+ 'platformCommon:billAddr1' => '123 Happy Lane',
35
+ 'platformCommon:billAddr2' => '#4',
36
+ 'platformCommon:billAddr3' => 'Box 6',
37
+ 'platformCommon:billCity' => 'Los Angeles',
38
+ 'platformCommon:billState' => 'CA',
39
+ 'platformCommon:billZip' => '90007',
40
+ 'platformCommon:billCountry' => '_unitedStates'
41
+ }
42
+ bill_address.to_record.should eql(record)
43
+ end
44
+ end
45
+
46
+ describe 'record_namespace' do
47
+ it 'belongs to the platformCommon namespace' do
48
+ bill_address.record_namespace.should eql('platformCommon')
49
+ end
50
+ end
51
+
15
52
  end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::Classification do
4
+ let(:classification) { NetSuite::Records::Classification.new }
5
+
6
+ it 'has all the right fields' do
7
+ [
8
+ :name, :include_children, :is_inactive, :class_translation_list, :subsidiary_list, :custom_field_list
9
+ ].each do |field|
10
+ classification.should have_field(field)
11
+ end
12
+ end
13
+
14
+ describe '.get' do
15
+ context 'when the response is successful' do
16
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :name => 'Retail' }) }
17
+
18
+ it 'returns an Invoice instance populated with the data from the response object' do
19
+ NetSuite::Actions::Get.should_receive(:call).with(10, NetSuite::Records::Classification).and_return(response)
20
+ invoice = NetSuite::Records::Classification.get(10)
21
+ invoice.should be_kind_of(NetSuite::Records::Classification)
22
+ end
23
+ end
24
+
25
+ context 'when the response is unsuccessful' do
26
+ let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
27
+
28
+ it 'raises a RecordNotFound exception' do
29
+ NetSuite::Actions::Get.should_receive(:call).with(10, NetSuite::Records::Classification).and_return(response)
30
+ lambda {
31
+ NetSuite::Records::Classification.get(10)
32
+ }.should raise_error(NetSuite::RecordNotFound, 'NetSuite::Records::Classification with ID=10 could not be found')
33
+ end
34
+ end
35
+ end
36
+
37
+ end
@@ -19,53 +19,78 @@ describe NetSuite::Records::CustomerAddressbookList do
19
19
  }
20
20
  }
21
21
  end
22
- let(:record) { NetSuite::Records::CustomerAddressbookList.new(attributes) }
22
+ let(:list) { NetSuite::Records::CustomerAddressbookList.new(attributes) }
23
23
 
24
24
  it 'has all the right fields' do
25
25
  [
26
26
  :default_shipping, :default_billing, :is_residential, :label, :attention, :addressee,
27
27
  :phone, :addr1, :addr2, :addr3, :city, :zip, :country, :addr_text, :override, :state
28
28
  ].each do |field|
29
- record.should have_field(field)
29
+ list.should have_field(field)
30
30
  end
31
31
  end
32
32
 
33
33
  describe '#initialize' do
34
34
  context 'when taking in a hash of attributes' do
35
35
  it 'sets the attributes for the object given the attributes hash' do
36
- record.addr1.should eql('123 Happy Lane')
37
- record.addr_text.should eql("123 Happy Lane\nLos Angeles CA 90007")
38
- record.city.should eql('Los Angeles')
39
- record.country.should eql('_unitedStates')
40
- record.default_billing.should be_true
41
- record.default_shipping.should be_true
42
- record.is_residential.should be_false
43
- record.label.should eql('123 Happy Lane')
44
- record.override.should be_false
45
- record.state.should eql('CA')
46
- record.zip.should eql('90007')
47
- record.internal_id.should eql('567')
36
+ list.addr1.should eql('123 Happy Lane')
37
+ list.addr_text.should eql("123 Happy Lane\nLos Angeles CA 90007")
38
+ list.city.should eql('Los Angeles')
39
+ list.country.should eql('_unitedStates')
40
+ list.default_billing.should be_true
41
+ list.default_shipping.should be_true
42
+ list.is_residential.should be_false
43
+ list.label.should eql('123 Happy Lane')
44
+ list.override.should be_false
45
+ list.state.should eql('CA')
46
+ list.zip.should eql('90007')
47
+ list.internal_id.should eql('567')
48
48
  end
49
49
  end
50
50
 
51
51
  context 'when taking in a CustomerAddressbookList instance' do
52
52
  it 'sets the attributes for the object given the record attributes' do
53
- old_record = NetSuite::Records::CustomerAddressbookList.new(attributes)
54
- record = NetSuite::Records::CustomerAddressbookList.new(old_record)
55
- record.addr1.should eql('123 Happy Lane')
56
- record.addr_text.should eql("123 Happy Lane\nLos Angeles CA 90007")
57
- record.city.should eql('Los Angeles')
58
- record.country.should eql('_unitedStates')
59
- record.default_billing.should be_true
60
- record.default_shipping.should be_true
61
- record.is_residential.should be_false
62
- record.label.should eql('123 Happy Lane')
63
- record.override.should be_false
64
- record.state.should eql('CA')
65
- record.zip.should eql('90007')
66
- record.internal_id.should eql('567')
53
+ old_list = NetSuite::Records::CustomerAddressbookList.new(attributes)
54
+ list = NetSuite::Records::CustomerAddressbookList.new(old_list)
55
+ list.addr1.should eql('123 Happy Lane')
56
+ list.addr_text.should eql("123 Happy Lane\nLos Angeles CA 90007")
57
+ list.city.should eql('Los Angeles')
58
+ list.country.should eql('_unitedStates')
59
+ list.default_billing.should be_true
60
+ list.default_shipping.should be_true
61
+ list.is_residential.should be_false
62
+ list.label.should eql('123 Happy Lane')
63
+ list.override.should be_false
64
+ list.state.should eql('CA')
65
+ list.zip.should eql('90007')
66
+ list.internal_id.should eql('567')
67
67
  end
68
68
  end
69
69
  end
70
70
 
71
+ describe '#to_record' do
72
+ it 'can represent itself as a SOAP record' do
73
+ record = {
74
+ 'listRel:addr1' => '123 Happy Lane',
75
+ 'listRel:addrText' => "123 Happy Lane\nLos Angeles CA 90007",
76
+ 'listRel:city' => 'Los Angeles',
77
+ 'listRel:country' => '_unitedStates',
78
+ 'listRel:defaultBilling' => true,
79
+ 'listRel:defaultShipping' => true,
80
+ 'listRel:isResidential' => false,
81
+ 'listRel:label' => '123 Happy Lane',
82
+ 'listRel:override' => false,
83
+ 'listRel:state' => 'CA',
84
+ 'listRel:zip' => '90007'
85
+ }
86
+ list.to_record.should eql(record)
87
+ end
88
+ end
89
+
90
+ describe '#record_type' do
91
+ it 'returns a string of the record SOAP type' do
92
+ list.record_type.should eql('listRel:CustomerAddressbookList')
93
+ end
94
+ end
95
+
71
96
  end
@@ -2,23 +2,23 @@ require 'spec_helper'
2
2
 
3
3
  describe NetSuite::Records::InvoiceItemList do
4
4
  let(:list) { NetSuite::Records::InvoiceItemList.new }
5
+ let(:item) { NetSuite::Records::InvoiceItem.new }
5
6
 
6
- it 'has the right fields' do
7
- [
8
- :amount, :amount_ordered, :bin_numbers, :cost_estimate, :cost_estimate_type, :current_percent, :custom_field_list, :defer_rev_rec, :description, :gift_cert_from, :gift_cert_message, :gift_cert_number, :gift_cert_recipient_email, :gift_cert_recipient_name, :gross_amt, :inventory_detail, :is_taxable, :item_is_fulfilled, :license_code, :line, :options, :order_line, :percent_complete, :quantity, :quantity_available, :quantity_fulfilled, :quantity_on_hand, :quantity_ordered, :quantity_remaining, :rate, :rev_rec_end_date, :rev_rec_start_date, :serial_numbers, :ship_group, :tax1_amt, :tax_rate1, :tax_rate2, :vsoe_allocation, :vsoe_amount, :vsoe_deferral, :vsoe_delivered, :vsoe_permit_discount, :vsoe_price
9
- ].each do |field|
10
- list.should have_field(field)
11
- end
7
+ it 'can have items be added to it' do
8
+ list.add_item(item)
9
+ item_list = list.send(:items)
10
+ item_list.should be_kind_of(Array)
11
+ item_list.length.should eql(1)
12
+ item_list.each { |i| i.should be_kind_of(NetSuite::Records::InvoiceItem) }
12
13
  end
13
14
 
14
- it 'has the right record_refs' do
15
- [
16
- :department, :item, :job, :location, :price, :rev_rec_schedule, :ship_address, :ship_method, :tax_code, :units
17
- ].each do |record_ref|
18
- list.should have_record_ref(record_ref)
15
+ describe '#to_record' do
16
+ it 'can represent itself as a SOAP record' do
17
+ record = {
18
+ 'tranSales:item' => []
19
+ }
20
+ list.to_record.should eql(record)
19
21
  end
20
22
  end
21
23
 
22
- # :class RecordRef
23
-
24
24
  end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::InvoiceItem do
4
+ let(:list) { NetSuite::Records::InvoiceItem.new }
5
+
6
+ it 'has the right fields' do
7
+ [
8
+ :amount, :amount_ordered, :bin_numbers, :cost_estimate, :cost_estimate_type, :current_percent, :custom_field_list,
9
+ :defer_rev_rec, :description, :gift_cert_from, :gift_cert_message, :gift_cert_number, :gift_cert_recipient_email,
10
+ :gift_cert_recipient_name, :gross_amt, :inventory_detail, :is_taxable, :item_is_fulfilled, :license_code, :line, :options,
11
+ :order_line, :percent_complete, :quantity, :quantity_available, :quantity_fulfilled, :quantity_on_hand, :quantity_ordered,
12
+ :quantity_remaining, :rate, :rev_rec_end_date, :rev_rec_start_date, :serial_numbers, :ship_group, :tax1_amt, :tax_rate1,
13
+ :tax_rate2, :vsoe_allocation, :vsoe_amount, :vsoe_deferral, :vsoe_delivered, :vsoe_permit_discount, :vsoe_price
14
+ ].each do |field|
15
+ list.should have_field(field)
16
+ end
17
+ end
18
+
19
+ it 'has the right record_refs' do
20
+ [
21
+ :department, :item, :job, :location, :price, :rev_rec_schedule, :ship_address, :ship_method, :tax_code, :units
22
+ ].each do |record_ref|
23
+ list.should have_record_ref(record_ref)
24
+ end
25
+ end
26
+
27
+ it 'can initialize from a record' do
28
+ record = NetSuite::Records::InvoiceItem.new(:amount => 123, :cost_estimate => 234)
29
+ list = NetSuite::Records::InvoiceItem.new(record)
30
+ list.should be_kind_of(NetSuite::Records::InvoiceItem)
31
+ list.amount.should eql(123)
32
+ list.cost_estimate.should eql(234)
33
+ end
34
+
35
+ # :class RecordRef
36
+
37
+ describe '#to_record' do
38
+ before do
39
+ list.amount = '7'
40
+ list.description = 'Some thingy'
41
+ end
42
+
43
+ it 'can represent itself as a SOAP record' do
44
+ record = {
45
+ 'tranSales:amount' => '7',
46
+ 'tranSales:description' => 'Some thingy'
47
+ }
48
+ list.to_record.should eql(record)
49
+ end
50
+ end
51
+
52
+ describe '#record_type' do
53
+ it 'returns a string of the SOAP record type' do
54
+ list.record_type.should eql('tranSales:InvoiceItem')
55
+ end
56
+ end
57
+
58
+ end
@@ -10,31 +10,39 @@ describe NetSuite::Records::Invoice do
10
10
  :alt_handling_cost, :alt_shipping_cost, :amount_paid, :amount_remaining, :balance, :bill_address,
11
11
  :billing_schedule, :contrib_pct, :created_date, :created_from, :currency_name, :custom_field_list,
12
12
  :deferred_revenue, :department, :discount_amount, :discount_date, :discount_item, :discount_rate,
13
- :discount_total, :due_date, :email, :end_date, :est_gross_profit, :est_gross_profit_percent, :exchange_rate,
13
+ :due_date, :email, :end_date, :est_gross_profit, :est_gross_profit_percent, :exchange_rate,
14
14
  :exclude_commission, :exp_cost_disc_amount, :exp_cost_disc_print, :exp_cost_disc_rate, :exp_cost_disc_tax_1_amt,
15
15
  :exp_cost_disc_taxable, :exp_cost_discount, :exp_cost_list, :exp_cost_tax_code, :exp_cost_tax_rate_1,
16
16
  :exp_cost_tax_rate_2, :fax, :fob, :gift_cert_applied, :gift_cert_redemption_list, :handling_cost, :handling_tax_1_rate,
17
17
  :handling_tax_2_rate, :handling_tax_code, :is_taxable, :item_cost_disc_amount, :item_cost_disc_print,
18
18
  :item_cost_disc_rate, :item_cost_disc_tax_1_amt, :item_cost_disc_taxable, :item_cost_discount, :item_cost_list,
19
- :item_cost_tax_code, :item_cost_tax_rate_1, :item_cost_tax_rate_2, :job, :klass, :last_modified_date,
19
+ :item_cost_tax_code, :item_cost_tax_rate_1, :item_cost_tax_rate_2, :job, :last_modified_date,
20
20
  :lead_source, :linked_tracking_numbers, :location, :memo, :message, :message_sel, :on_credit_hold, :opportunity,
21
21
  :other_ref_name, :partner, :partners_list, :promo_code, :recognized_revenue, :rev_rec_end_date,
22
22
  :rev_rec_on_rev_commitment, :rev_rec_schedule, :rev_rec_start_date, :revenue_status, :sales_effective_date,
23
23
  :sales_group, :sales_rep, :sales_team_list, :ship_address, :ship_date, :ship_group_list,
24
24
  :ship_method, :shipping_cost, :shipping_tax_1_rate, :shipping_tax_2_rate, :shipping_tax_code, :source, :start_date,
25
- :status, :sub_total, :subsidiary, :sync_partner_teams, :sync_sales_teams, :tax_2_total, :tax_item, :tax_rate,
25
+ :status, :subsidiary, :sync_partner_teams, :sync_sales_teams, :tax_2_total, :tax_item, :tax_rate,
26
26
  :tax_total, :terms, :time_disc_amount, :time_disc_print, :time_disc_rate, :time_disc_tax_1_amt, :time_disc_taxable,
27
27
  :time_discount, :time_list, :time_tax_code, :time_tax_rate_1, :time_tax_rate_2, :to_be_emailed, :to_be_faxed,
28
- :to_be_printed, :total, :total_cost_estimate, :tracking_numbers, :tran_date, :tran_id, :tran_is_vsoe_bundle,
28
+ :to_be_printed, :total_cost_estimate, :tracking_numbers, :tran_date, :tran_id, :tran_is_vsoe_bundle,
29
29
  :vat_reg_num, :vsoe_auto_calc
30
30
  ].each do |field|
31
31
  invoice.should have_field(field)
32
32
  end
33
33
  end
34
34
 
35
+ it 'has all the right read_only_fields' do
36
+ [
37
+ :sub_total, :discount_total, :total
38
+ ].each do |field|
39
+ NetSuite::Records::Invoice.should have_read_only_field(field)
40
+ end
41
+ end
42
+
35
43
  it 'has the right record_refs' do
36
44
  [
37
- :account, :bill_address_list, :custom_form, :entity, :posting_period, :ship_address_list
45
+ :account, :bill_address_list, :custom_form, :entity, :klass, :posting_period, :ship_address_list
38
46
  ].each do |record_ref|
39
47
  invoice.should have_record_ref(record_ref)
40
48
  end
@@ -43,89 +51,11 @@ describe NetSuite::Records::Invoice do
43
51
  describe 'item_list' do
44
52
  context 'when the attributes constitute an Array of items' do
45
53
  it 'builds an InvoiceItemList for each list item_list field' do
46
- invoice.item_list = {
47
- :item => [
48
- {
49
- :amount => '15993.6',
50
- :item => {
51
- :@internal_id => '217',
52
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
53
- :name => 'Dummy Item For Import'
54
- },
55
- :line => '1',
56
- :price => {
57
- :@internal_id => '-1',
58
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
59
- :name => '&nbsp;'
60
- },
61
- :quantity => '1.0',
62
- :tax_code => {
63
- :@internal_id => '-8',
64
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
65
- :name => '-Not Taxable-'
66
- }
67
- },
68
- {
69
- :amount => '499.0',
70
- :defer_rev_rec => false,
71
- :item => {
72
- :@internal_id => '111',
73
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
74
- :name => 'SAT Prep Course'
75
- },
76
- :line => '2',
77
- :price => {
78
- :@internal_id => '1',
79
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
80
- :name => 'Base Price'
81
- },
82
- :quantity => '1.0',
83
- :rate => '499.00',
84
- :tax_code => {
85
- :@internal_id => '-8',
86
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
87
- :name => '-Not Taxable-'
88
- }
89
- }
90
- ]
91
- }
92
- invoice.item_list.should be_kind_of(Array)
93
- invoice.item_list.each { |il| il.should be_kind_of(NetSuite::Records::InvoiceItemList) }
94
- end
95
- end
96
-
97
- context 'when the attributes constitute a single item' do
98
- it 'builds an InvoiceItemList for the item_list field' do
99
- invoice.item_list = {
100
- :item => {
101
- :amount => '15993.6',
102
- :item => {
103
- :@internal_id => '217',
104
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
105
- :name => 'Dummy Item For Import'
106
- },
107
- :line => '1',
108
- :price => {
109
- :@internal_id => '-1',
110
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
111
- :name => '&nbsp;'
112
- },
113
- :quantity => '1.0',
114
- :tax_code => {
115
- :@internal_id => '-8',
116
- :"@xmlns:platform_core" => 'urn:core_2011_2.platform.webservices.netsuite.com',
117
- :name => '-Not Taxable-'
118
- }
119
- }
120
- }
121
54
  invoice.item_list.should be_kind_of(NetSuite::Records::InvoiceItemList)
122
55
  end
123
56
  end
124
57
  end
125
58
 
126
- it 'handles the "klass" field correctly'
127
- # This field maps to 'class' but cannot be set as such in Ruby as it will cause runtime errors.
128
-
129
59
  describe '.get' do
130
60
  context 'when the response is successful' do
131
61
  let(:response) { NetSuite::Response.new(:success => true, :body => { :is_person => true }) }
@@ -220,4 +150,24 @@ describe NetSuite::Records::Invoice do
220
150
  end
221
151
  end
222
152
 
153
+ describe '#to_record' do
154
+ before do
155
+ invoice.email = 'something@example.com'
156
+ invoice.tran_id = '4'
157
+ end
158
+ it 'can represent itself as a SOAP record' do
159
+ record = {
160
+ 'tranSales:email' => 'something@example.com',
161
+ 'tranSales:tranId' => '4'
162
+ }
163
+ invoice.to_record.should eql(record)
164
+ end
165
+ end
166
+
167
+ describe '#record_type' do
168
+ it 'returns a string representation of the SOAP type' do
169
+ invoice.record_type.should eql('tranSales:Invoice')
170
+ end
171
+ end
172
+
223
173
  end