zoho_invoice 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  *.rbc
3
+ *.swp
3
4
  .bundle
4
5
  .config
5
6
  .yardoc
data/lib/zoho_invoice.rb CHANGED
@@ -4,6 +4,8 @@ require 'nokogiri'
4
4
  require 'multi_xml'
5
5
 
6
6
  require 'zoho_invoice/core_ext/string'
7
+ require 'zoho_invoice/error'
8
+ require 'zoho_invoice/error/client_error'
7
9
 
8
10
  require 'zoho_invoice/configurable'
9
11
  require 'zoho_invoice/auth_token'
@@ -1,7 +1,4 @@
1
1
  module ZohoInvoice
2
- class Error < Struct.new(:message, :code, :status, :http_status)
3
- end
4
-
5
2
  # Used for instances when some of the representations in zoho
6
3
  # dont have their own end points in the API
7
4
  #
@@ -33,19 +30,11 @@ module ZohoInvoice
33
30
  def self.search(client, input_text, options = {})
34
31
  result_hash = client.get("/api/view/search/#{self.to_s.split('::').last.downcase}s", :searchtext => input_text).body
35
32
  objects_to_hydrate = result_hash['Response']["#{self.to_s.split('::').last}s"]["#{self.to_s.split('::').last}"]
36
- if objects_to_hydrate.nil?
37
- return []
38
- else
39
- objects_to_hydrate.map do |result|
40
- new_hash = {}
41
- result.each do |key, value|
42
- new_hash[key.to_underscore.to_sym] = value if !value.is_a?(Hash) && !value.is_a?(Array)
43
- end
44
- self.new(client, new_hash)
45
- end
46
- end
33
+ self.process_objects(client, objects_to_hydrate)
47
34
  rescue Faraday::Error::ClientError => e
48
- return []
35
+ if e.response[:body]
36
+ raise ZohoInvoice::Error::ClientError.from_response(e.response)
37
+ end
49
38
  end
50
39
 
51
40
  def initialize(client, options = {})
@@ -84,14 +73,9 @@ module ZohoInvoice
84
73
  self.class.instance_variable_get(:'@attributes') || []
85
74
  end
86
75
 
87
- def errors
88
- @errors ||= []
89
- end
90
-
91
76
  # TODO Determining the resource to use will need to change
92
77
  #
93
78
  def save
94
- @errors = []
95
79
 
96
80
  action = 'create'
97
81
  action = 'update' if !send("#{self.class.to_s.split('::').last.downcase}_id").nil?
@@ -105,9 +89,8 @@ module ZohoInvoice
105
89
  self
106
90
  rescue Faraday::Error::ClientError => e
107
91
  if e.response[:body]
108
- self.errors << process_error(e.response)
92
+ raise ZohoInvoice::Error::ClientError.from_response(e.response)
109
93
  end
110
- return self
111
94
  end
112
95
 
113
96
  # This needs to be a Nokogiri::XML::Builder
@@ -124,21 +107,7 @@ module ZohoInvoice
124
107
 
125
108
  protected
126
109
 
127
- def process_error(request_result)
128
- self.class.process_error(request_result)
129
- end
130
-
131
- def self.process_error(request_result)
132
- error = Error.new
133
- response_body = request_result[:body]
134
- error.status = response_body['Response']['status']
135
- error.code = response_body['Response']['Code']
136
- error.message = response_body['Response']['Message']
137
- error.http_status = request_result[:status]
138
- error
139
- end
140
-
141
- def self.camel_case(str)
110
+ def self.camel_case(str)
142
111
  return str if str !~ /_/ && str =~ /[A-Z]+.*/
143
112
  str.split('_').map{|e| e.capitalize}.join
144
113
  end
@@ -167,5 +136,24 @@ module ZohoInvoice
167
136
  end
168
137
  end
169
138
 
