rconomic 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +6 -14
  2. data/.travis.yml +0 -1
  3. data/Gemfile +0 -1
  4. data/lib/economic/account.rb +3 -5
  5. data/lib/economic/cash_book.rb +1 -1
  6. data/lib/economic/cash_book_entry.rb +92 -94
  7. data/lib/economic/creditor.rb +1 -1
  8. data/lib/economic/creditor_contact.rb +15 -17
  9. data/lib/economic/creditor_entry.rb +0 -1
  10. data/lib/economic/current_invoice.rb +32 -35
  11. data/lib/economic/current_invoice_line.rb +14 -2
  12. data/lib/economic/debtor.rb +60 -37
  13. data/lib/economic/debtor_contact.rb +26 -20
  14. data/lib/economic/endpoint.rb +72 -0
  15. data/lib/economic/entity/handle.rb +35 -21
  16. data/lib/economic/entity/mapper.rb +41 -0
  17. data/lib/economic/entity.rb +58 -34
  18. data/lib/economic/invoice.rb +15 -2
  19. data/lib/economic/proxies/account_proxy.rb +2 -3
  20. data/lib/economic/proxies/actions/find_by_ci_number.rb +4 -2
  21. data/lib/economic/proxies/actions/find_by_date_interval.rb +0 -1
  22. data/lib/economic/proxies/actions/find_by_name.rb +5 -1
  23. data/lib/economic/proxies/cash_book_entry_proxy.rb +1 -1
  24. data/lib/economic/proxies/entity_proxy.rb +15 -8
  25. data/lib/economic/session.rb +27 -31
  26. data/lib/rconomic/version.rb +1 -1
  27. data/rconomic.gemspec +1 -5
  28. data/spec/economic/cash_book_entry_spec.rb +27 -5
  29. data/spec/economic/cash_book_spec.rb +6 -6
  30. data/spec/economic/creditor_contact_spec.rb +24 -15
  31. data/spec/economic/creditor_spec.rb +9 -9
  32. data/spec/economic/current_invoice_line_spec.rb +7 -7
  33. data/spec/economic/current_invoice_spec.rb +82 -33
  34. data/spec/economic/debtor_contact_spec.rb +25 -15
  35. data/spec/economic/debtor_entry_spec.rb +3 -3
  36. data/spec/economic/debtor_spec.rb +49 -15
  37. data/spec/economic/endpoint_spec.rb +71 -0
  38. data/spec/economic/entity/handle_spec.rb +42 -49
  39. data/spec/economic/entity/mapper_spec.rb +54 -0
  40. data/spec/economic/entity_spec.rb +78 -72
  41. data/spec/economic/entry_spec.rb +3 -3
  42. data/spec/economic/invoice_spec.rb +37 -18
  43. data/spec/economic/proxies/actions/find_by_name_spec.rb +15 -12
  44. data/spec/economic/proxies/cash_book_entry_proxy_spec.rb +26 -24
  45. data/spec/economic/proxies/cash_book_proxy_spec.rb +23 -21
  46. data/spec/economic/proxies/creditor_contact_proxy_spec.rb +12 -16
  47. data/spec/economic/proxies/creditor_entry_proxy_spec.rb +18 -14
  48. data/spec/economic/proxies/creditor_proxy_spec.rb +23 -26
  49. data/spec/economic/proxies/current_invoice_line_proxy_spec.rb +17 -20
  50. data/spec/economic/proxies/current_invoice_proxy_spec.rb +38 -41
  51. data/spec/economic/proxies/debtor_contact_proxy_spec.rb +12 -15
  52. data/spec/economic/proxies/debtor_entry_proxy_spec.rb +18 -14
  53. data/spec/economic/proxies/debtor_proxy_spec.rb +31 -34
  54. data/spec/economic/proxies/entry_proxy_spec.rb +26 -22
  55. data/spec/economic/proxies/invoice_proxy_spec.rb +18 -21
  56. data/spec/economic/session_spec.rb +57 -44
  57. data/spec/fixtures/{spec_entity_create_from_data → account_create_from_data}/success.xml +5 -5
  58. data/spec/fixtures/{spec_entity_delete → account_delete}/success.xml +1 -1
  59. data/spec/fixtures/{spec_entity_get_data → account_get_data}/success.xml +5 -5
  60. data/spec/fixtures/{spec_entity_update_from_data → account_update_from_data}/success.xml +5 -5
  61. data/spec/fixtures/cash_book_entry_create_creditor_invoice/success.xml +2 -2
  62. data/spec/fixtures/cash_book_entry_create_creditor_payment/success.xml +2 -2
  63. data/spec/fixtures/creditor_contact_create_from_data/success.xml +10 -0
  64. data/spec/fixtures/debtor_contact_create_from_data/success.xml +10 -0
  65. data/spec/fixtures/debtor_create_from_data/success.xml +57 -0
  66. data/spec/spec_helper.rb +10 -104
  67. data/spec/support/api_requests.rb +20 -0
  68. data/spec/support/factories.rb +65 -0
  69. data/spec/support/fixtures.rb +9 -0
  70. metadata +27 -31
