badbill 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/CONTRIBUTING.md +5 -2
  2. data/Gemfile +14 -3
  3. data/Gemfile.lock +51 -15
  4. data/Guardfile +6 -0
  5. data/LICENSE +1 -1
  6. data/README.md +8 -3
  7. data/Rakefile +5 -1
  8. data/badbill.gemspec +86 -0
  9. data/lib/badbill.rb +32 -2
  10. data/lib/badbill/base_resource.rb +51 -9
  11. data/lib/badbill/client.rb +1 -1
  12. data/lib/badbill/faraday_gzip.rb +18 -0
  13. data/lib/badbill/forward_methods.rb +6 -0
  14. data/lib/badbill/invoice.rb +31 -1
  15. data/lib/badbill/invoice_comment.rb +24 -0
  16. data/lib/badbill/invoice_item.rb +17 -0
  17. data/lib/badbill/invoice_payment.rb +28 -0
  18. data/lib/badbill/recurring.rb +11 -0
  19. data/spec/badbill/base_resource_spec.rb +1 -1
  20. data/spec/badbill/client_spec.rb +72 -68
  21. data/spec/badbill/invoice_comment_spec.rb +33 -0
  22. data/spec/badbill/invoice_item_spec.rb +17 -0
  23. data/spec/badbill/invoice_payment_spec.rb +17 -0
  24. data/spec/badbill/invoice_spec.rb +77 -176
  25. data/spec/badbill/recurring_spec.rb +18 -0
  26. data/spec/badbill_spec.rb +19 -17
  27. data/spec/fixtures/vcr_cassettes/aggregated_invoices.yml +64 -0
  28. data/spec/fixtures/vcr_cassettes/all_clients.yml +72 -0
  29. data/spec/fixtures/vcr_cassettes/all_invoices.yml +134 -0
  30. data/spec/fixtures/vcr_cassettes/all_recurring_invoices.yml +131 -0
  31. data/spec/fixtures/vcr_cassettes/client_on_change.yml +54 -0
  32. data/spec/fixtures/vcr_cassettes/draft_item.yml +71 -0
  33. data/spec/fixtures/vcr_cassettes/existent_client.yml +71 -0
  34. data/spec/fixtures/vcr_cassettes/fetched_invoice_pdf.yml +2111 -0
  35. data/spec/fixtures/vcr_cassettes/fetches_invoice-item_by_id.yml +123 -0
  36. data/spec/fixtures/vcr_cassettes/invoice-comments_by_invoice_id.yml +68 -0
  37. data/spec/fixtures/vcr_cassettes/invoice-comments_by_invoice_id_and_actionkey_PAYMENT.yml +131 -0
  38. data/spec/fixtures/vcr_cassettes/invoice-comments_by_invoice_id_and_actionkeys.yml +67 -0
  39. data/spec/fixtures/vcr_cassettes/invoice_canceled.yml +50 -0
  40. data/spec/fixtures/vcr_cassettes/invoice_deleted.yml +46 -0
  41. data/spec/fixtures/vcr_cassettes/invoice_info.yml +131 -0
  42. data/spec/fixtures/vcr_cassettes/invoice_marked_as_complete.yml +95 -0
  43. data/spec/fixtures/vcr_cassettes/invoice_payments.yml +123 -0
  44. data/spec/fixtures/vcr_cassettes/invoice_send_email_with_basic_info.yml +48 -0
  45. data/spec/fixtures/vcr_cassettes/invoice_send_email_with_basic_info_and_from.yml +48 -0
  46. data/spec/fixtures/vcr_cassettes/invoice_send_email_with_basic_info_from_and_subject.yml +48 -0
  47. data/spec/fixtures/vcr_cassettes/invoice_send_mail.yml +48 -0
  48. data/spec/fixtures/vcr_cassettes/invoice_send_mail_invalid_address.yml +48 -0
  49. data/spec/fixtures/vcr_cassettes/invoice_uploaded_signature.yml +48 -0
  50. data/spec/fixtures/vcr_cassettes/myself_client.yml +70 -0
  51. data/spec/fixtures/vcr_cassettes/new_client.yml +50 -0
  52. data/spec/fixtures/vcr_cassettes/non_existent_client.yml +303 -0
  53. data/spec/fixtures/vcr_cassettes/save_for_non-existent_client.yml +48 -0
  54. data/spec/fixtures/vcr_cassettes/wrong_data_for_client.yml +50 -0
  55. data/spec/spec_helper.rb +50 -0
  56. metadata +43 -4
  57. data/spec/helper.rb +0 -24
