rconomic 0.5.1 → 0.5.2

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/LICENSE +6 -4
  4. data/README.md +19 -8
  5. data/Rakefile +9 -1
  6. data/lib/economic/account.rb +6 -6
  7. data/lib/economic/cash_book.rb +6 -6
  8. data/lib/economic/creditor.rb +26 -27
  9. data/lib/economic/current_invoice.rb +26 -1
  10. data/lib/economic/current_invoice_line.rb +17 -21
  11. data/lib/economic/debtor.rb +16 -5
  12. data/lib/economic/economic.wsdl +28493 -23200
  13. data/lib/economic/endpoint.rb +8 -1
  14. data/lib/economic/entity/handle.rb +2 -1
  15. data/lib/economic/invoice.rb +1 -0
  16. data/lib/economic/order.rb +66 -0
  17. data/lib/economic/proxies/actions/find_by_number.rb +1 -1
  18. data/lib/economic/proxies/actions/find_by_telephone_and_fax_number.rb +18 -0
  19. data/lib/economic/proxies/debtor_proxy.rb +63 -0
  20. data/lib/economic/proxies/entity_proxy.rb +0 -1
  21. data/lib/economic/proxies/order_proxy.rb +18 -0
  22. data/lib/economic/session.rb +37 -12
  23. data/lib/rconomic.rb +2 -0
  24. data/lib/rconomic/version.rb +1 -1
  25. data/rconomic.gemspec +1 -1
  26. data/spec/economic/account_spec.rb +34 -0
  27. data/spec/economic/cash_book_spec.rb +28 -0
  28. data/spec/economic/creditor_spec.rb +19 -0
  29. data/spec/economic/current_invoice_line_spec.rb +21 -0
  30. data/spec/economic/debtor_spec.rb +33 -8
  31. data/spec/economic/endpoint_spec.rb +18 -0
  32. data/spec/economic/entity/handle_spec.rb +2 -2
  33. data/spec/economic/order_spec.rb +80 -0
  34. data/spec/economic/proxies/debtor_contact_proxy_spec.rb +1 -1
  35. data/spec/economic/proxies/debtor_proxy_spec.rb +69 -0
  36. data/spec/economic/proxies/order_proxy_spec.rb +67 -0
  37. data/spec/economic/session_spec.rb +99 -11
  38. data/spec/fixtures/cash_book_update_from_data/success.xml +14 -0
  39. data/spec/fixtures/connect_with_token/success.xml +8 -0
  40. data/spec/fixtures/creditor_create_from_data/success.xml +49 -0
  41. data/spec/fixtures/current_invoice_line_create_from_data/success.xml +42 -0
  42. data/spec/fixtures/debtor_find_by_telephone_and_fax_number/found.xml +12 -0
  43. data/spec/fixtures/debtor_find_by_telephone_and_fax_number/not_found.xml +7 -0
  44. data/spec/fixtures/debtor_get_debtor_contacts/multiple.xml +15 -0
  45. data/spec/fixtures/debtor_get_debtor_contacts/none.xml +9 -0
  46. data/spec/fixtures/debtor_get_invoices/success.xml +15 -0
  47. data/spec/fixtures/debtor_get_orders/success.xml +12 -0
  48. data/spec/fixtures/order_find_by_date_interval/many.xml +15 -0
  49. data/spec/fixtures/order_find_by_date_interval/none.xml +9 -0
  50. data/spec/fixtures/order_find_by_date_interval/single.xml +12 -0
  51. data/spec/fixtures/order_get_data/success.xml +75 -0
  52. data/spec/fixtures/order_get_data_array/multiple.xml +145 -0
  53. data/spec/fixtures/order_get_data_array/single.xml +77 -0
  54. data/spec/fixtures/order_get_pdf/success.xml +8 -0
  55. metadata +28 -4
@@ -45,4 +45,25 @@ describe Economic::CurrentInvoiceLine do
45
45
  end
46
46
  end
47
47
 