@@ -1,6 +1,9 @@
1
1
  module Economic
2
+ # The Economic::Session contains details and behaviors for a current
3
+ # connection to the API endpoint.
2
4
  class Session
3
5
  attr_accessor :agreement_number, :user_name, :password
6
+ attr_reader :authentication_token
4
7
 
5
8
  def initialize(agreement_number, user_name, password)
6
9
  self.agreement_number = agreement_number
@@ -10,16 +13,12 @@ module Economic
10
13
 
11
14
  # Authenticates with e-conomic
12
15
  def connect
13
- client.http.headers.delete("Cookie")
14
- response = client.request :economic, :connect do
15
- soap.body = {
16
- :agreementNumber => self.agreement_number,
17
- :userName => self.user_name,
18
- :password => self.password
19
- }
16
+ endpoint.call(
17
+ :connect,
18
+ authentication_details
19
+ ) do |response|
20
+ store_authentication_token(response)
20
21
  end
21
-
22
- @cookie = response.http.headers["Set-Cookie"]
23
22
  end
24
23
 
25
24
  # Provides access to the DebtorContacts
@@ -27,7 +26,8 @@ module Economic
27
26
  @contacts ||= DebtorContactProxy.new(self)
28
27
  end
29
28
 
30
- # Provides access to the current invoices - ie invoices that haven't yet been booked
29
+ # Provides access to the current invoices - ie invoices that haven't yet
30
+ # been booked
31
31
  def current_invoices
32
32
  @current_invoices ||= CurrentInvoiceProxy.new(self)
33
33
  end
@@ -72,21 +72,8 @@ module Economic
72
72
  end
73
73
 
74
74
  # Requests an action from the API endpoint
75
- def request(action, data = nil)
76
- client.http.headers["Cookie"] = @cookie
77
-
78
- response = client.request(:economic, action) do
79
- soap.body = data if data
80
- end
81
- response_hash = response.to_hash
82
-
83
- response_key = "#{action}_response".intern
84
- result_key = "#{action}_result".intern
85
- if response_hash[response_key] && response_hash[response_key][result_key]
86
- response_hash[response_key][result_key]
87
- else
88
- {}
89
- end
75
+ def request(soap_action, data = nil)
76
+ endpoint.call(soap_action, data, authentication_token)
90
77
  end
91
78
 
92
79
  # Returns self - used by proxies to access the session of their owner
@@ -94,14 +81,23 @@ module Economic
94
81
  self
95
82
  end
96
83
 
84
+ # Returns the SOAP endpoint to connect to
85
+ def endpoint
86
+ @endpoint ||= Economic::Endpoint.new
87
+ end
88
+
97
89
  private
98
90
 