139
+ private
140
+
141
+ def self.process_objects(client, objects_to_hydrate)
142
+ if objects_to_hydrate.nil?
143
+ return []
144
+ else
145
+ if objects_to_hydrate.is_a?(Hash) #Convert hash to array if only a single object is returned
146
+ objects_to_hydrate = [objects_to_hydrate]
147
+ end
148
+ objects_to_hydrate.map do |result|
149
+ new_hash = {}
150
+ result.each do |key, value|
151
+ new_hash[key.to_underscore.to_sym] = value if !value.is_a?(Hash) && !value.is_a?(Array)
152
+ end
153
+ self.new(client, new_hash)
154
+ end
155
+ end
156
+ end
157
+
170
158
  end
171
159
  end
@@ -1,7 +1,6 @@
1
1
  module ZohoInvoice
2
- class Error
3
-
4
- attr_accessor :message, :code
2
+ class Error < StandardError
5
3
 
4
+ attr_accessor :message, :code, :response_status, :http_status
6
5
  end
7
6
  end
@@ -0,0 +1,28 @@
1
+ require 'zoho_invoice/error'
2
+
3
+ module ZohoInvoice
4
+ class Error
5
+ class ClientError < ZohoInvoice::Error
6
+
7
+ def self.from_response(response={})
8
+ self.parse_error(response)
9
+ end
10
+
11
+ private
12
+
13
+ def self.parse_error(response)
14
+ error = self.new
15
+ if !response[:body].nil?
16
+ response_body = response[:body]
17
+ error.response_status = response_body['Response']['status']
18
+ error.code = response_body['Response']['Code']
19
+ error.message = response_body['Response']['Message']
20
+ end
21
+ error.http_status = response[:status]
22
+ error
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+
@@ -21,5 +21,43 @@ module ZohoInvoice
21
21
 
22
22
  has_many :invoice_items
23
23
 
24
+ def self.find_by_customer_id(client, id, options = {})
25
+ result_hash = client.get("/api/view/invoices/customer/#{id}").body
26
+ potential_objects = result_hash['Response']["Invoices"]
27
+ objects_to_hydrate = potential_objects["Invoice"] if potential_objects
28
+ self.process_objects(client, objects_to_hydrate)
29
+ rescue Faraday::Error::ClientError => e
30
+ if e.response[:body]
31
+ raise ZohoInvoice::Error::ClientError.from_response(e.response)
32
+ end
33
+ end
34
+
35
+ def self.find_by_multiple_customer_ids(client, ids, options={})
36
+ new_hash = {}
37
+ ids.each do |customer|
38
+ new_hash[customer] = self.find_by_customer_id(client, customer, options)
39
+ end
40
+ return new_hash
41
+ end
42
+
43
+ def self.find_unpaid_by_customer_id(client, id, options = {})
44
+ result_hash = client.get("/api/view/invoices/unpaid/customer/#{id}").body
45
+ potential_objects = result_hash['Response']["Invoices"]
46
+ objects_to_hydrate = potential_objects["Invoice"] if potential_objects
47
+ self.process_objects(client, objects_to_hydrate)
48
+ rescue Faraday::Error::ClientError => e
49
+ if e.response[:body]
50
+ raise ZohoInvoice::Error::ClientError.from_response(e.response)
51
+ end
52
+ end
53
+
54
+ def self.find_unpaid_by_multiple_customer_ids(client, ids, options={})
55
+ new_hash = {}
56
+ ids.each do |customer|
57
+ new_hash[customer] = self.find_unpaid_by_customer_id(client, customer, options)
58
+ end
59
+ return new_hash
60
+ end
61
+
24
62
  end
25
63
  end