48
+ describe "#save" do
49
+ context "when successful" do
50
+ it "builds and sends data to API" do
51
+ mock_request(
52
+ "CurrentInvoiceLine_CreateFromData", {
53
+ "data" => {
54
+ "Number" => 0,
55
+ "DeliveryDate" => nil,
56
+ "DiscountAsPercent" => 0,
57
+ "UnitCostPrice" => 0,
58
+ "TotalNetAmount" => nil,
59
+ "TotalMargin" => 0,
60
+ "MarginAsPercent" => 0
61
+ }
62
+ },
63
+ :success
64
+ )
65
+ subject.save
66
+ end
67
+ end
68
+ end
48
69
  end
@@ -56,18 +56,43 @@ describe Economic::Debtor do
56
56
  end
57
57
  end
58
58
 
59
- describe ".contacts" do
60
- it "returns a DebtorContactProxy" do
61
- expect(subject.contacts).to be_instance_of(Economic::DebtorContactProxy)
59
+ describe ".invoices" do
60
+ it "return nothing if no handle" do
61
+ expect(subject.invoices).to be_empty
62
+ end
63
+ it "returns invoices if there is a handle" do
64
+ mock_request('Debtor_GetInvoices', {"debtorHandle"=>{"Number"=>1}}, :success)
65
+ subject.handle = Economic::Entity::Handle.new({:number => "1"})
66
+ subject.invoices.each do |i|
67
+ expect(i).to be_instance_of(Economic::Invoice)
68
+ end
62
69
  end
70
+ end
63
71
 
64
- it "memoizes the proxy" do
65
- expect(subject.contacts).to equal(subject.contacts)
72
+ describe ".orders" do
73
+ it "return nothing if no handle" do
74
+ expect(subject.orders).to be_empty
75
+ end
76
+ it "returns invoices if there is a handle" do
77
+ mock_request('Debtor_GetOrders', {"debtorHandle"=>{"Number"=>1}}, :success)
78
+ subject.handle = Economic::Entity::Handle.new({:number => "1"})
79
+ subject.orders.each do |i|
80
+ expect(i).to be_instance_of(Economic::Order)
81
+ end
66
82
  end
83
+ end
67
84
 
68
- it "should store the session" do
69
- expect(subject.session).to_not be_nil
70
- expect(subject.contacts.session).to eq(subject.session)
85
+ describe ".contacts" do
86
+ it "returns nothing if no handle" do
87
+ expect(subject.contacts).to be_empty
88
+ end
89
+
90
+ it "returns debtor contacts if there is a handle" do
91
+ mock_request('Debtor_GetDebtorContacts', {"debtorHandle"=>{"Number"=>1}}, :multiple)
92
+ subject.handle = Economic::Entity::Handle.new({:number => "1"})
93
+ subject.contacts.each do |contact|
94
+ expect(contact).to be_instance_of(Economic::DebtorContact)
95
+ end
71
96
  end
72
97
  end
73
98
 
@@ -68,4 +68,22 @@ describe Economic::Endpoint do
68
68
  expect(subject.soap_action_name("FooBar", "Stuff")).to eq(:foo_bar_stuff)
69
69
  end
70
70
  end
71
+
72
+ describe "savon globals configuration" do
73
+ it "sets the log_level option of the endpoint" do
74
+ subject.client.globals.should_receive(:log_level).with(:fatal)
75
+ subject.log_level = :fatal
76
+ end
77
+
78
+ it "sets the log option of the endpoint" do
79
+ subject.client.globals.should_receive(:log).with(true)
80
+ subject.log = true
81
+ end
82
+
83
+ it "sets the logger option of the boolean" do
84
+ logger = double("MyLogger")
85
+ subject.client.globals.should_receive(:logger).with(logger)
86
+ subject.logger = logger
87
+ end
88
+ end
71
89
  end
@@ -162,10 +162,10 @@ describe Economic::Entity::Handle do
162
162
  end
163
163
 
164
164
  describe ".to_hash" do
165
- subject { Economic::Entity::Handle.new({:id => 42, :number => 37, :serial_number => 7, :code => "USD", :vat_code => 1}) }
165
+ subject { Economic::Entity::Handle.new({:id => 42, :number => 37, :serial_number => 7, :code => "USD", :name => "Bob", :vat_code => 1}) }
166
166
 