99
- # Returns the Savon::Client used to connect to e-conomic
100
- # Cached on class-level to avoid loading the big wsdl file more than once (can take several hunder megabytes of ram after a while...)
101
- def client
102
- @@client ||= Savon::Client.new do
103
- wsdl.document = File.expand_path(File.join(File.dirname(__FILE__), "economic.wsdl"))
104
- end
91
+ def authentication_details
92
+ {
93
+ :agreementNumber => self.agreement_number,
94
+ :userName => self.user_name,
95
+ :password => self.password
96
+ }
97
+ end
98
+
99
+ def store_authentication_token(response)
100
+ @authentication_token = response.http.cookies
105
101
  end
106
102
  end
107
103
  end
@@ -1,3 +1,3 @@
1
1
  module Rconomic
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
data/rconomic.gemspec CHANGED
@@ -17,11 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.version = Rconomic::VERSION
18
18
  s.platform = Gem::Platform::RUBY
19
19
 
20
- # As long as we use Savon 0.9.5, we need to tie down the max version
21
- # of gyoku as 0.4.5 is not backwards compatible. If we update Savon,
22
- # we should remove the gyoku constraint.
23
- s.add_runtime_dependency "savon", "0.9.5"
24
- s.add_runtime_dependency "gyoku", "0.4.4"
20
+ s.add_runtime_dependency "savon", "~> 2.2"
25
21
 
26
22
  s.files = `git ls-files`.split("\n").reject { |filename| ['.gitignore'].include?(filename) }
27
23
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
@@ -5,24 +5,46 @@ describe Economic::CashBookEntry do
5
5
  subject { Economic::CashBookEntry.new(:session => session) }
6
6
 
7
7
  it "inherits from Economic::Entity" do
8
- Economic::CashBookEntry.ancestors.should include(Economic::Entity)
8
+ expect(Economic::CashBookEntry.ancestors).to include(Economic::Entity)
9
9
  end
10
10
 
11
11
  describe ".proxy" do
12
12
  it "should return a CashBookEntryProxy" do
13
- subject.proxy.should be_instance_of(Economic::CashBookEntryProxy)
13
+ expect(subject.proxy).to be_instance_of(Economic::CashBookEntryProxy)
14
14
  end
15
15
 
16
16
  it "should return a proxy owned by session" do
17
- subject.proxy.session.should == session
17
+ expect(subject.proxy.session).to eq(session)
18
18
  end
19
19
  end
20
20
 
21
21
  describe "#save" do
22
22
  it 'should save it' do
23
- savon.stubs('CashBookEntry_CreateFromData').returns(:success)
23
+ stub_request('CashBookEntry_CreateFromData', nil, :success)
24
24
  subject.save
25
25
  end
26
- end
27
26
 
27
+ it "builds and sends data to API" do
28
+ time = Time.now
29
+ subject.date = subject.start_date = time
30
+ subject.account_handle = Economic::Entity::Handle.new(:number => 12)
31
+ mock_request(
32
+ :cash_book_entry_create_from_data, {
33
+ "data" => {
34
+ "AccountHandle" => {"Number" => 12},
35
+ "Date" => time,
36
+ "VoucherNumber" => 0,
37
+ "Text" => "",
38
+ "AmountDefaultCurrency" => 0,
39
+ "Amount" => 0,
40
+ "DueDate" => nil,
41
+ "StartDate" => time,
42
+ "EndDate" => nil
43
+ }
44
+ },
45
+ :success
46
+ )
47
+ subject.save
48
+ end
49
+ end
28
50
  end
@@ -5,7 +5,7 @@ describe Economic::CashBook do
5
5
  subject { (i = Economic::CashBook.new( :id => 512, :number => 32 )).tap { i.session = session } }
6
6
 
7
7
  it "inherits from Economic::Entity" do
8
- Economic::CashBook.superclass.should == Economic::Entity
8
+ expect(Economic::CashBook.superclass).to eq(Economic::Entity)
9
9
  end
10
10
 
11
11
  describe "class methods" do
@@ -13,22 +13,22 @@ describe Economic::CashBook do
13
13
 
14
14
  describe ".proxy" do
15
15
  it "should return CashBookProxy" do