@@ -1,3 +1,3 @@
1
1
  module ZohoInvoice
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,3 @@
1
+ <Response>
2
+ <Invoices/>
3
+ </Response>
@@ -0,0 +1,3 @@
1
+ <Response>
2
+ <Somethings uri='/api/views/search/somethings'></Somethings>
3
+ </Response>
@@ -0,0 +1,12 @@
1
+ <Response>
2
+ <Invoices uri='/api/views/invoices/customer/1234'>
3
+ <Invoice>
4
+ <InvoiceID>1</InvoiceID>
5
+ <Status>Open</Status>
6
+ </Invoice>
7
+ <Invoice>
8
+ <InvoiceID>2</InvoiceID>
9
+ <Status>Closed</Status>
10
+ </Invoice>
11
+ </Invoices>
12
+ </Response>
@@ -0,0 +1,12 @@
1
+ <Response>
2
+ <Somethings uri='/api/views/search/somethings'>
3
+ <Something>
4
+ <SomethingID>1</SomethingID>
5
+ <Blah>1234</Blah>
6
+ </Something>
7
+ <Something>
8
+ <SomethingID>2</SomethingID>
9
+ <Blah>1234</Blah>
10
+ </Something>
11
+ </Somethings>
12
+ </Response>
@@ -0,0 +1,8 @@
1
+ <Response>
2
+ <Invoices uri='/api/views/invoices/customer/1234'>
3
+ <Invoice>
4
+ <InvoiceID>1</InvoiceID>
5
+ <Status>Open</Status>
6
+ </Invoice>
7
+ </Invoices>
8
+ </Response>
@@ -0,0 +1,8 @@
1
+ <Response>
2
+ <Somethings uri='/api/views/search/somethings'>
3
+ <Something>
4
+ <SomethingID>1</SomethingID>
5
+ <Blah>1234</Blah>
6
+ </Something>
7
+ </Somethings>
8
+ </Response>
@@ -0,0 +1,4 @@
1
+ <Something>
2
+ <SomethingID>1</SomethingID>
3
+ <Blah>1234</Blah>
4
+ </Something>
@@ -0,0 +1,3 @@
1
+ <Response>
2
+ <Invoices/>
3
+ </Response>
@@ -0,0 +1,12 @@
1
+ <Response>
2
+ <Invoices uri='/api/views/invoices/unpaid/customer/1234'>
3
+ <Invoice>
4
+ <InvoiceID>1</InvoiceID>
5
+ <Status>Open</Status>
6
+ </Invoice>
7
+ <Invoice>
8
+ <InvoiceID>2</InvoiceID>
9
+ <Status>Overdue</Status>
10
+ </Invoice>
11
+ </Invoices>
12
+ </Response>
@@ -0,0 +1,8 @@
1
+ <Response>
2
+ <Invoices uri='/api/views/invoices/unpaid/customer/1234'>
3
+ <Invoice>
4
+ <InvoiceID>1</InvoiceID>
5
+ <Status>Open</Status>
6
+ </Invoice>
7
+ </Invoices>
8
+ </Response>
data/spec/spec_helper.rb CHANGED
@@ -22,6 +22,55 @@ RSpec.configure do |config|
22
22
  end
23
23
  end
24
24
 
25
+ def invoice_test(path, fixture_to_use, num_invoices, match_regex, method_to_test, *args)
26
+ stub_get(path).
27
+ with(:query => default_credentials).
28
+ to_return(:status => 200, :body => fixture(fixture_to_use), :headers => {:content_type => 'application/xml'})
29
+ result = ZohoInvoice::Invoice.send(method_to_test, args[0], args[1])
30
+ expect(a_get(path).with(:query => default_credentials)).to have_been_made
31
+ expect(result.class).to eq(Array)
32
+ expect(result.length).to eq(num_invoices)
33
+ if num_invoices > 0
34
+ result.each_with_index do |r, i|
35
+ expect(r.class).to eq(ZohoInvoice::Invoice)
36
+ expect(r.invoice_id).to eq((i+1).to_s)
37
+ expect(r.status).to match(match_regex)
38
+ end
39
+ end
40
+ end
41
+
42
+ def multiple_invoice_test(fixture_to_use, num_customers, method_to_test, method_to_stub, *args)
43
+ ZohoInvoice::Invoice.stub(method_to_stub).and_return([{'InvoiceID' => 1, 'CustomerName' => 'SampleName', 'Status' => 'Open', 'InvoiceDate' => 'January 1, 2013', 'Balance' => '$299.99'}])
44
+
45
+ result = ZohoInvoice::Invoice.send(method_to_test, args[0], args[1])
46
+ expect(result.class).to eq(Hash)
47
+ expect(result.length).to eq(num_customers)
48
+ if num_customers > 0
49
+ args[1].each do |id|
50
+ customer = result[id]
51
+ expect(customer.class).to eq(Array)
52
+ end
53
+ end
54
+ end
55
+
56
+ def error_test(path, fixture_to_use, method_to_test, message, code, response_status, http_status, *args)
57
+ stub_get(path).
58
+ with(:query => default_credentials).
59
+ to_return(:status => 500, :body => fixture(fixture_to_use), :headers => { :content_type => 'application/xml' })
60
+ expect { ZohoInvoice::Invoice.send(method_to_test, args[0], args[1]) }.to raise_error { |e|
61
+ error_expectations(e, message, code, response_status, http_status)
62
+ }
63
+ expect(a_get(path).with(query: default_credentials)).to have_been_made
64
+ end
65
+
66
+ def error_expectations(object, message, code, response_status, http_status)
67
+ expect(object.class).to eq(ZohoInvoice::Error::ClientError)
68
+ expect(object.message).to eq(message)
69
+ expect(object.code).to eq(code)
70
+ expect(object.response_status).to eq(response_status)
71
+ expect(object.http_status).to eq(http_status)
72
+ end
73
+
25
74
  def stub_get(path)