167
167
  it "should return a handle for putting into the body of a SOAP request" do
168
- expect(subject.to_hash).to eq({'Id' => 42, 'Number' => 37, 'SerialNumber' => 7, 'Code' => 'USD', 'VatCode' => 1})
168
+ expect(subject.to_hash).to eq({'Id' => 42, 'Number' => 37, 'SerialNumber' => 7, 'Code' => 'USD', 'Name' => 'Bob', 'VatCode' => 1})
169
169
  end
170
170
 
171
171
  it "includes only the named value in the hash" do
@@ -0,0 +1,80 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe Economic::Order do
4
+ let(:session) { make_session }
5
+ subject { Economic::Order.new(:session => session, :number => 512) }
6
+
7
+ it "inherits from Economic::Entity" do
8
+ expect(Economic::Order.ancestors).to include(Economic::Entity)
9
+ end
10
+
11
+ describe ".proxy" do
12
+ it "should return a OrderProxy" do
13
+ expect(subject.proxy).to be_instance_of(Economic::OrderProxy)
14
+ end
15
+
16
+ it "should return a proxy owned by session" do
17
+ expect(subject.proxy.session).to eq(session)
18
+ end
19
+ end
20
+
21
+ describe ".key" do
22
+ it "should == :invoice" do
23
+ expect(Economic::Order.key).to eq(:order)
24
+ end
25
+ end
26
+
27
+ describe "#pdf" do
28
+ it "gets PDF data from API" do
29
+ mock_request('Order_GetPdf', {'orderHandle' => {'Number' => 512}}, :success)
30
+ subject.pdf
31
+ end
32
+
33
+ it "decodes the base64Binary encoded data" do
34
+ stub_request('Order_GetPdf', nil, :success)
35
+ expect(subject.pdf).to eq('This is not really PDF data')
36
+ end
37
+ end
38
+
39
+ describe "#attention" do
40
+ let(:contact) {
41
+ Economic::DebtorContact.new.tap do |c|
42
+ c.session = session
43
+ c.id = 5
44
+ end
45
+ }
46
+
47
+ it "should be set- and gettable" do
48
+ subject.attention = contact
49
+ expect(subject.attention).to eq(contact)
50
+ end
51
+
52
+ it "updates the handle" do
53
+ handle = Economic::Entity::Handle.new(:number => 42)
54
+ contact.handle = handle
55
+ subject.attention = contact
56
+ expect(subject.attention_handle).to eq(handle)
57
+ end
58
+ end
59
+
60
+ describe "#debtor" do
61
+ let(:debtor) {
62
+ Economic::Debtor.new.tap do |c|
63
+ c.session = session
64
+ c.number = 5
65
+ end
66
+ }
67
+
68
+ it "should be set- and gettable" do
69
+ subject.debtor = debtor
70
+ expect(subject.debtor).to eq(debtor)
71
+ end
72
+
73
+ it "updates the handle" do
74
+ handle = Economic::Entity::Handle.new(:number => 42)
75
+ debtor.handle = handle
76
+ subject.debtor = debtor
77
+ expect(subject.debtor_handle).to eq(handle)
78
+ end
79
+ end
80
+ end
@@ -25,7 +25,7 @@ describe Economic::DebtorContactProxy do
25
25
 
26
26
  context "when owner is a Debtor" do
27
27
  let(:debtor) { make_debtor(:session => session) }
28
- subject { debtor.contacts }
28
+ subject { Economic::DebtorContactProxy.new(debtor) }
29
29
 
30
30
  it "should use the Debtors session" do
31
31
  expect(subject.build.session).to eq(debtor.session)
@@ -68,6 +68,23 @@ describe Economic::DebtorProxy do
68
68
  end
69
69
  end
70
70
 
