trolley 0.2.14 → 1.0.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trolley/Balance.rb +4 -0
  3. data/lib/trolley/Batch.rb +20 -0
  4. data/lib/trolley/BatchSummary.rb +21 -0
  5. data/lib/trolley/Client.rb +117 -0
  6. data/lib/trolley/Configuration.rb +30 -0
  7. data/lib/trolley/Exceptions.rb +26 -0
  8. data/lib/trolley/Gateway.rb +18 -0
  9. data/lib/trolley/Invoice.rb +22 -0
  10. data/lib/trolley/InvoicePayment.rb +13 -0
  11. data/lib/trolley/OfflinePayment.rb +23 -0
  12. data/lib/trolley/Payment.rb +52 -0
  13. data/lib/trolley/Recipient.rb +44 -0
  14. data/lib/trolley/RecipientAccount.rb +30 -0
  15. data/lib/trolley/gateways/BalanceGateway.rb +15 -0
  16. data/lib/trolley/gateways/BatchGateway.rb +74 -0
  17. data/lib/trolley/gateways/InvoiceGateway.rb +57 -0
  18. data/lib/trolley/gateways/InvoicePaymentGateway.rb +37 -0
  19. data/lib/trolley/gateways/OfflinePaymentGateway.rb +44 -0
  20. data/lib/trolley/gateways/PaymentGateway.rb +42 -0
  21. data/lib/trolley/gateways/RecipientAccountGateway.rb +42 -0
  22. data/lib/trolley/gateways/RecipientGateway.rb +82 -0
  23. data/lib/trolley/utils/PaginatedArray.rb +25 -0
  24. data/lib/trolley/utils/ResponseMapper.rb +80 -0
  25. data/lib/trolley.rb +33 -5
  26. data/spec/integration/BatchTest.rb +126 -0
  27. data/spec/integration/InvoicePaymentTest.rb +92 -0
  28. data/spec/integration/InvoiceTest.rb +128 -0
  29. data/spec/integration/RecipientAccountTest.rb +48 -0
  30. data/spec/integration/RecipientTest.rb +159 -0
  31. data/spec/integration/helper.rb +19 -0
  32. data/spec/unit/ConfigurationTest.rb +47 -0
  33. data/spec/unit/PaginatedArrayTest.rb +23 -0
  34. data/spec/unit/ResponseMapperTest.rb +26 -0
  35. data/spec/unit/TrolleyTest.rb +15 -0
  36. data/trolley.gemspec +22 -12
  37. metadata +103 -8