26
75
  stub_request(:get, ZohoInvoice::Defaults::URL + path)
27
76
  end
@@ -109,7 +109,7 @@ describe ZohoInvoice::Base do
109
109
  body_params = default_credentials.merge(:XMLString => @test_obj.to_xml)
110
110
  stub_post('/api/somethings/create').
111
111
  with(:body => body_params).
112
- to_return(:status => 200, :body => successful_something_response('5555'), :headers => {:content_type => 'application/xml'})
112
+ to_return(:status => 200, :body => fixture('successful_something_response'), :headers => {:content_type => 'application/xml'})
113
113
  @test_obj.save
114
114
  expect(a_post('/api/somethings/create').with(:body => body_params)).to have_been_made
115
115
  end
@@ -119,7 +119,7 @@ describe ZohoInvoice::Base do
119
119
  body_params = default_credentials.merge(:XMLString => @test_obj.to_xml)
120
120
  stub_post('/api/somethings/update').
121
121
  with(:body => body_params).
122
- to_return(:status => 200, :body => successful_something_response('123456'), :headers => {:content_type => 'application/xml'})
122
+ to_return(:status => 200, :body => fixture('successful_something_response'), :headers => {:content_type => 'application/xml'})
123
123
  @test_obj.save
124
124
  expect(a_post('/api/somethings/update').with(:body => body_params)).to have_been_made
125
125
  end
@@ -129,7 +129,7 @@ describe ZohoInvoice::Base do
129
129
  body_params = default_credentials.merge(:XMLString => @test_obj.to_xml)
130
130
  stub_post('/api/somethings/create').
131
131
  with(:body => body_params).
132
- to_return(:status => 200, :body => successful_something_response("1234"), :headers => { :content_type => 'application/xml' })
132
+ to_return(:status => 200, :body => fixture('successful_something_response'), :headers => { :content_type => 'application/xml' })
133
133
  test_obj = Something.create(@client, :blah => '1234')
134
134
  expect(a_post('/api/somethings/create').with(:body => body_params)).to have_been_made
135
135
  expect(test_obj.something_id).to eq('1')
@@ -139,27 +139,24 @@ describe ZohoInvoice::Base do
139
139
  @test_obj.blah = '1234'
140
140
  body_params = default_credentials.merge(:XMLString => @test_obj.to_xml)
141
141
  stub_post('/api/somethings/create').with(:body => body_params).to_return(:status => 500, :body => fixture('500_internal_server_error'), :headers => { :content_type => 'application/xml' })
142
- test_obj = Something.create(@client, :blah => '1234')
143
- expect(test_obj.something_id).to be_nil
144
- expect(test_obj.errors.length).to eq(1)
145
- error = test_obj.errors.first
146
- expect(error.message).to eq("Invalid value passed for XMLString")
147
- expect(error.code).to eq('2')
148
- expect(error.status).to eq('0')
149
- expect(error.http_status).to eq(500)
142
+ expect { Something.create(@client, :blah => '1234') }.to raise_error { |e|
143
+ error_expectations(e, 'Invalid value passed for XMLString', '2', '0', 500)
144
+ }
150
145
  end