71
+ describe "find_by_telephone_and_fax_number" do
72
+ it "can find a debtor" do
73
+ mock_request('Debtor_FindByTelephoneAndFaxNumber', {'telephoneAndFaxNumber' => '22334455'}, :found)
74
+ result = subject.find_by_telephone_and_fax_number('22334455')
75
+ expect(result).to be_instance_of(Economic::Debtor)
76
+ expect(result.number).to eq(1)
77
+ expect(result.partial).to be_true
78
+ expect(result.persisted).to be_true
79
+ end
80
+
81
+ it "returns nil when there is no debtor" do
82
+ mock_request('Debtor_FindByTelephoneAndFaxNumber', {'telephoneAndFaxNumber' => '22334455'}, :not_found)
83
+ result = subject.find_by_telephone_and_fax_number('22334455')
84
+ expect(result).to be_nil
85
+ end
86
+ end
87
+
71
88
  describe "next_available_number" do
72
89
  it "gets the next available debtor number from API" do
73
90
  mock_request('Debtor_GetNextAvailableNumber', nil, :success)
@@ -112,4 +129,56 @@ describe Economic::DebtorProxy do
112
129
  expect(all.first).to be_instance_of(Economic::Debtor)
113
130
  end
114
131
  end
132
+
133
+ describe ".get_debtor_contacts" do
134
+ let(:handle) { Economic::Entity::Handle.new({:number => 1}) }
135
+ it "gets debtor contact data from API" do
136
+ mock_request('Debtor_GetDebtorContacts', {"debtorHandle"=>{"Number"=>1}}, :multiple)
137
+ subject.get_debtor_contacts(handle)
138
+ end
139
+
140
+ it "returns DebtorContact objects" do
141
+ stub_request('Debtor_GetDebtorContacts', nil, :multiple)
142
+ subject.get_debtor_contacts(handle).each do |d|
143
+ expect(d).to be_instance_of(Economic::DebtorContact)
144
+ end
145
+ end
146
+ end
147
+
148
+ describe ".get_invoices" do
149
+ let(:handle) { Economic::Entity::Handle.new({:number => 1}) }
150
+ it "gets invoice data from API" do
151
+ mock_request('Debtor_GetInvoices', {"debtorHandle"=>{"Number"=>1}}, :success)
152
+ subject.get_invoices(handle)
153
+ end
154
+
155
+ it "returns Invoice object" do
156
+ stub_request('Debtor_GetInvoices', nil, :success)
157
+ subject.get_invoices(handle).each do |i|
158
+ expect(i).to be_instance_of(Economic::Invoice)
159
+ end
160
+ end
161
+ end
162
+
163
+ describe ".get_order" do
164
+ let(:handle) { Economic::Entity::Handle.new({:number => 1}) }
165
+ it "gets invoice data from API" do
166
+ mock_request('Debtor_GetOrders', {"debtorHandle"=>{"Number"=>1}}, :success)
167
+ subject.get_orders(handle)
168
+ end
169
+
170
+ it "returns Order object" do
171
+ stub_request('Debtor_GetOrders', nil, :success)
172
+ subject.get_orders(handle).each do |i|
173
+ expect(i).to be_instance_of(Economic::Order)
174
+ end
175
+ end
176
+
177
+ it "sets the number" do
178
+ stub_request('Debtor_GetOrders', nil, :success)
179
+ subject.get_orders(handle).each do |i|
180
+ expect(i.number).to eq(1)
181
+ end
182
+ end
183
+ end
115
184
  end