@@ -17,7 +17,7 @@ class BadBill
17
17
  # @return [Client] A new resource.
18
18
  def self.myself
19
19
  c = get 'clients', 'myself'
20
- client = new c.client.id, c.client
20
+ client = new c.client.id.to_i, c.client
21
21
  client.myself = true
22
22
  client
23
23
  end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'zlib'
4
+ require 'faraday_middleware/response_middleware'
5
+
6
+ module FaradayMiddleware
7
+ class Gzip < ResponseMiddleware
8
+ define_parser do |body|
9
+ Zlib::GzipReader.new(StringIO.new(body)).read
10
+ end
11
+
12
+ def parse_response?(env)
13
+ super && env[:response_headers]['content-encoding'] == "gzip"
14
+ end
15
+ end
16
+ end
17
+
18
+ Faraday::Response.register_middleware :gzip => FaradayMiddleware::Gzip
@@ -11,6 +11,12 @@ class BadBill
11
11
  # assignment request, we only check for the method name without the equal sign.
12
12
  def method_missing(method_name, *arguments, &block)
13
13
  if data.respond_to?(method_name.to_s.sub(/=$/, ''))
14
+ if method_name.to_s.end_with?('=')
15
+ @__mutated__ ||= []
16
+ @__mutated__ << method_name.to_s.sub(/=$/, '')
17
+ @__mutated__.uniq!
18
+ end
19
+
14
20
  data.send(method_name, *arguments, &block)
15
21
  else
16
22
  super
@@ -7,6 +7,34 @@ class BadBill
7
7
  #
8
8
  # See http://www.billomat.com/en/api/invoices
9
9
  class Invoice < BaseResource
10
+ # Get aggregated list of invoices.
11
+ #
12
+ # BE CAREFUL: The returned objects are not really invoices.
13
+ # See http://www.billomat.com/en/api/invoices/ for the format.
14
+ #
15
+ # @param [String,Symbol,#to_s] type One of ['client', 'status', 'day',
16
+ # 'week', 'month', 'year'].
17
+ # Specify multiple types for finer
18
+ # aggregation.
19
+ #
20
+ # @return [Array<Invoices>] All found resources.
21
+ def self.group_by *type
22
+ if type.respond_to?(:join)
23
+ type = type.join(',')
24
+ end
25
+
26
+ all = get resource_name, group_by: type
27
+
28
+ return all if all.error
29
+
30
+ data = all.__send__('invoice-groups').__send__('invoice-group')
31
+
32
+ if data.kind_of? Array
33
+ data
34
+ else
35
+ [data]
36
+ end
37
+ end
10
38
  # Get the PDF invoice.
11
39
  #
12
40
  #
@@ -16,7 +44,9 @@ class BadBill
16
44
  # all parameters.
17
45
  def pdf
18
46
  resp = get resource_name, "#{id}/pdf"
19
- resp.pdf
47
+ ret = resp.pdf
48
+ ret.id = ret.id.to_i
49
+ ret
20
50
  end
21
51
 