@@ -0,0 +1,42 @@
1
+ require_relative '../Client'
2
+
3
+ module Trolley
4
+ class PaymentGateway
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def find(batch_id, payment_id)
10
+ response = @client.get("/v1/batches/#{batch_id}/payments/#{payment_id}")
11
+ payment_builder(response)
12
+ end
13
+
14
+ def create(batch_id, body)
15
+ response = @client.post("/v1/batches/#{batch_id}/payments", body)
16
+ payment_builder(response)
17
+ end
18
+
19
+ def update(batch_id, payment_id, body)
20
+ @client.patch("/v1/batches/#{batch_id}/payments/#{payment_id}", body)
21
+ true
22
+ end
23
+
24
+ def delete(batch_id, payment_id)
25
+ @client.delete("/v1/batches/#{batch_id}/payments/#{payment_id}")
26
+ true
27
+ end
28
+
29
+ def search(batch_id, page = 1, page_size = 10, term = '')
30
+ response = @client.get("/v1/batches/#{batch_id}/payments?page=#{page}&pageSize=#{page_size}&search=#{term}")
31
+ payments_list_builder(response)
32
+ end
33
+
34
+ def payment_builder(response)
35
+ Utils::ResponseMapper.build(response, Payment)
36
+ end
37
+
38
+ def payments_list_builder(response)
39
+ Utils::PaginatedArray.from_response(response, Payment)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ require_relative '../Client'
2
+
3
+ module Trolley
4
+ class RecipientAccountGateway
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def find(recipient_id, recipient_account_id)
10
+ response = @client.get("/v1/recipients/#{recipient_id}/accounts/#{recipient_account_id}")
11
+ recipient_account_builder(response)
12
+ end
13
+
14
+ def all(recipient_id)
15
+ response = @client.get("/v1/recipients/#{recipient_id}/accounts/")
16
+ recipient_account_list_builder(response)
17
+ end
18
+
19
+ def create(recipient_id, body)
20
+ response = @client.post("/v1/recipients/#{recipient_id}/accounts", body)
21
+ recipient_account_builder(response)
22
+ end
23
+
24
+ def update(recipient_id, recipient_account_id, body)
25
+ response = @client.patch("/v1/recipients/#{recipient_id}/accounts/#{recipient_account_id}", body)
26
+ recipient_account_builder(response)
27
+ end
28
+
29
+ def delete(recipient_id, recipient_account_id)
30
+ @client.delete("/v1/recipients/#{recipient_id}/accounts/#{recipient_account_id}")
31
+ true
32
+ end
33
+
34
+ def recipient_account_builder(response)
35
+ Utils::ResponseMapper.build(response, RecipientAccount)
36
+ end
37
+
38
+ def recipient_account_list_builder(response)
39
+ Utils::PaginatedArray.from_response(response, RecipientAccount)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,82 @@
1
+ require_relative '../Client'
2
+
3
+ module Trolley
4
+ class RecipientGateway
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def find(recipient_id)
10
+ response = @client.get("/v1/recipients/#{recipient_id}")
11
+ recipient_builder(response)
12
+ end
13
+
14
+ def create(body)
15
+ response = @client.post('/v1/recipients/', body)
16
+ recipient_builder(response)
17
+ end
18
+
19
+ def update(recipient_id, body)
20
+ @client.patch("/v1/recipients/#{recipient_id}", body)
21
+ true
22
+ end
23
+
24
+ # @param recipient_id [String] or [Array] The id (or array of ids) of the recipient to delete
25
+ def delete(recipient_id)
26
+ path = '/v1/recipients/'
27
+ body = ''
28
+
29
+ if recipient_id.is_a?(String)
30
+ path += recipient_id
31
+ elsif recipient_id.is_a?(Array)
32
+ body = { ids: recipient_id }
33
+ else
34
+ raise 'Invalid recipient_id type'
35
+ end
36
+
37
+ @client.delete(path, body)
38
+ true
39
+ end
40
+
41
+ # @note This method retrieves a list of activity logs for a recipient
42
+ def find_logs(recipient_id)
43
+ response = @client.get("/v1/recipients/#{recipient_id}/logs")
44
+ JSON.parse(response, object_class: OpenStruct)
45
+ end
46
+
47
+ def find_payments(recipient_id, page = 1, page_size = 10)
48
+ query_string = URI.encode_www_form(
49
+ page: page.to_s,
50
+ pageSize: page_size.to_s
51
+ )
52
+ response = @client.get("/v1/recipients/#{recipient_id}/payments?#{query_string}")
53
+ payments_list_builder(response)
54
+ end
55
+
56
+ # TODO: if we can afford a breaking change ideally these should be kwargs
57
+ # rubocop:disable Metrics/ParameterLists
58
+ def search(page = 1, page_size = 10, prefix_search = '', filters = {})
59
+ query_string = URI.encode_www_form(
60
+ page: page.to_s,
61
+ pageSize: page_size.to_s,
62
+ search: prefix_search,
63
+ **filters
64
+ )
65
+ response = @client.get("/v1/recipients?#{query_string}")
66
+ recipient_list_builder(response)
67
+ end
68
+ # rubocop:enable Metrics/ParameterLists
69
+
70
+ def recipient_builder(response)
71
+ Utils::ResponseMapper.build(response, Recipient)
72
+ end
73
+
74
+ def recipient_list_builder(response)
75
+ Utils::PaginatedArray.from_response(response, Recipient)
76
+ end
77
+
78
+ def payments_list_builder(response)
79
+ Utils::PaginatedArray.from_response(response, Payment)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,25 @@
1
+ module Trolley
2
+ module Utils
3
+ class PaginatedArray < Array
4
+ attr_accessor :page, :pages, :records
5
+
6
+ def self.from_response(response, klass)
7
+ data = JSON.parse(response)
8
+
9
+ enum = Utils::ResponseMapper.new(response, klass).build
10
+ page = data.dig('meta', 'page')
11
+ pages = data.dig('meta', 'pages')
12
+ records = data.dig('meta', 'records')
13
+
14
+ new(enum, page, pages, records)
15
+ end
16
+
17
+ def initialize(enum, page, pages, records)
18
+ super(enum)
19
+ @page = page
20
+ @pages = pages
21
+ @records = records
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trolley
4
+ module Utils
5
+ class ResponseMapper
6
+ KLASS_TO_RESOURCE_KEY_MAPPERS = {
7
+ 'Trolley::Batch' => { resource: 'batch', collection: 'batches' },
8
+ 'Trolley::Invoice' => { resource: 'invoice', collection: 'invoices' },
9
+ 'Trolley::InvoicePayment' => { resource: 'invoicePayment', collection: 'invoicePayments' },
10
+ 'Trolley::OfflinePayment' => { resource: 'offlinePayment', collection: 'offlinePayments' },
11
+ 'Trolley::Payment' => { resource: 'payment', collection: 'payments' },
12
+ 'Trolley::RecipientAccount' => { resource: 'account', collection: 'accounts' },
13
+ 'Trolley::Recipient' => { resource: 'recipient', collection: 'recipients' },
14
+ 'Trolley::BatchSummary' => { resource: 'batchSummary' }
15
+ }.freeze
16
+
17
+ def self.build(response, klass)
18
+ new(response, klass).build
19
+ end
20
+
21
+ def initialize(response, klass)
22
+ @response = response
23
+ @klass = klass
24
+ @data = JSON.parse(response)
25
+ end
26
+
27
+ def build
28
+ if collection?
29
+ build_collection
30
+ else
31
+ build_resource
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :response, :klass, :data
38
+
39
+ def build_collection
40
+ data[applicable_collection_key].map do |resource_data|
41
+ build_resource(resource_data)
42
+ end
43
+ end
44
+
45
+ def build_resource(resource_data = nil)
46
+ resource_data ||= data[applicable_resource_key]
47
+ loosely_hydrate_model(resource_data)
48
+ end
49
+
50
+ def loosely_hydrate_model(resource_data)
51
+ instance = klass.new
52
+
53
+ resource_data.each do |k, v|
54
+ instance.send("#{k}=", v)
55
+ rescue NoMethodError
56
+ # TODO: The API is showing non-public attributes, once we remove them from the API response we can re-add this warning.
57
+ # warn "[PaymentRails] Unknown attribute #{k} for class #{klass_instance.class.name}"
58
+ end
59
+
60
+ instance
61
+ end
62
+
63
+ def collection?
64
+ data[applicable_collection_key].is_a?(Array)
65
+ end
66
+
67
+ def applicable_collection_key
68
+ applicable_mapper[:collection]
69
+ end
70
+
71
+ def applicable_resource_key
72
+ applicable_mapper[:resource]
73
+ end
74
+
75
+ def applicable_mapper
76
+ KLASS_TO_RESOURCE_KEY_MAPPERS.fetch(klass.to_s)
77
+ end
78
+ end
79
+ end
80
+ end
data/lib/trolley.rb CHANGED
@@ -1,5 +1,33 @@
1
- class Trolley
2
- def self.hi
3
- puts "Future home to Trolley's Ruby SDK"
4
- end
5
- end
1
+ require 'trolley/Configuration'
2
+ require 'trolley/Gateway'
3
+
4
+ require 'trolley/gateways/BalanceGateway'
5
+ require 'trolley/gateways/BatchGateway'
6
+ require 'trolley/gateways/PaymentGateway'
7
+ require 'trolley/gateways/RecipientGateway'
8
+ require 'trolley/gateways/RecipientAccountGateway'
9
+ require 'trolley/gateways/OfflinePaymentGateway'
10
+ require 'trolley/gateways/InvoiceGateway'
11
+ require 'trolley/gateways/InvoicePaymentGateway'
12
+
13
+ require 'trolley/utils/PaginatedArray'
14
+ require 'trolley/utils/ResponseMapper'
15
+
16
+ require 'trolley/Balance'
17
+ require 'trolley/Batch'
18
+ require 'trolley/BatchSummary'
19
+ require 'trolley/Exceptions'
20
+ require 'trolley/Payment'
21
+ require 'trolley/Recipient'
22
+ require 'trolley/RecipientAccount'
23
+ require 'trolley/OfflinePayment'
24
+ require 'trolley/Invoice'
25
+ require 'trolley/InvoicePayment'
26
+
27
+ module Trolley
28
+ VERSION = '1.0.2'.freeze
29
+
30
+ def self.client(key, secret, **optionals)
31
+ Gateway.new(Configuration.new(key, secret, **optionals))
32
+ end
33
+ end
@@ -0,0 +1,126 @@
1
+ require_relative 'helper'
2
+ class BatchTest < Test::Unit::TestCase
3
+ include ApiClientHelper
4
+
5
+ def create_recipient
6
+ uuid = SecureRandom.uuid.to_s
7
+ recipient = @client.recipient.create(
8
+ type: 'individual',
9
+ firstName: 'Tom',
10
+ lastName: 'Jones',
11
+ email: "test.batch#{uuid}@example.com",
12
+ address: {
13
+ street1: '123 Wolfstrasse',
14
+ city: 'Berlin',
15
+ country: 'DE',
16
+ postalCode: '123123'
17
+ }
18
+ )
19
+ @client.recipient_account.create(recipient.id, type: 'bank-transfer', currency: 'EUR', country: 'DE', iban: 'DE89 3704 0044 0532 0130 00')
20
+ recipient
21
+ end
22
+
23
+ def test_create
24
+ batch = @client.batch.create(sourceCurrency: 'USD', description: 'Integration Test Create')
25
+ assert_not_nil(batch)
26
+ assert_not_nil(batch.id)
27
+
28
+ batch = @client.batch.all
29
+ assert_true(batch.count > 0)
30
+ end
31
+
32
+ def test_update
33
+ batch = @client.batch.create(sourceCurrency: 'USD', description: 'Integration Test Create')
34
+ assert_not_nil(batch)
35
+ assert_not_nil(batch.id)
36
+
37
+ all = @client.batch.all
38
+ assert_true(all.count > 0)
39
+
40
+ response = @client.batch.update(batch.id, description: 'Integration Update')
41
+ assert_true(response)
42
+ findBatch = @client.batch.find(batch.id)
43
+ assert_equal('Integration Update', findBatch.description)
44
+ assert_equal('open', batch.status)
45
+
46
+ response = @client.batch.delete(batch.id)
47
+ assert_true(response)
48
+ end
49
+
50
+ def test_create_with_payments
51
+ recipientAlpha = create_recipient
52
+ recipientBeta = create_recipient
53
+
54
+ batch = @client.batch.create(
55
+ sourceCurrency: 'USD', description: 'Integration Test Payments', payments: [
56
+ { targetAmount: '10.00', targetCurrency: 'EUR', recipient: { id: recipientAlpha.id } },
57
+ { sourceAmount: '10.00', recipient: { id: recipientBeta.id } }
58
+ ]
59
+ )
60
+
61
+ assert_not_nil(batch)
62
+ assert_not_nil(batch.id)
63
+
64
+ findBatch = @client.batch.find(batch.id)
65
+ assert_not_nil(findBatch)
66
+ assert_equal(2, findBatch.totalPayments)
67
+
68
+ payments = @client.payment.search(batch.id)
69
+ payments.each { |item| assert_equal('pending', item.status) }
70
+ end
71
+
72
+ def test_payments
73
+ batch = @client.batch.create(sourceCurrency: 'USD', description: 'Integration Test Payments')
74
+ assert_not_nil(batch)
75
+ assert_not_nil(batch.id)
76
+
77
+ recipient = create_recipient
78
+
79
+ payment = @client.payment.create(batch.id, sourceAmount: '10.00', recipient: { id: recipient.id })
80
+
81
+ assert_not_nil(payment)
82
+ assert_not_nil(payment.id)
83
+
84
+ response = @client.payment.update(batch.id, payment.id, sourceAmount: '20.00')
85
+ assert_true(response)
86
+
87
+ response = @client.payment.delete(batch.id, payment.id)
88
+ assert_true(response)
89
+ end
90
+
91
+ def test_processing
92
+ recipientAlpha = create_recipient
93
+ recipientBeta = create_recipient
94
+
95
+ batch = @client.batch.create(
96
+ sourceCurrency: 'USD', description: 'Integration Test Payments', payments: [
97
+ { targetAmount: '10.00', targetCurrency: 'EUR', recipient: { id: recipientAlpha.id } },
98
+ { sourceAmount: '10.00', recipient: { id: recipientBeta.id } }
99
+ ]
100
+ )
101
+ assert_not_nil(batch)
102
+ assert_not_nil(batch.id)
103
+
104
+ summary = @client.batch.summary(batch.id)
105
+ assert_equal(2, summary.detail['bank-transfer']['count'])
106
+
107
+ quote = @client.batch.generate_quote(batch.id)
108
+ assert_not_nil(quote)
109
+
110
+ start = @client.batch.start_processing(batch.id)
111
+ assert_not_nil(start)
112
+ end
113
+
114
+ def test_delete_multiple
115
+ batch = @client.batch.create(sourceCurrency: 'USD', description: 'Integration Test Create')
116
+ assert_not_nil(batch)
117
+ assert_not_nil(batch.id)
118
+
119
+ batch2 = @client.batch.create(sourceCurrency: 'USD', description: 'Integration Test Create')
120
+ assert_not_nil(batch2)
121
+ assert_not_nil(batch2.id)
122
+
123
+ response = @client.batch.delete([batch.id, batch2.id])
124
+ assert_true(response)
125
+ end
126
+ end
@@ -0,0 +1,92 @@
1
+ require_relative 'helper'
2
+
3
+ class InvoicePaymentTest < Test::Unit::TestCase
4
+ include ApiClientHelper
5
+
6
+ def create_recipient
7
+ uuid = SecureRandom.uuid.to_s
8
+ recipient = @client.recipient.create(
9
+ type: 'individual',
10
+ firstName: 'Tom',
11
+ lastName: 'Jones',
12
+ email: "test.batch#{uuid}@example.com",
13
+ address: {
14
+ street1: '123 Wolfstrasse',
15
+ city: 'Berlin',
16
+ country: 'DE',
17
+ postalCode: '123123'
18
+ }
19
+ )
20
+ @client.recipient_account.create(recipient.id, type: 'bank-transfer', currency: 'EUR', country: 'DE', iban: 'DE89 3704 0044 0532 0130 00')
21
+ recipient
22
+ end
23
+
24
+ def test_create
25
+ recipient = create_recipient
26
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
27
+ assert_not_nil(invoice)
28
+ assert_not_nil(invoice.id)
29
+ assert_equal('open', invoice.status)
30
+
31
+ invoice_line = @client.invoice.create_line(invoiceId: invoice.id, lines: [{ unitAmount: { value: '2000', currency: 'USD' } }])
32
+ assert_not_nil(invoice_line.lines)
33
+ assert_not_nil(invoice_line.lines.first['id'])
34
+
35
+ @client.invoice_payment.create(ids: [invoiceId: invoice.id])
36
+ invoice_payments = @client.invoice_payment.search(invoiceIds: [invoice.id])
37
+ assert_true(invoice_payments.count > 0)
38
+
39
+ findInvoice = @client.invoice.find(invoiceId: invoice.id)
40
+ assert_equal('paid', findInvoice.status)
41
+ end
42
+
43
+ def test_update
44
+ recipient = create_recipient
45
+
46
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
47
+ assert_not_nil(invoice)
48
+ assert_not_nil(invoice.id)
49
+
50
+ invoices = @client.invoice.search({})
51
+ assert_true(invoices.count > 0)
52
+
53
+ invoice_line = @client.invoice.create_line(invoiceId: invoice.id, lines: [{ unitAmount: { value: '2000', currency: 'USD' } }])
54
+ assert_not_nil(invoice_line.lines)
55
+ assert_not_nil(invoice_line.lines.first['id'])
56
+
57
+ invoice_payment = @client.invoice_payment.create(ids: [invoiceId: invoice.id])
58
+ invoice_payments = @client.invoice_payment.search(invoiceIds: [invoice.id])
59
+ assert_true(invoice_payments.count > 0)
60
+ assert_equal('2000.00', invoice_payments.first.amount['value'])
61
+
62
+ response = @client.invoice_payment.update(paymentId: invoice_payment.paymentId, invoiceLineId: invoice_payment.invoicePayments.first['invoiceLineId'], amount: { value: '5000', currency: 'USD' })
63
+ assert_true(response)
64
+ invoice_payments = @client.invoice_payment.search(invoiceIds: [invoice.id])
65
+ assert_true(invoice_payments.count > 0)
66
+ assert_equal('5000.00', invoice_payments.first.amount['value'])
67
+ end
68
+
69
+ def test_delete
70
+ recipient = create_recipient
71
+
72
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
73
+ assert_not_nil(invoice)
74
+ assert_not_nil(invoice.id)
75
+
76
+ invoices = @client.invoice.search({})
77
+ assert_true(invoices.count > 0)
78
+
79
+ invoice_line = @client.invoice.create_line(invoiceId: invoice.id, lines: [{ unitAmount: { value: '2000', currency: 'USD' } }])
80
+ assert_not_nil(invoice_line.lines)
81
+ assert_not_nil(invoice_line.lines.first['id'])
82
+
83
+ invoice_payment = @client.invoice_payment.create(ids: [invoiceId: invoice.id])
84
+ invoice_payments = @client.invoice_payment.search(invoiceIds: [invoice.id])
85
+ assert_true(invoice_payments.count > 0)
86
+
87
+ response = @client.invoice_payment.delete(paymentId: invoice_payment.paymentId, invoiceLineIds: [invoice_payment.invoicePayments.first['invoiceLineId']])
88
+ assert_true(response)
89
+ invoice_payments = @client.invoice_payment.search(invoiceIds: [invoice.id])
90
+ assert_true(invoice_payments.count == 0)
91
+ end
92
+ end
@@ -0,0 +1,128 @@
1
+ require_relative 'helper'
2
+
3
+ # rubocop:disable Metrics/ClassLength
4
+ class InvoiceTest < Test::Unit::TestCase
5
+ include ApiClientHelper
6
+
7
+ def create_recipient
8
+ uuid = SecureRandom.uuid.to_s
9
+ recipient = @client.recipient.create(
10
+ type: 'individual',
11
+ firstName: 'Tom',
12
+ lastName: 'Jones',
13
+ email: "test.batch#{uuid}@example.com",
14
+ address: {
15
+ street1: '123 Wolfstrasse',
16
+ city: 'Berlin',
17
+ country: 'DE',
18
+ postalCode: '123123'
19
+ }
20
+ )
21
+ @client.recipient_account.create(recipient.id, type: 'bank-transfer', currency: 'EUR', country: 'DE', iban: 'DE89 3704 0044 0532 0130 00')
22
+ recipient
23
+ end
24
+
25
+ def test_create
26
+ recipient = create_recipient
27
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
28
+ assert_not_nil(invoice)
29
+ assert_not_nil(invoice.id)
30
+
31
+ invoice = @client.invoice.search({})
32
+ assert_true(invoice.count > 0)
33
+ end
34
+
35
+ def test_create_line
36
+ recipient = create_recipient
37
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
38
+ assert_not_nil(invoice)
39
+ assert_not_nil(invoice.id)
40
+ assert_equal([], invoice.lines)
41
+
42
+ invoice_line = @client.invoice.create_line(invoiceId: invoice.id, lines: [{ unitAmount: { value: '2000', currency: 'USD' } }])
43
+ assert_not_nil(invoice_line.lines)
44
+ assert_not_nil(invoice_line.lines.first['id'])
45
+
46
+ findInvoice = @client.invoice.find(invoiceId: invoice.id)
47
+ assert_true(findInvoice.lines.count > 0)
48
+ end
49
+
50
+ def test_update
51
+ recipient = create_recipient
52
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
53
+ assert_not_nil(invoice)
54
+ assert_not_nil(invoice.id)
55
+
56
+ invoices = @client.invoice.search({})
57
+ assert_true(invoices.count > 0)
58
+
59
+ response = @client.invoice.update(invoiceId: invoice.id, description: 'Integration Test Invoice Update')
60
+ assert_true(response)
61
+ findInvoice = @client.invoice.find(invoiceId: invoice.id)
62
+ assert_equal('Integration Test Invoice Update', findInvoice.description)
63
+ assert_equal('open', findInvoice.status)
64
+ end
65
+
66
+ def test_update_line
67
+ recipient = create_recipient
68
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
69
+ assert_not_nil(invoice)
70
+ assert_not_nil(invoice.id)
71
+ assert_equal([], invoice.lines)
72
+
73
+ invoice_line = @client.invoice.create_line(invoiceId: invoice.id, lines: [{ unitAmount: { value: '2000', currency: 'USD' } }])
74
+ assert_not_nil(invoice_line.lines)
75
+ assert_not_nil(invoice_line.lines.first['id'])
76
+
77
+ response = @client.invoice.update_line(
78
+ invoiceId: invoice.id,
79
+ lines: [{
80
+ invoiceLineId: invoice_line.lines.first['id'],
81
+ unitAmount: { value: '3000', currency: 'USD' }
82
+ }]
83
+ )
84
+ assert_true(response)
85
+
86
+ findInvoice = @client.invoice.find(invoiceId: invoice.id)
87
+ assert_equal('3000.00', findInvoice.lines.first['unitAmount']['value'])
88
+ end
89
+
90
+ def test_delete
91
+ recipient = create_recipient
92
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
93
+ assert_not_nil(invoice)
94
+ assert_not_nil(invoice.id)
95
+
96
+ invoices = @client.invoice.search({})
97
+ assert_true(invoices.count > 0)
98
+
99
+ response = @client.invoice.delete(invoiceIds: invoices.map(&:id))
100
+ assert_true(response)
101
+
102
+ final_invoices = @client.invoice.search({})
103
+ assert_true(final_invoices.count == 0)
104
+ end
105
+
106
+ def test_delete_line
107
+ recipient = create_recipient
108
+ invoice = @client.invoice.create(recipientId: recipient.id, description: 'Integration Test Invoice Create')
109
+ assert_not_nil(invoice)
110
+ assert_not_nil(invoice.id)
111
+ assert_equal([], invoice.lines)
112
+
113
+ invoice_line = @client.invoice.create_line(invoiceId: invoice.id, lines: [{ unitAmount: { value: '2000', currency: 'USD' } }])
114
+
115
+ response = @client.invoice.delete_line(invoiceId: invoice.id, invoiceLineIds: [invoice_line.lines.first['id']])
116
+ assert_true(response)
117
+ end
118
+
119
+ def test_support_error_arrays
120
+ @client.invoice.create(recipientId: 'invalid', description: 'Integration Test Invoice Create')
121
+ rescue ::Trolley::TrolleyError => e
122
+ assert_equal(1, e.validation_errors.count)
123
+ assert_equal('recipientId', e.validation_errors.first['field'])
124
+ assert_equal('Value is invalid', e.validation_errors.first['message'])
125
+ assert_equal('invalid_field', e.validation_errors.first['code'])
126
+ end
127
+ end
128
+ # rubocop:enable Metrics/ClassLength