@@ -0,0 +1,67 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe Economic::OrderProxy do
4
+
5
+ let(:session) { make_session }
6
+ subject { Economic::OrderProxy.new(session) }
7
+
8
+ describe ".new" do
9
+ it "stores session" do
10
+ expect(subject.session).to equal(session)
11
+ end
12
+ end
13
+
14
+ describe ".build" do
15
+ it "instantiates a new Order" do
16
+ expect(subject.build).to be_instance_of(Economic::Order)
17
+ end
18
+
19
+ it "assigns the session to the Order" do
20
+ expect(subject.build.session).to equal(session)
21
+ end
22
+
23
+ it "should not build a partial Order" do
24
+ expect(subject.build).to_not be_partial
25
+ end
26
+ end
27
+
28
+ describe ".find" do
29
+ it "gets order data from API" do
30
+ mock_request('Order_GetData', {'entityHandle' => {'Id' => 42}}, :success)
31
+ subject.find(42)
32
+ end
33
+
34
+ it "returns Order object" do
35
+ stub_request('Order_GetData', nil, :success)
36
+ expect(subject.find(42)).to be_instance_of(Economic::Order)
37
+ end
38
+ end
39
+
40
+ describe ".find_by_date_interval" do
41
+ let(:from) { Time.now - 60 }
42
+ let(:unto) { Time.now }
43
+
44
+ it "should be able to return a single current order" do
45
+ mock_request('Order_FindByDateInterval', {'first' => from.iso8601, 'last' => unto.iso8601}, :single)
46
+ mock_request('Order_GetDataArray', :any, :single)
47
+ results = subject.find_by_date_interval(from, unto)
48
+ expect(results.size).to eq(1)
49
+ expect(results.first).to be_instance_of(Economic::Order)
50
+ end
51
+
52
+ it "should be able to return multiple orders" do
53
+ mock_request('Order_FindByDateInterval', {'first' => from.iso8601, 'last' => unto.iso8601}, :many)
54
+ mock_request('Order_GetDataArray', :any, :multiple)
55
+ results = subject.find_by_date_interval(from, unto)
56
+ expect(results.size).to eq(2)
57
+ expect(results.first).to be_instance_of(Economic::Order)
58
+ end
59
+
60
+ it "should be able to return nothing" do
61
+ mock_request('Order_FindByDateInterval', {'first' => from.iso8601, 'last' => unto.iso8601}, :none)
62
+ results = subject.find_by_date_interval(from, unto)
63
+ expect(results.size).to eq(0)
64
+ end
65
+
66
+ end
67
+ end
@@ -1,24 +1,42 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Economic::Session do
4
- subject { Economic::Session.new(123456, 'api', 'passw0rd') }
4
+ let(:credentials) { [123456, 'api', 'passw0rd'] }
5
+ subject { Economic::Session.new }
5
6
 
6
7
  let(:endpoint) { subject.endpoint }
7
8
 
8
9
  describe "new" do
9
- it "should store authentication details" do
10
- expect(subject.agreement_number).to eq(123456)
11
- expect(subject.user_name).to eq('api')
12
- expect(subject.password).to eq('passw0rd')
10
+ describe "legacy connect" do
11
+ subject { Economic::Session.new *credentials }
12
+ it "should store authentication details" do
13
+ expect(subject.agreement_number).to eq(123456)
14
+ expect(subject.user_name).to eq('api')
15
+ expect(subject.password).to eq('passw0rd')
16
+ end
17
+ end
18
+
19
+ it "yields the endpoint if a block is given" do
20
+ endpoint_mock = double("Endpoint")
21
+ Economic::Endpoint.stub(:new).and_return(endpoint_mock)
22
+ expect{|b|
23
+ Economic::Session.new(123456, 'api', 'passw0rd', &b)
24
+ }.to yield_with_args(endpoint_mock)
13
25
  end
14
26
  end
15
27
 
16
28
  describe "connect" do
17
29
  let(:authentication_details) { {:agreementNumber => 123456, :userName => 'api', :password => 'passw0rd'} }
18
30
 
31
+ it "can connect old-style" do
32
+ mock_request(:connect, authentication_details, :success)
33
+ e = Economic::Session.new(*credentials)
34
+ e.connect
35
+ end
36
+
19
37
  it "connects to e-conomic with authentication details" do
20
38
  mock_request(:connect, authentication_details, :success)
21
- subject.connect
39
+ subject.connect_with_credentials(*credentials)
22
40
  end
23
41
 
24
42
  it "stores the authentication token for later requests" do
@@ -28,7 +46,7 @@ describe Economic::Session do
28
46
  }
29
47
  stub_request('Connect', authentication_details, response)
30
48
 
31
- subject.connect
49
+ subject.connect_with_credentials(*credentials)
32
50
 