16
- subject.proxy.should == Economic::CashBookProxy
16
+ expect(subject.proxy).to eq(Economic::CashBookProxy)
17
17
  end
18
18
  end
19
19
  end
20
20
 
21
21
  describe "#entries" do
22
22
  it 'should return a cash book entry proxy' do
23
- subject.entries.should be_a(Economic::CashBookEntryProxy)
24
- subject.entries.owner.should == subject
23
+ expect(subject.entries).to be_a(Economic::CashBookEntryProxy)
24
+ expect(subject.entries.owner).to eq(subject)
25
25
  end
26
26
  end
27
27
 
28
28
  describe "#book" do
29
29
  it 'should book the cash book and return an invoice number' do
30
- savon.expects("CashBook_Book").with('cashBookHandle' => { 'Number' => 32 }).returns(:success)
31
- subject.book.should == 832
30
+ mock_request("CashBook_Book", {'cashBookHandle' => { 'Number' => 32 }}, :success)
31
+ expect(subject.book).to eq(832)
32
32
  end
33
33
  end
34
34
  end
@@ -5,7 +5,7 @@ describe Economic::CreditorContact do
5
5
  subject { Economic::CreditorContact.new(:session => session) }
6
6
 
7
7
  it "inherits from Economic::Entity" do
8
- Economic::CreditorContact.ancestors.should include(Economic::Entity)
8
+ expect(Economic::CreditorContact.ancestors).to include(Economic::Entity)
9
9
  end
10
10
 
11
11
  context "when saving" do
@@ -18,17 +18,26 @@ describe Economic::CreditorContact do
18
18
  end
19
19
 
20
20
  it "should send request and let e-conomic return an error" do
21
- session.expects(:request)
21
+ expect(session).to receive(:request)
22
22
  subject.save
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ it "builds and sends data to API" do
28
+ mock_request(
29
+ :creditor_contact_create_from_data,
30
+ {"data" => {"Handle" => {}, "Number" => nil}},
31
+ :success
32
+ )
33
+ subject.save
34
+ end
26
35
  end
27
36
 
28
37
  describe ".creditor" do
29
38
  context "when creditor_handle is not set" do
30
39
  it "returns nil" do
31
- subject.creditor.should be_nil
40
+ expect(subject.creditor).to be_nil
32
41
  end
33
42
  end
34
43
 
@@ -40,13 +49,13 @@ describe Economic::CreditorContact do
40
49
  end
41
50
 
42
51
  it "returns a Creditor" do
43
- session.creditors.expects(:find).with(42).returns(Economic::Creditor.new)
44
- subject.creditor.should be_instance_of(Economic::Creditor)
52
+ expect(session.creditors).to receive(:find).with(42).and_return(Economic::Creditor.new)
53
+ expect(subject.creditor).to be_instance_of(Economic::Creditor)
45
54
  end
46
55
 
47
56
  it "only looks up the creditor the first time" do
48
- session.creditors.expects(:find).with(42).returns(Economic::Creditor.new)
49
- subject.creditor.should === subject.creditor
57
+ expect(session.creditors).to receive(:find).with(42).and_return(Economic::Creditor.new)
58
+ expect(subject.creditor).to equal(subject.creditor)
50
59
  end
51
60
  end
52
61
  end
@@ -55,7 +64,7 @@ describe Economic::CreditorContact do
55
64
  let(:creditor) { make_creditor }
56
65
  it "should set creditor_handle" do
57
66
  subject.creditor = creditor
58
- subject.creditor_handle.should == creditor.handle
67
+ expect(subject.creditor_handle).to eq(creditor.handle)
59
68
  end
60
69
  end
61
70
 
@@ -65,7 +74,7 @@ describe Economic::CreditorContact do
65
74
 
66
75
  it "should set creditor_handle" do
67
76
  subject.creditor_handle = handle
68
- subject.creditor_handle.should == handle
77
+ expect(subject.creditor_handle).to eq(handle)
69
78
  end
70
79
 