146
+
151
147
  end
152
148
 
153
149
  describe "searching" do
154
- it "returns an array if it can find anything" do
150
+
151
+ it "returns an array if it finds a single record" do
155
152
  body_params = default_credentials.merge(:searchtext => '1234')
156
153
  stub_get('/api/view/search/somethings').
157
154
  with(:query => body_params).
158
- to_return(:status => 200, :body => successful_multiple_record_response('1234'), :headers => {:content_type => 'application/xml'})
155
+ to_return(:status => 200, :body => fixture('successful_single_record_response'), :headers => {:content_type => 'application/xml'})
159
156
  result = Something.search(@client, '1234')
160
157
  expect(a_get('/api/view/search/somethings').with(query: body_params)).to have_been_made
161
158
  expect(result.class).to eq(Array)
162
- expect(result.length).to eq(2)
159
+ expect(result.length).to eq(1)
163
160
  result.each_with_index do |r, i|
164
161
  expect(r.class).to eq(Something)
165
162
  expect(r.something_id).to eq((i+1).to_s)
@@ -167,41 +164,43 @@ describe ZohoInvoice::Base do
167
164
  end
168
165
  end
169
166
 
170
- it "returns an empty array if it cant find anything" do
167
+ it "returns an array if it finds multiple records" do
171
168
  body_params = default_credentials.merge(:searchtext => '1234')
172
169
  stub_get('/api/view/search/somethings').
173
170
  with(:query => body_params).
174
- to_return(:status => 200, :body => successful_empty_response, :headers => {:content_type => 'application/xml'})
171
+ to_return(:status => 200, :body => fixture('successful_multiple_record_response'), :headers => {:content_type => 'application/xml'})
175
172
  result = Something.search(@client, '1234')
176
173
  expect(a_get('/api/view/search/somethings').with(query: body_params)).to have_been_made
177
174
  expect(result.class).to eq(Array)
178
- expect(result.length).to eq(0)
175
+ expect(result.length).to eq(2)
176
+ result.each_with_index do |r, i|
177
+ expect(r.class).to eq(Something)
178
+ expect(r.something_id).to eq((i+1).to_s)
179
+ expect(r.blah).to eq('1234')
180
+ end
179
181
  end
180
182
 
181
- # TODO Needs to change because you'll have no idea an error happened
182
- #
183
- it "should return an empty array if theres an error" do
183
+ it "returns an empty array if it cant find anything" do
184
184
  body_params = default_credentials.merge(:searchtext => '1234')
185
185
  stub_get('/api/view/search/somethings').
186
186
  with(:query => body_params).
187
- to_return(:status => 500)
187
+ to_return(:status => 200, :body => fixture('successful_empty_response'), :headers => {:content_type => 'application/xml'})
188
188
  result = Something.search(@client, '1234')
189
189
  expect(a_get('/api/view/search/somethings').with(query: body_params)).to have_been_made
190
190
  expect(result.class).to eq(Array)
191
191
  expect(result.length).to eq(0)
192
192
  end
193
- end
194
-
195
- def successful_something_response(blah_payload)
196
- "<Something><SomethingID>1</SomethingID><Blah>#{blah_payload}</Blah></Something>"
197
- end
198
-
199
- def successful_multiple_record_response(payload)
200
- "<Response><Somethings uri='/api/views/search/somethings'><Something><SomethingID>1</SomethingID><Blah>#{payload}</Blah></Something><Something><SomethingID>2</SomethingID><Blah>#{payload}</Blah></Something></Somethings></Response>"
201
- end
202
193
 
203
- def successful_empty_response
204
- "<Response><Somethings uri='/api/views/search/somethings'></Somethings></Response>"
194
+ it "should return an error if theres an error" do
195
+ body_params = default_credentials.merge(:searchtext => '1234')
196
+ stub_get('/api/view/search/somethings').
197
+ with(:query => body_params).
198
+ to_return(:status => 500, :body => fixture('500_internal_server_error'), :headers => {:content_type => 'application/xml'})
199
+ expect { Something.search(@client, '1234') }.to raise_error { |e|
200
+ error_expectations(e, 'Invalid value passed for XMLString', '2', '0', 500)
201
+ }
202
+ expect(a_get('/api/view/search/somethings').with(query: body_params)).to have_been_made
203
+ end
205
204
  end