33
51
  expect(subject.authentication_token.collect { |cookie|
34
52
  cookie.name_and_value.split("=").last
@@ -37,11 +55,11 @@ describe Economic::Session do
37
55
 
38
56
  it "updates the authentication token for new sessions" do
39
57
  stub_request("Connect", nil, {:headers => {"Set-Cookie" => "authentication token"}})
40
- subject.connect
58
+ subject.connect_with_credentials(*credentials)
41
59
 
42
60
  stub_request('Connect', nil, {:headers => {"Set-Cookie" => "another token"}})
43
- other_session = Economic::Session.new(123456, 'api', 'passw0rd')
44
- other_session.connect
61
+ other_session = Economic::Session.new
62
+ other_session.connect_with_credentials(123456, 'api', 'passw0rd')
45
63
 
46
64
  expect(subject.authentication_token.collect { |cookie|
47
65
  cookie.name_and_value.split("=").last
@@ -53,7 +71,54 @@ describe Economic::Session do
53
71
 
54
72
  it "doesn't use existing authentication details when connecting" do
55
73
  expect(endpoint).to receive(:call).with(:connect, instance_of(Hash))
56
- subject.connect
74
+ subject.connect_with_credentials(*credentials)
75
+ end
76
+ end
77
+
78
+ describe "connecting with access ID" do
79
+ # As per http://www.e-conomic.com/developer/tutorials
80
+ let(:authentication_details) { {:appToken => 'the_private_app_id', :token => 'the_access_id_you_got_from_the_grant'} }
81
+ let(:private_app_id) { authentication_details[:appToken] }
82
+ let(:access_id) { authentication_details[:token] }
83
+ subject { Economic::Session.new }
84
+ it "connects to e-conomic with tokens details" do
85
+ mock_request(:connect_with_token, authentication_details, :success)
86
+ subject.connect_with_token private_app_id, access_id
87
+ end
88
+
89
+ it "stores the authentication token for later requests" do
90
+ response = {
91
+ :headers => {'Set-Cookie' => 'cookie value from e-conomic'},
92
+ :body => fixture(:connect_with_token, :success)
93
+ }
94
+ stub_request('ConnectWithToken', authentication_details, response)
95
+
96
+ subject.connect_with_token private_app_id, access_id
97
+
98
+ expect(subject.authentication_token.collect { |cookie|
99
+ cookie.name_and_value.split("=").last
100
+ }).to eq(["cookie value from e-conomic"])
101
+ end
102
+
103
+ it "updates the authentication token for new sessions" do
104
+ stub_request("ConnectWithToken", nil, {:headers => {"Set-Cookie" => "authentication token"}})
105
+ subject.connect_with_token private_app_id, access_id
106
+
107
+ stub_request('Connect', nil, {:headers => {"Set-Cookie" => "another token"}})
108
+ other_session = Economic::Session.new
109
+ other_session.connect_with_credentials(123456, 'api', 'passw0rd')
110
+
111
+ expect(subject.authentication_token.collect { |cookie|
112
+ cookie.name_and_value.split("=").last
113
+ }).to eq(["authentication token"])
114
+ expect(other_session.authentication_token.collect { |cookie|
115
+ cookie.name_and_value.split("=").last
116
+ }).to eq(["another token"])
117
+ end
118
+
119
+ it "doesn't use existing authentication details when connecting" do
120
+ expect(endpoint).to receive(:call).with(:connect_with_token, instance_of(Hash))
121
+ subject.connect_with_token private_app_id, access_id
57
122
  end
58
123
  end
59
124
 
@@ -135,4 +200,27 @@ describe Economic::Session do
135
200
  end
136
201
  end
137
202
 
203
+ describe "savon configuration" do
204
+ let(:endpoint) { double("Endpoint") }
205
+
206
+ before :each do
207
+ Economic::Endpoint.stub(:new).and_return(endpoint)
208
+ end
209
+
210
+ it "sets the log_level option of the endpoint" do
211
+ endpoint.should_receive(:log_level=).with(:info)
212
+ subject.log_level = :info
213
+ end
214
+
215
+ it "sets the log option of the endpoint" do
216
+ endpoint.should_receive(:log=).with(true)
217
+ subject.log = true
218
+ end
219
+
220
+ it "sets the logger option of the boolean" do
221
+ logger = double("MyLogger")
222
+ endpoint.should_receive(:logger=).with(logger)
223
+ subject.logger = logger
224
+ end
225
+ end
138
226
  end