71
80
  context "when creditor handle is for a different Creditor" do
@@ -74,9 +83,9 @@ describe Economic::CreditorContact do
74
83
  end
75
84
 
76
85
  it "should clear cached creditor and fetch the new creditor from API" do
77
- savon.stubs('Creditor_GetData').returns(:success)
86
+ stub_request('Creditor_GetData', nil, :success)
78
87
  subject.creditor_handle = Economic::Creditor::Handle.new({:number => 1234})
79
- subject.creditor.should be_instance_of(Economic::Creditor)
88
+ expect(subject.creditor).to be_instance_of(Economic::Creditor)
80
89
  end
81
90
  end
82
91
 
@@ -86,20 +95,20 @@ describe Economic::CreditorContact do
86
95
  end
87
96
 
88
97
  it "should not clear cached creditor nor fetch the creditor from API" do
89
- savon.stubs('Creditor_GetData').never
98
+ expect(session).to receive(:request).never
90
99
  subject.creditor_handle = handle
91
- subject.creditor.should be_instance_of(Economic::Creditor)
100
+ expect(subject.creditor).to be_instance_of(Economic::Creditor)
92
101
  end
93
102
  end
94
103
  end
95
104
 
96
105
  describe ".proxy" do
97
106
  it "should return a CreditorContactProxy" do
98
- subject.proxy.should be_instance_of(Economic::CreditorContactProxy)
107
+ expect(subject.proxy).to be_instance_of(Economic::CreditorContactProxy)
99
108
  end
100
109
 
101
110
  it "should return a proxy owned by session" do
102
- subject.proxy.session.should == session
111
+ expect(subject.proxy.session).to eq(session)
103
112
  end
104
113
  end
105
114
 
@@ -5,7 +5,7 @@ describe Economic::Creditor do
5
5
  subject { Economic::Creditor.new(:session => session) }
6
6
 
7
7
  it "inherits from Economic::Entity" do
8
- Economic::Creditor.ancestors.should include(Economic::Entity)
8
+ expect(Economic::Creditor.ancestors).to include(Economic::Entity)
9
9
  end
10
10
 
11
11
  describe "class methods" do
@@ -13,39 +13,39 @@ describe Economic::Creditor do
13
13
 
14
14
  describe ".proxy" do
15
15
  it "should return CreditorProxy" do
16
- subject.proxy.should == Economic::CreditorProxy
16
+ expect(subject.proxy).to eq(Economic::CreditorProxy)
17
17
  end
18
18
  end
19
19
 
20
20
  describe ".key" do
21
21
  it "should == :creditor" do
22
- Economic::Creditor.key.should == :creditor
22
+ expect(Economic::Creditor.key).to eq(:creditor)
23
23
  end
24
24
  end
25
25
  end
26
26
 
27
27
  describe ".contacts" do
28
28
  it "returns a CreditorContactProxy" do
29
- subject.contacts.should be_instance_of(Economic::CreditorContactProxy)
29
+ expect(subject.contacts).to be_instance_of(Economic::CreditorContactProxy)
30
30
  end
31
31
 
32
32
  it "memoizes the proxy" do
33
- subject.contacts.should === subject.contacts
33
+ expect(subject.contacts).to equal(subject.contacts)
34
34
  end
35
35
 
36
36
  it "should store the session" do
37
- subject.session.should_not be_nil
38
- subject.contacts.session.should == subject.session
37
+ expect(subject.session).to_not be_nil
38
+ expect(subject.contacts.session).to eq(subject.session)
39
39
  end
40
40
  end
41
41
 
42
42
  describe ".proxy" do
43
43
  it "should return a CreditorProxy" do
44
- subject.proxy.should be_instance_of(Economic::CreditorProxy)
44
+ expect(subject.proxy).to be_instance_of(Economic::CreditorProxy)
45
45
  end
46
46
 
47
47
  it "should return a proxy owned by session" do
48
- subject.proxy.session.should == session
48
+ expect(subject.proxy.session).to eq(session)
49
49
  end
50
50
  end