22
52
  # Closes a statement in the draft status (DRAFT). Here, the
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ class BadBill
4
+ # The InvoiceComment resource handles all invoice comments.
5
+ #
6
+ # See http://www.billomat.com/en/api/invoices/comments-and-history/
7
+ class InvoiceComment < BaseResource
8
+ # Get all Invoice Comments for given invoice id.
9
+ #
10
+ # @param [Integer] invoice_id The invoice id to search for.
11
+ # @param [String,Array] actionkey Indicates what kind of comment it is. See API docu for possible values. An Array will be joined into a String.
12
+ #
13
+ # @return [Array<InvoiceComment>] All found invoice comments.
14
+ def self.all invoice_id, actionkey=nil
15
+ params = { invoice_id: invoice_id }
16
+ if actionkey
17
+ actionkey = actionkey.join(',') if actionkey.respond_to?(:join)
18
+ params[:actionkey] = actionkey
19
+ end
20
+
21
+ super params
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ class BadBill
4
+ # The InvoiceItem resource handles all invoice items.
5
+ #
6
+ # See http://www.billomat.com/en/api/invoices/items/
7
+ class InvoiceItem < BaseResource
8
+ # Get all resources of this type.
9
+ #
10
+ # @param [Integer] invoice_id The invoice id to search for.
11
+ #
12
+ # @return [Array<InvoiceItem>] All found invoice items.
13
+ def self.all invoice_id
14
+ super invoice_id: invoice_id
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ class BadBill
4
+ # The InvoicePayment resource handles all invoice payments.
5
+ #
6
+ # See http://www.billomat.com/en/api/invoices/payments/
7
+ class InvoicePayment < BaseResource
8
+ # Create a new invoice payment.
9
+ #
10
+ # @param [String,] invoice_id The ID of the invoice
11
+ # @param [String,Numeric] amount The paid amount
12
+ # @param [Boolean] is_paid Wether the invoice should be marked as paid
13
+ # or not
14
+ # @return [InvoicePayment,Hashie::Mash] New payment with id and data set
15
+ # or hash if any error happened
16
+ def self.create invoice_id, amount, is_paid=false, params={}
17
+ params['invoice_id'] = invoice_id
18
+ params['amount'] = amount
19
+ params['mark_invoice_as_paid'] = is_paid
20
+
21
+ res = post(resource_name, {resource_name_singular => params})
22
+ return res if res.error
23
+
24
+ res_data = res.__send__(resource_name_singular)
25
+ new res_data.id.to_i, res_data
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ require 'base64'
4
+
5
+ class BadBill
6
+ # The Recurring resource handles all recurring invoices.
7
+ #
8
+ # See http://www.billomat.com/en/api/recurring
9
+ class Recurring < BaseResource
10
+ end
11
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require_relative '../helper'
3
+ require 'spec_helper'
4
4
 
5
5
  describe BadBill::BaseResource do
6
6
  it "can't set a new ID" do
@@ -1,98 +1,102 @@
1
1
  # encoding: utf-8
2
2
 
3
- require_relative '../helper'
3
+ require 'spec_helper'
4
4
 
5
5
  describe BadBill::Client do
6
6
  before :all do
7
- @badbill = BadBill.new "ruby", "12345"
7
+ @badbill = new_badbill 1
8
8
  end
9
9
 
10
10
  it "fetches all clients" do
11
- stub = stub_request(:get, "ruby.billomat.net/api/clients/").
12
- with(:headers => {'Accept' => 'application/json'}).
13
- to_return(:body => '{"clients":{"client":[{"id":1}]}}',
14
- :headers => {'Content-Type' => 'application/json'})
11
+ VCR.use_cassette('all_clients') do
12
+ resp = BadBill::Client.all
15
13
 
16
- resp = BadBill::Client.all
17
- stub.should have_been_requested
18
-
19
- resp.size.should == 1
20
- resp.first.id.should == 1
14
+ resp.size.should eq(1)
15
+ resp.first.id.should eq(169499)
16
+ end
21
17
  end
22
18
 
23
19
  it "fetches info about myself" do
24
- stub = stub_request(:get, "ruby.billomat.net/api/clients/myself").
25
- with(:headers => {'Accept' => 'application/json'}).
26
- to_return(:body => '{"client":{"id":1}}',
27
- :headers => {'Content-Type' => 'application/json'})
28
-
29
- resp = BadBill::Client.myself
30
- stub.should have_been_requested
20
+ VCR.use_cassette('myself_client') do
21
+ resp = BadBill::Client.myself
31
22
 
32
- resp.id.should == 1
33
- resp.myself?.should == true
23
+ resp.id.should eq(148386)
24
+ resp.myself?.should be_true
25
+ end
34
26
  end
35
27
 
36
28
  it "fetches info about another client" do
37
- stub = stub_request(:get, "ruby.billomat.net/api/clients/1").
38
- with(:headers => {'Accept' => 'application/json'}).
39
- to_return(:body => '{"client":{"id":1}}',
40
- :headers => {'Content-Type' => 'application/json'})
29
+ VCR.use_cassette('existent client') do
30
+ resp = BadBill::Client.find 169499
31
+
32
+ resp.id.should eq(169499)
33
+ resp.myself?.should be_false
34
+ end
35
+ end
41
36
 