206
205
  end
207
206
 
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe ZohoInvoice::Error::ClientError do
4
+ before do
5
+ @client = ZohoInvoice::Client.new(default_credentials)
6
+ end
7
+
8
+ it "should return a new error from a response" do
9
+ test_error = ZohoInvoice::Error::ClientError.from_response({:status=>500,
10
+ :headers=>{"content-type"=>"application/xml"},
11
+ :body=> {"Response"=>
12
+ {"Code"=>"2",
13
+ "Message"=>"Invalid value passed for XMLString",
14
+ "status"=>"0"}}})
15
+ end
16
+
17
+ it "should be able to handle a reponse with no data" do
18
+ test_error = ZohoInvoice::Error::ClientError.from_response({:status=>500,
19
+ :headers=>{"content-type"=>"application/xml"},
20
+ :body=> {"Response"=>
21
+ {"Code"=>nil,
22
+ "Message"=>nil,
23
+ "status"=>nil}}})
24
+ end
25
+
26
+ it "should be able to handle a reponse with no body" do
27
+ test_error = ZohoInvoice::Error::ClientError.from_response({:status=>500,
28
+ :headers=>{"content-type"=>"application/xml"},
29
+ :body=> nil})
30
+ end
31
+
32
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe ZohoInvoice::Invoice do
4
+
5
+ describe "searching by customer" do
6
+ before do
7
+ @client = ZohoInvoice::Client.new(default_credentials)
8
+ end
9
+
10
+ it "should return an array if a customer has a single invoice" do
11
+ invoice_test('/api/view/invoices/customer/1234', 'successful_single_customer_response', 1, /Draft|Open|Closed|Overdue|Void/, :find_by_customer_id, @client, '1234')
12
+ end
13
+
14
+ it "should return an array if a customer has multiple invoices" do
15
+ invoice_test('/api/view/invoices/customer/1234', 'successful_multiple_customer_response', 2, /Draft|Open|Closed|Overdue|Void/, :find_by_customer_id, @client, '1234')
16
+ end
17
+
18
+ it "should return an empty array if a customer doesn't have any invoices" do
19
+ invoice_test('/api/view/invoices/customer/1234', 'successful_empty_customer_response', 0, //, :find_by_customer_id, @client, '1234')
20
+ end
21
+
22
+ it "should return an error if theres an error" do
23
+ error_test('/api/view/invoices/customer/1234', '500_internal_server_error', :find_by_customer_id, 'Invalid value passed for XMLString', '2', '0', 500, @client, '1234')
24
+ end
25
+
26
+ it "should return a hash if multiple customers are searched for" do
27
+ multiple_invoice_test('invoice_array', 2, :find_by_multiple_customer_ids, :find_by_customer_id, @client, [1234, 5678])
28
+ end
29
+ end
30
+
31
+ describe "searching by customer (unpaid)" do
32
+ before do
33
+ @client = ZohoInvoice::Client.new(default_credentials)
34
+ end
35
+
36
+ it "should return an array if a customer has a single unpaid invoice" do
37
+ invoice_test('/api/view/invoices/unpaid/customer/1234', 'successful_unpaid_single_customer_response', 1, /Open|Overdue/, :find_unpaid_by_customer_id, @client, '1234')
38
+ end
39
+
40
+ it "should return an array if a customer has multiple unpaid invoices" do
41
+ invoice_test('/api/view/invoices/unpaid/customer/1234', 'successful_unpaid_multiple_customer_response', 2, /Open|Overdue/, :find_unpaid_by_customer_id, @client, '1234')
42
+ end
43
+
44
+ it "should return an empty array if a customer doesn't have any unpaid invoices" do
45
+ invoice_test('/api/view/invoices/unpaid/customer/1234', 'successful_unpaid_empty_customer_response', 0, //, :find_unpaid_by_customer_id, @client, '1234')
46
+ end
47
+
48
+ it "should return an error if theres an error" do
49
+ error_test('/api/view/invoices/unpaid/customer/1234', '500_internal_server_error', :find_unpaid_by_customer_id, 'Invalid value passed for XMLString', '2', '0', 500, @client, '1234')
50
+ end
51
+
52
+ it "should return a hash if multiple customers are searched for" do
53
+ multiple_invoice_test('invoice_array', 2, :find_unpaid_by_multiple_customer_ids, :find_unpaid_by_customer_id, @client, [1234, 5678])
54
+ end
55
+ end
56
+
57
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zoho_invoice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-15 00:00:00.000000000 Z
12
+ date: 2013-04-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -117,6 +117,7 @@ files:
117
117
  - lib/zoho_invoice/customer.rb
118
118
  - lib/zoho_invoice/defaults.rb
119
119
  - lib/zoho_invoice/error.rb
120
+ - lib/zoho_invoice/error/client_error.rb
120
121
  - lib/zoho_invoice/invoice.rb
121
122
  - lib/zoho_invoice/invoice_item.rb
122
123
  - lib/zoho_invoice/item.rb
@@ -129,12 +130,24 @@ files:
129
130
  - spec/fixtures/invalid_user
130
131
  - spec/fixtures/please_select_an_item
131
132
  - spec/fixtures/successful_authtoken
133
+ - spec/fixtures/successful_empty_customer_response
134
+ - spec/fixtures/successful_empty_response
135
+ - spec/fixtures/successful_multiple_customer_response
136
+ - spec/fixtures/successful_multiple_record_response
137
+ - spec/fixtures/successful_single_customer_response
138
+ - spec/fixtures/successful_single_record_response
139
+ - spec/fixtures/successful_something_response
140
+ - spec/fixtures/successful_unpaid_empty_customer_response
141
+ - spec/fixtures/successful_unpaid_multiple_customer_response
142
+ - spec/fixtures/successful_unpaid_single_customer_response
132
143
  - spec/spec_helper.rb
133
144
  - spec/zoho_invoice/auth_token_spec.rb
134
145
  - spec/zoho_invoice/base_spec.rb
135
146
  - spec/zoho_invoice/client_spec.rb
136
147
  - spec/zoho_invoice/collection_spec.rb
137
148
  - spec/zoho_invoice/contact_spec.rb
149
+ - spec/zoho_invoice/error/client_error_spec.rb
150
+ - spec/zoho_invoice/invoice_spec.rb
138
151
  - spec/zoho_invoice/string_spec.rb
139
152
  - spec/zoho_invoice_spec.rb
140
153
  - zoho_invoice.gemspec
@@ -171,11 +184,23 @@ test_files:
171
184
  - spec/fixtures/invalid_user
172
185
  - spec/fixtures/please_select_an_item
173
186
  - spec/fixtures/successful_authtoken
187
+ - spec/fixtures/successful_empty_customer_response
188
+ - spec/fixtures/successful_empty_response
189
+ - spec/fixtures/successful_multiple_customer_response
190
+ - spec/fixtures/successful_multiple_record_response
191
+ - spec/fixtures/successful_single_customer_response
192
+ - spec/fixtures/successful_single_record_response
193
+ - spec/fixtures/successful_something_response
194
+ - spec/fixtures/successful_unpaid_empty_customer_response
195
+ - spec/fixtures/successful_unpaid_multiple_customer_response
196
+ - spec/fixtures/successful_unpaid_single_customer_response
174
197
  - spec/spec_helper.rb
175
198
  - spec/zoho_invoice/auth_token_spec.rb
176
199
  - spec/zoho_invoice/base_spec.rb
177
200
  - spec/zoho_invoice/client_spec.rb
178
201
  - spec/zoho_invoice/collection_spec.rb
179
202
  - spec/zoho_invoice/contact_spec.rb
203
+ - spec/zoho_invoice/error/client_error_spec.rb
204
+ - spec/zoho_invoice/invoice_spec.rb
180
205
  - spec/zoho_invoice/string_spec.rb
181
206
  - spec/zoho_invoice_spec.rb