51
51
 
@@ -5,7 +5,7 @@ describe Economic::CurrentInvoiceLine do
5
5
  subject { (l = Economic::CurrentInvoiceLine.new).tap { l.session = session } }
6
6
 
7
7
  it "inherits from Economic::Entity" do
8
- Economic::CurrentInvoiceLine.ancestors.should include(Economic::Entity)
8
+ expect(Economic::CurrentInvoiceLine.ancestors).to include(Economic::Entity)
9
9
  end
10
10
 
11
11
  describe "equality" do
@@ -13,14 +13,14 @@ describe Economic::CurrentInvoiceLine do
13
13
  line1 = Economic::CurrentInvoiceLine.new({})
14
14
  line2 = Economic::CurrentInvoiceLine.new({})
15
15
 
16
- line1.should_not == line2
16
+ expect(line1).not_to eq(line2)
17
17
  end
18
18
 
19
19
  it "should not be equal when numbers are different" do
20
20
  line1 = Economic::CurrentInvoiceLine.new({:number => 1})
21
21
  line2 = Economic::CurrentInvoiceLine.new({:number => 2})
22
22
 
23
- line1.should_not == line2
23
+ expect(line1).not_to eq(line2)
24
24
  end
25
25
  end
26
26
 
@@ -30,18 +30,18 @@ describe Economic::CurrentInvoiceLine do
30
30
 
31
31
  subject.invoice = invoice
32
32
 
33
- subject.invoice.should == invoice
34
- subject.invoice_handle.should == invoice.handle
33
+ expect(subject.invoice).to eq(invoice)
34
+ expect(subject.invoice_handle).to eq(invoice.handle)
35
35
  end
36
36
  end
37
37
 
38
38
  describe ".proxy" do
39
39
  it "should return a CurrentInvoiceLineProxy" do
40
- subject.proxy.should be_instance_of(Economic::CurrentInvoiceLineProxy)
40
+ expect(subject.proxy).to be_instance_of(Economic::CurrentInvoiceLineProxy)
41
41
  end
42
42
 
43
43
  it "should return a proxy owned by session" do
44
- subject.proxy.session.should == session
44
+ expect(subject.proxy.session).to eq(session)
45
45
  end
46
46
  end
47
47
 
@@ -5,67 +5,102 @@ describe Economic::CurrentInvoice do
5
5
  subject { (i = Economic::CurrentInvoice.new( :id => 512 )).tap { i.session = session } }
6
6
 
7
7
  it "inherits from Economic::Entity" do
8
- Economic::CurrentInvoice.ancestors.should include(Economic::Entity)
8
+ expect(Economic::CurrentInvoice.ancestors).to include(Economic::Entity)
9
9
  end
10
10
 
11
11
  describe "new" do
12
12
  it "initializes lines as an empty proxy" do
13
- subject.lines.should be_instance_of(Economic::CurrentInvoiceLineProxy)
14
- subject.lines.should be_empty
13
+ expect(subject.lines).to be_instance_of(Economic::CurrentInvoiceLineProxy)
14
+ expect(subject.lines).to be_empty
15
15
  end
16
16
  end
17
17
 
18
18
  describe ".key" do
19
19
  it "should == :current_invoice" do
20
- Economic::CurrentInvoice.key.should == :current_invoice
20
+ expect(Economic::CurrentInvoice.key).to eq(:current_invoice)
21
21
  end
22
22
  end
23
23
 
24
24
  describe ".proxy" do
25
25
  it "should return a CurrentInvoiceProxy" do
26
- subject.proxy.should be_instance_of(Economic::CurrentInvoiceProxy)
26
+ expect(subject.proxy).to be_instance_of(Economic::CurrentInvoiceProxy)
27
27
  end
28
28
 
29
29
  it "should return a proxy owned by session" do
30
- subject.proxy.session.should == session
30
+ expect(subject.proxy.session).to eq(session)
31
31
  end
32
32
  end
33
33
 
34
34
  describe "save" do
35
35
  context "when successful" do