42
- resp = BadBill::Client.find 1
43
- stub.should have_been_requested
37
+ it "returns nil when no client found" do
38
+ VCR.use_cassette('non existent client') do
39
+ resp = BadBill::Client.find 11111
44
40
 
45
- resp.id.should == 1
46
- resp.myself?.should == false
41
+ resp.should be_nil
42
+ end
47
43
  end
48
44
 
49
45
  it "saves changes to client data" do
50
- body = { client: {name: "old name", "id" => 1} }
51
- stub_request(:get, "ruby.billomat.net/api/clients/1").
52
- with(:headers => {'Accept' => 'application/json'}).
53
- to_return(:body => body,
54
- :headers => {'Content-Type' => 'application/json'})
55
-
56
- client = BadBill::Client.find 1
57
-
58
- body = { client: {name: "new name", "id" => 1} }
59
- stub = stub_request(:put, "ruby.billomat.net/api/clients/1").
60
- with(:headers => {'Accept' => 'application/json'}, :body => body).
61
- to_return(:status => 200)
62
-
63
- client.name.should == "old name"
64
- client.name = "new name"
65
- client.save.should == true
66
- stub.should have_been_requested
46
+ client = nil
47
+ VCR.use_cassette('existent client') do
48
+ client = BadBill::Client.find 169499
49
+ end
50
+
51
+ VCR.use_cassette('client on change') do
52
+ client.name.should eq("Jan-Erik Rediger")
53
+ client.name = "new name"
54
+ saved = client.save
55
+
56
+ saved.error.should be_nil
57
+ saved.name.should eq("new name")
58
+ client.name.should eq("new name")
59
+ end
60
+ end
61
+
62
+ it "returns error on failed save" do
63
+ VCR.use_cassette('save for non-existent client') do
64
+ client = BadBill::Client.new 169500, Hashie::Mash.new(name: "foo")
65
+ client.name = "new name"
66
+ saved = client.save
67
+
68
+ saved.error.should be_a(Faraday::Error::ClientError)
69
+ end
67
70
  end
68
71
 
69
72
  it "creates a new client with given data" do