36
- before :each do
37
- savon.stubs('CurrentInvoice_CreateFromData').returns(:success)
36
+ it "builds and sends data to API" do
37
+ time = Time.now
38
+ subject.date = time
39
+ subject.attention_handle = Economic::Entity::Handle.new(:id => 42)
40
+ subject.term_of_payment_handle = Economic::Entity::Handle.new(:id => 37)
41
+ subject.currency_handle = Economic::Entity::Handle.new({:code => "BTC"})
42
+ subject.layout_handle = Economic::Entity::Handle.new(:id => 314)
43
+
44
+ mock_request(
45
+ "CurrentInvoice_CreateFromData", {
46
+ "data" => {
47
+ "Id" => 512,
48
+ "DebtorName" => nil,
49
+ "AttentionHandle" => {"Id" => 42},
50
+ "Date" => time.iso8601,
51
+ "TermOfPaymentHandle" => {"Id" => 37},
52
+ "DueDate" => nil,
53
+ "CurrencyHandle" => {"Code" => "BTC"},
54
+ "ExchangeRate" => 100,
55
+ "IsVatIncluded" => nil,
56
+ "LayoutHandle" => {"Id" => 314},
57
+ "DeliveryDate" => nil,
58
+ "NetAmount" => 0,
59
+ "VatAmount" => 0,
60
+ "GrossAmount" => 0,
61
+ "Margin" => 0,
62
+ "MarginAsPercent" => 0
63
+ }
64
+ },
65
+ :success
66
+ )
67
+ subject.save
38
68
  end
39
69
 
40
70
  it "updates id with the created id" do
71
+ stub_request('CurrentInvoice_CreateFromData', nil, :success)
41
72
  subject.save
42
- subject.id.should == 42
73
+ expect(subject.id).to eq(42)
43
74
  end
44
75
 
45
76
  it "updates handle with the created id" do
77
+ stub_request('CurrentInvoice_CreateFromData', nil, :success)
78
+
46
79
  invoice = Economic::CurrentInvoice.new({})
47
80
  invoice.session = session
48
81
 
49
82
  # This line memoizes the handle with the wrong/old id (0). This is what
50
83
  # we're testing changes
51
- invoice.handle.id.should == 0
84
+ expect(invoice.handle.id).to eq(0)
52
85
 
53
86
  invoice.save
54
- invoice.handle.should == Economic::Entity::Handle.new(:id => 42)
87
+ expect(invoice.handle).to eq(Economic::Entity::Handle.new(:id => 42))
55
88
  end
56
89
 
57
90
  context "when invoice has lines" do
58
91
  before :each do
92
+ stub_request('CurrentInvoice_CreateFromData', nil, :success)
93
+
59
94
  2.times do
60
95
  line = Economic::CurrentInvoiceLine.new
61
- line.stubs(:save)
96
+ allow(line).to receive(:save)
62
97
  subject.lines << line
63
98
  end
64
99
  end
65
100
 
66
101
  it "adds the lines to the invoice" do
67
102
  subject.lines.each do |line|
68
- line.expects(:invoice=).with(subject)
103
+ expect(line).to receive(:invoice=).with(subject)
69
104
  end
70
105
 
71
106
  subject.save
@@ -73,7 +108,7 @@ describe Economic::CurrentInvoice do
73
108
 
74
109
  it "assigns the invoice session to each line" do
75
110
  subject.lines.each do |line|
76
- line.expects(:session=).with(subject.session)
111
+ expect(line).to receive(:session=).with(subject.session)
77
112
  end
78
113
 
79
114
  subject.save
@@ -81,7 +116,7 @@ describe Economic::CurrentInvoice do
81
116
 
82
117
  it "saves each line" do
83
118
  subject.lines.each do |line|
84
- line.expects(:save)
119
+ expect(line).to receive(:save)
85
120
  end
86
121
 
87
122
  subject.save
@@ -91,32 +126,29 @@ describe Economic::CurrentInvoice do
91
126
  end
92
127
 