70
- body = {
71
- "client" => {
72
- "name" => "Musterfirma",
73
- "salutation" => "Herr",
74
- "first_name" => "Max",
75
- "last_name" => "Muster",
76
- "street" => "Musterstraße 123",
77
- "zip" => "12345",
78
- "city" => "Musterstadt",
79
- "state" => "Bundesland",
80
- "country_code" => "DE",
73
+ VCR.use_cassette('new client') do
74
+ data = {
75
+ "name" => "Musterfirma",
76
+ "salutation" => "Herr",
77
+ "first_name" => "Max",
78
+ "last_name" => "Muster",
79
+ "street" => "Musterstraße 123",
80
+ "zip" => "12345",
81
+ "city" => "Musterstadt",
82
+ "state" => "Bundesland",
83
+ "country_code" => "DE",
81
84
  }
82
- }
83
85
 
84
- body_return = { "client" => body["client"].dup }
85
- body_return["client"]["id"] = 42
86
- body_return["client"]["created"] = "2007-12-13T12:12:00+01:00"
86
+ client = BadBill::Client.create data
87
+ client.id.should_not be_nil
88
+ client.name.should eq("Musterfirma")
89
+ end
90
+ end
87
91
 
88
- stub = stub_request(:post, "ruby.billomat.net/api/clients/").
89
- with(:body => body.to_json, :headers => {'Accept' => 'application/json',
90
- 'Content-Type'=>'application/json'}).
91
- to_return(:status => 201, :body => body_return,
92
- :headers => {'Content-Type' => 'application/json'})
92
+ context "create with wrong data" do
93
+ it "returns an error" do
94
+ VCR.use_cassette('wrong data for client') do
95
+ data = { "email" => "this@is.invalid" }
96
+ client = BadBill::Client.create data
93
97
 
94
- client = BadBill::Client.create body["client"]
95
- stub.should have_been_requested
96
- client.id.should == 42
98
+ client.error.should be_a(Faraday::Error::ClientError)
99
+ end
100
+ end
97
101
  end
98
102
  end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe BadBill::InvoiceComment do
6
+ before :all do
7
+ @badbill = new_badbill 1
8
+ end
9
+
10
+ it "fetches all invoice-comments" do
11
+ VCR.use_cassette("invoice-comments by invoice id") do
12
+ resp = BadBill::InvoiceComment.all 360264
13
+
14
+ resp.size.should eq(3)
15
+ end
16
+ end
17
+
18
+ it "fetches all invoice-comments for PAYED status" do
19
+ VCR.use_cassette("invoice-comments by invoice id and actionkey PAYMENT") do
20
+ resp = BadBill::InvoiceComment.all 360264, 'PAYMENT'
21
+
22
+ resp.size.should eq(1)
23
+ end
24
+ end
25
+
26
+ it "fetches all invoice-comments for 2 actionkey params" do
27
+ VCR.use_cassette("invoice-comments by invoice id and actionkeys") do
28
+ resp = BadBill::InvoiceComment.all 360264, ['CREATE','PAYMENT']
29
+
30
+ resp.size.should eq(2)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe BadBill::InvoiceItem do
6
+ before :all do
7
+ @badbill = new_badbill 1
8
+ end
9
+
10
+ it "fetches all invoice-item" do
11
+ VCR.use_cassette("fetches invoice-item by id") do
12
+ resp = BadBill::InvoiceItem.all 1
13
+
14
+ resp.size.should eq(0)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe BadBill::InvoicePayment do
6
+ before :all do
7
+ @badbill = new_badbill 1
8
+ end
9
+
10
+ it "fetches all invoice-payments" do
11
+ VCR.use_cassette('invoice payments') do
12
+ resp = BadBill::InvoicePayment.all
13
+
14
+ resp.size.should eq(0)
15
+ end
16
+ end
17
+ end
@@ -1,227 +1,128 @@
1
1
  # encoding: utf-8
2
2
 
3
- require_relative '../helper'
3
+ require 'spec_helper'
4
4
 
5
5
  describe BadBill::Invoice do
6
6
  before :all do
7
- @badbill = BadBill.new "ruby", "12345"
7
+ @badbill = new_badbill 1
8
8
  end
9
9
 
10
10
  it "fetches all invoices" do
11
- stub = stub_request(:get, "ruby.billomat.net/api/invoices/").
12
- with(:headers => {'Accept' => 'application/json'}).
13
- to_return(:body => '{"invoices":{"invoice":[{"id":1}]}}',
14
- :headers => {'Content-Type' => 'application/json'})
11
+ VCR.use_cassette("all invoices") do
12
+ resp = BadBill::Invoice.all
15
13
 
16
- resp = BadBill::Invoice.all
17
- stub.should have_been_requested
18
-
19
- resp.size.should == 1
20
- resp.first.id.should == 1
14
+ resp.size.should eq(2)
15
+ end
21
16
  end
22
17
 
23
18
  it "fetches info about an invoice" do
24
- stub = stub_request(:get, "ruby.billomat.net/api/invoices/1").
25
- with(:headers => {'Accept' => 'application/json'}).
26
- to_return(:body => '{"invoice":{"id":1}}',
27
- :headers => {'Content-Type' => 'application/json'})
19
+ VCR.use_cassette("invoice info") do
20
+ resp = BadBill::Invoice.find 352709
21
+
22
+ resp.id.should eq(352709)
23
+ resp.invoice_number.to_i.should eq(1)
24
+ end
25
+ end
28
26
 
29
- resp = BadBill::Invoice.find 1
30
- stub.should have_been_requested
27
+ it "fetches aggregated invoices" do
28
+ VCR.use_cassette("aggregated invoices") do
29
+ resp = BadBill::Invoice.group_by :client
31
30
 
32
- resp.id.should == 1
31
+ resp.first.total_gross.should == "124.00"
32
+ end
33
33
  end
34
34
 
35
- context "existing invoice" do
35
+ context "existing invoice 1" do
36
36
  before :each do
37
- stub_request(:get, "ruby.billomat.net/api/invoices/1").
38
- with(:headers => {'Accept' => 'application/json'}).
39
- to_return(:body => '{"invoice":{"id":1,"status":"DRAFT"}}',
40
- :headers => {'Content-Type' => 'application/json'})
41
-
42
- @invoice = BadBill::Invoice.find 1
37
+ VCR.use_cassette('draft item') do
38
+ @invoice = BadBill::Invoice.find 352320
39
+ end
43
40
  end
44
41
 
45
42
  it "marks invoice as complete" do
46
- stub = stub_request(:put, "ruby.billomat.net/api/invoices/1/complete").
47
- with(:headers => {'Accept' => 'application/json'}).
48
- to_return(:status => 200)
49
-
50
- @invoice.complete.should == true
51
- stub.should have_been_requested
43
+ VCR.use_cassette('invoice marked as complete') do
44
+ @invoice.complete.should == true
45
+ end
52
46
  end
53
47
 
54
- it "cancels an invoice" do
55
- stub = stub_request(:put, "ruby.billomat.net/api/invoices/1/cancel").
56
- with(:headers => {'Accept' => 'application/json'}).
57
- to_return(:status => 200)
58
48
 
59
- @invoice.cancel.should == true
60
- stub.should have_been_requested
49
+ it "cancels an invoice" do
50
+ VCR.use_cassette('invoice canceled') do
51
+ @invoice.cancel.should == true
52
+ end
61
53
  end
62
54
 
63
55
  it "deletes an invoice" do
64
- stub = stub_request(:delete, "ruby.billomat.net/api/invoices/1").
65
- with(:headers => {'Accept' => 'application/json'}).
66
- to_return(:status => 200)
67
-
68
- @invoice.delete.should == true
69
- stub.should have_been_requested
56
+ VCR.use_cassette('invoice deleted') do
57
+ @invoice.delete.should == true
58
+ end
70
59
  end
60
+ end
71
61
 
62
+ context "existing invoice 2" do
63
+ before :each do
64
+ VCR.use_cassette('invoice info') do
65
+ @invoice = BadBill::Invoice.find 352709
66
+ end
67
+ end
72
68
  it "fetches the pdf" do
73
- body = {
74
- "pdf" => {
75
- "id" => 1,
76
- "created" => "2009-09-02T12 =>04 =>15+02 =>00",
77
- "invoice_id" => 1,
78
- "filename" => "invoice_1.pdf",
79
- "mimetype" => "application/pdf",
80
- "filesize" => "1",
81
- "base64file" => "foobar"
82
- }
83
- }
84
-
85
- stub = stub_request(:get, "ruby.billomat.net/api/invoices/1/pdf").
86
- with(:headers => {'Accept' => 'application/json'}).
87
- to_return(:body => body, :headers => {
88
- 'Content-Type' => 'application/json'
89
- })
90
-
91
- pdf = @invoice.pdf
92
-
93
- stub.should have_been_requested
94
- pdf.id.should == 1
95
- pdf.invoice_id == 1
69
+ VCR.use_cassette('fetched invoice pdf') do
70
+ pdf = @invoice.pdf
71
+
72
+ pdf.id.should == 356105
73
+ pdf.invoice_id == 352709
74
+ end
96
75
  end
97
76
 
98
77
  it "uploads a signature" do
99
- body = {"signature" => {"base64file" => "cnVieQ==\n"}}
100
- stub = stub_request(:put, "ruby.billomat.net/api/invoices/1/upload-signature").
101
- with(:headers => {'Accept' => 'application/json'}, :body => body).
102
- to_return(:status => 200)
103
-
104
- @invoice.status = "OPEN"
105
- file_content = StringIO.new "ruby"
106
- resp = @invoice.upload_signature file_content
107
- resp.should == true
108
-
109
- stub.should have_been_requested
78
+ VCR.use_cassette('invoice uploaded signature') do
79
+ file_content = StringIO.new "ruby"
80
+ resp = @invoice.upload_signature file_content
81
+ resp.should == true
82
+ end
110
83
  end
111
84
 
112
85
  context "sending invoice as mail" do
113
86
  it "sends an invoice via mail" do
114
- body = {
115
- "email" => {
116
- "from" => "sender@test.example",
117
- "recipients" => {
118
- "to" => "recv@test.example",
119
- "cc" => "mail@test.example"
120
- },
121
- "subject" => "subject",
122
- "body" => "body",
123
- "filename" => "invoice",
124
- "attachments" => {
125
- "attachment" => {
126
- "filename" => "more.pdf",
127
- "mimetype" => "application/pdf",
128
- "base64file" => "foobar"
87
+ VCR.use_cassette('invoice send mail') do
88
+ resp = @invoice.email "M8R-10apg01@mailinator.com", "janerik@badbill.net",
89
+ "subject", "body", {
90
+ recipients: { cc: "f4a269895b2c7eccd43296d2b@mailinator.com" },
91
+ filename: "invoice",
92
+ attachments: {
93
+ attachment: {
94
+ filename: "more.pdf",
95
+ mimetype: "application/pdf",
96
+ base64file: "Zm9vYmFyCg=="
97
+ }
129
98
  }
130
99
  }
131
- }
132
- }
133
-
134
- stub = stub_request(:post, "ruby.billomat.net/api/invoices/1/email").
135
- with(:headers => {'Accept' => 'application/json'}, :body => body).
136
- to_return(:headers => {
137
- 'Content-Type' => 'application/json'
138
- })
139
-
140
- resp = @invoice.email "recv@test.example", "sender@test.example",
141
- "subject", "body", {
142
- recipients: { cc: "mail@test.example" },
143
- filename: "invoice",
144
- attachments: {
145
- attachment: {
146
- filename: "more.pdf",
147
- mimetype: "application/pdf",
148
- base64file: "foobar"
149
- }
150
- }
151
- }
152
100
 
153
- stub.should have_been_requested
154
- resp.should == true
101
+ resp.should == true
102
+ end
155
103
  end
156
104
 
157
105
  it "sends an invoice with only basic information" do
158
- body = {
159
- "email" => {
160
- "recipients" => {
161
- "to" => "recv@test.example",
162
- "cc" => "mail@test.example",
163
- }
164
- }
165
- }
166
-
167
- stub = stub_request(:post, "ruby.billomat.net/api/invoices/1/email").
168
- with(:headers => {'Accept' => 'application/json'}, :body => body).
169
- to_return(:headers => {
170
- 'Content-Type' => 'application/json'
171
- })
172
-
173
- resp = @invoice.email "recv@test.example", {recipients: { cc: "mail@test.example" }}
174
-
175
- stub.should have_been_requested
176
- resp.should == true
106
+ VCR.use_cassette('invoice send email with basic info') do
107
+ resp = @invoice.email "M8R-10apg01@mailinator.com", {recipients: { cc: "mail@test.example" }}
108
+ resp.should == true
109
+ end
177
110
  end
178
111
 
179
112
  it "sends an invoice with basic information and from" do
180
- body = {
181
- "email" => {
182
- "recipients" => {
183
- "to" => "recv@test.example",
184
- "cc" => "mail@test.example",
185
- },
186
- "from" => "sender@test.example"
187
- }
188
- }
189
-
190
- stub = stub_request(:post, "ruby.billomat.net/api/invoices/1/email").
191
- with(:headers => {'Accept' => 'application/json'}, :body => body).
192
- to_return(:headers => {
193
- 'Content-Type' => 'application/json'
194
- })
195
-
196
- resp = @invoice.email "recv@test.example", "sender@test.example", {recipients: { cc: "mail@test.example" }}
197
-
198
- stub.should have_been_requested
199
- resp.should == true
113
+ VCR.use_cassette('invoice send email with basic info and from') do
114
+ resp = @invoice.email "M8R-10apg01@mailinator.com", "sender@test.example", {recipients: { cc: "mail@test.example" }}
115
+ resp.should == true
116
+ end
200
117
  end
201
118
 
202
119
  it "sends an invoice with basic information, from and subject" do
203
- body = {
204
- "email" => {
205
- "recipients" => {
206
- "to" => "recv@test.example",
207
- "cc" => "mail@test.example",
208
- },
209
- "from" => "sender@test.example",
210
- "subject" => "subject"
211
- }
212
- }
213
-
214
- stub = stub_request(:post, "ruby.billomat.net/api/invoices/1/email").
215
- with(:headers => {'Accept' => 'application/json'}, :body => body).
216
- to_return(:headers => {
217
- 'Content-Type' => 'application/json'
218
- })
219
-
220
- resp = @invoice.email "recv@test.example", "sender@test.example", "subject",
221
- {recipients: { cc: "mail@test.example" }}
222
-
223
- stub.should have_been_requested
224
- resp.should == true
120
+ VCR.use_cassette('invoice send email with basic info from and subject') do
121
+ resp = @invoice.email "M8R-10apg01@mailinator.com", "sender@test.example", "subject",
122
+ {recipients: { cc: "mail@test.example" }}
123
+
124
+ resp.should == true
125
+ end
225
126
  end
226
127
  end
227
128
  end