93
128
  describe "#book" do
94
- before :each do
95
- savon.stubs('CurrentInvoice_Book').returns(:success)
96
- savon.stubs('Invoice_GetData').returns(:success)
97
- end
98
-
99
129
  it 'should book the current invoice and return the created invoice object' do
100
- savon.expects("Invoice_GetData").with('entityHandle' => { 'Number' => 328 }).returns(:success)
101
- subject.book.should be_instance_of(Economic::Invoice)
130
+ stub_request('CurrentInvoice_Book', nil, :success)
131
+ mock_request("Invoice_GetData", {'entityHandle' => { 'Number' => 328 }}, :success)
132
+ expect(subject.book).to be_instance_of(Economic::Invoice)
102
133
  end
103
134
 
104
135
  it 'should request with the right key for handle' do
105
- savon.expects("CurrentInvoice_Book").with('currentInvoiceHandle' => { 'Id' => 512 }).returns(:success)
136
+ mock_request("CurrentInvoice_Book", {'currentInvoiceHandle' => { 'Id' => 512 }}, :success)
137
+ stub_request('Invoice_GetData', nil, :success)
106
138
  subject.book
107
139
  end
108
140
  end
109
141
 
110
142
  describe "#book_with_number" do
111
143
  it 'should book the current invoice with the given number and return the created invoice object' do
112
- savon.stubs('CurrentInvoice_BookWithNumber').returns(:success)
113
- savon.expects("Invoice_GetData").with('entityHandle' => { 'Number' => 123 }).returns(:success)
114
- subject.book_with_number(123).should be_instance_of(Economic::Invoice)
144
+ stub_request('CurrentInvoice_BookWithNumber', nil, :success)
145
+ mock_request("Invoice_GetData", {'entityHandle' => { 'Number' => 123 }}, :success)
146
+ expect(subject.book_with_number(123)).to be_instance_of(Economic::Invoice)
115
147
  end
116
148
 
117
149
  it 'should request with the right key for handle' do
118
- savon.stubs('Invoice_GetData').returns(:success)
119
- savon.expects("CurrentInvoice_BookWithNumber").with('currentInvoiceHandle' => { 'Id' => 512 }, 'number' => 123).returns(:success)
150
+ mock_request("CurrentInvoice_BookWithNumber", {'currentInvoiceHandle' => { 'Id' => 512 }, 'number' => 123}, :success)
151
+ stub_request('Invoice_GetData', nil, :success)
120
152
  subject.book_with_number(123)
121
153
  end
122
154
  end
@@ -132,18 +164,35 @@ describe Economic::CurrentInvoice do
132
164
 
133
165
  it "should be set- and gettable" do
134
166
  subject.attention = contact
135
- subject.attention_handle.should == contact.handle
136
- subject.attention.should == contact
167
+ expect(subject.attention).to eq(contact)
168
+ end
169
+
170
+ it "updates the handle" do
171
+ handle = Economic::Entity::Handle.new(:number => 42)
172
+ contact.handle = handle
173
+ subject.attention = contact
174
+ expect(subject.attention_handle).to eq(handle)
137
175
  end
138
176
  end
139
177
 
140
178
  describe "#debtor" do
141
- let(:debtor) { (c = Economic::Debtor.new).tap { c.session = session }}
179
+ let(:debtor) {
180
+ Economic::Debtor.new.tap do |c|
181
+ c.session = session
182
+ c.number = 5
183
+ end
184
+ }
142
185
 
143
186
  it "should be set- and gettable" do
144
187
  subject.debtor = debtor
145
- subject.debtor_handle.should == debtor.handle
146
- subject.debtor.should == debtor
188
+ expect(subject.debtor).to eq(debtor)
189
+ end
190
+
191
+ it "updates the handle" do
192
+ handle = Economic::Entity::Handle.new(:number => 42)
193
+ debtor.handle = handle
194
+ subject.debtor = debtor
195
+ expect(subject.debtor_handle).to eq(handle)
147
196
  end
148
197
  end
149
198
  end