Skip to content
This repository was archived by the owner on Oct 15, 2024. It is now read-only.

Commit 4f89d76

Browse files
committed
feat(transfer): add transfers support
1 parent 964835d commit 4f89d76

15 files changed

+836
-0
lines changed

lib/moip2.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
require "moip2/resource/order"
1212
require "moip2/resource/entry"
1313
require "moip2/resource/payment"
14+
require "moip2/resource/transfer"
1415
require "moip2/resource/multi_order"
1516
require "moip2/resource/multi_payment"
1617
require "moip2/resource/customer"
@@ -31,6 +32,7 @@
3132
require "moip2/entry_api"
3233
require "moip2/multi_order_api"
3334
require "moip2/payment_api"
35+
require "moip2/transfer_api"
3436
require "moip2/multi_payment_api"
3537
require "moip2/customer_api"
3638
require "moip2/invoice_api"

lib/moip2/api.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ def payment
1414
Moip2::PaymentApi.new(client)
1515
end
1616

17+
def transfer
18+
Moip2::TransferApi.new(client)
19+
end
20+
1721
def balances
1822
Moip2::BalancesApi.new(client)
1923
end

lib/moip2/resource/transfer.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Moip2
2+
module Resource
3+
class Transfer < SimpleDelegator
4+
def intialize(response)
5+
super(response)
6+
end
7+
end
8+
end
9+
end

lib/moip2/transfer_api.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
module Moip2
2+
class TransferApi
3+
attr_reader :client
4+
5+
def initialize(client)
6+
@client = client
7+
end
8+
9+
def create(transfer)
10+
Resource::Transfer.new client.post(base_path, transfer)
11+
end
12+
13+
def show(transfers_id)
14+
Resource::Transfer.new client.get("#{base_path}/#{transfers_id}")
15+
end
16+
17+
def find_all(limit: nil, offset: nil, filters: nil, status: nil)
18+
encoded_filters = Moip2::Util::FiltersEncoder.encode(filters)
19+
20+
# `URI.encode...` will accept nil params, but they will pollute the URI
21+
params = {
22+
limit: limit,
23+
offset: offset,
24+
filters: encoded_filters,
25+
status: status,
26+
}.reject { |_, value| value.nil? }
27+
query_string = URI.encode_www_form(params)
28+
path = "#{base_path}?#{query_string}"
29+
response = client.get(path)
30+
31+
# We need to transform raw JSON in Order objects
32+
response.transfers.map! { |transfer| Resource::Transfer.new transfer }
33+
Resource::Transfer.new response
34+
end
35+
36+
def reverse(transfers_id)
37+
Resource::Transfer.new client.post("#{base_path}/#{transfers_id}/reverse", nil)
38+
end
39+
40+
private
41+
42+
def base_path
43+
"/v2/transfers"
44+
end
45+
end
46+
end

spec/moip2/transfers_spec.rb

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
describe Moip2::TransferApi do
2+
let(:transfer_api) { described_class.new(sandbox_client) }
3+
4+
context "#create" do
5+
let(:created_transfer) do
6+
VCR.use_cassette("create_transfer_success") do
7+
transfer_api.create(
8+
amount: 500,
9+
transferInstrument: {
10+
method: "BANK_ACCOUNT",
11+
bankAccount: {
12+
type: "CHECKING",
13+
bankNumber: "001",
14+
agencyNumber: "1111",
15+
agencyCheckNumber: "2",
16+
accountNumber: "9999",
17+
accountCheckNumber: "8",
18+
holder: {
19+
fullname: "Nome do Portador",
20+
taxDocument: {
21+
type: "CPF",
22+
number: "22222222222",
23+
},
24+
},
25+
},
26+
},
27+
)
28+
end
29+
end
30+
31+
it "creates a transfer" do
32+
expect(created_transfer.id).to eq("TRA-4PGNZ7KOFN4G")
33+
end
34+
35+
it "returns a Transfer object" do
36+
expect(created_transfer).to be_a(Moip2::Resource::Transfer)
37+
end
38+
end
39+
40+
describe "#show" do
41+
let (:transfer_id) { "TRA-4PGNZ7KOFN4G" }
42+
43+
let(:response) do
44+
VCR.use_cassette("get_transfer") do
45+
transfer_api.show(transfer_id)
46+
end
47+
end
48+
49+
it { expect(response.id).to eq transfer_id }
50+
51+
context "when transfer is not found" do
52+
let(:response) do
53+
VCR.use_cassette("get_transfer_not_found") do
54+
transfer_api.show("TRA-INVALID")
55+
end
56+
end
57+
58+
it "raises a NotFound" do
59+
expect { response }.to raise_error Moip2::NotFoundError
60+
end
61+
end
62+
end
63+
64+
describe "#find_all" do
65+
context "when passing no query params" do
66+
subject(:response) do
67+
VCR.use_cassette("find_all_transfers_no_query_params") do
68+
transfer_api.find_all
69+
end
70+
end
71+
72+
it { expect(response).to be_a(Moip2::Resource::Transfer) }
73+
it { expect(response.transfers.size).to eq(20) }
74+
it { expect(response.transfers.first).to be_a(Moip2::Resource::Transfer) }
75+
it { expect(response.transfers.first.id).to eq("TRA-4PGNZ7KOFN4G") }
76+
end
77+
78+
context "when passing limit" do
79+
subject(:response) do
80+
VCR.use_cassette("find_all_transfers_limit") do
81+
transfer_api.find_all(limit: 10)
82+
end
83+
end
84+
85+
it { expect(response).to be_a(Moip2::Resource::Transfer) }
86+
it { expect(response.transfers.size).to eq(10) }
87+
it { expect(response.transfers.first).to be_a(Moip2::Resource::Transfer) }
88+
it { expect(response.transfers.first.id).to eq("TRA-4PGNZ7KOFN4G") }
89+
end
90+
91+
context "when passing offset" do
92+
subject(:response) do
93+
VCR.use_cassette("find_all_transfers_offset") do
94+
transfer_api.find_all(offset: 10)
95+
end
96+
end
97+
98+
it { expect(response).to be_a(Moip2::Resource::Transfer) }
99+
it { expect(response.transfers.size).to eq(20) }
100+
it { expect(response.transfers.first).to be_a(Moip2::Resource::Transfer) }
101+
it { expect(response.transfers.first.id).to eq("TRA-CRQBMMRS4XK9") }
102+
end
103+
104+
context "when passing status" do
105+
subject(:response) do
106+
VCR.use_cassette("find_all_transfers_status") do
107+
transfer_api.find_all(status: "REQUESTED")
108+
end
109+
end
110+
111+
it { expect(response).to be_a(Moip2::Resource::Transfer) }
112+
it { expect(response.transfers.size).to eq(20) }
113+
it { expect(response.transfers.first).to be_a(Moip2::Resource::Transfer) }
114+
it { expect(response.transfers.first.id).to eq("TRA-4PGNZ7KOFN4G") }
115+
end
116+
117+
context "when passing filters" do
118+
subject(:response) do
119+
VCR.use_cassette("find_all_transfers_filters") do
120+
transfer_api.find_all(filters: { "transferInstrument.method": { in: ["BANK_ACCOUNT"] } })
121+
end
122+
end
123+
124+
it { expect(response).to be_a(Moip2::Resource::Transfer) }
125+
it { expect(response.transfers.size).to eq(20) }
126+
it { expect(response.transfers.first).to be_a(Moip2::Resource::Transfer) }
127+
it { expect(response.transfers.first.id).to eq("TRA-4PGNZ7KOFN4G") }
128+
end
129+
130+
context "when passing status, limit and offset" do
131+
subject(:response) do
132+
VCR.use_cassette("find_all_transfers_multi_params") do
133+
transfer_api.find_all(status: "REQUESTED",
134+
limit: 2,
135+
offset: 2)
136+
end
137+
end
138+
it { expect(response).to be_a(Moip2::Resource::Transfer) }
139+
it { expect(response.transfers.size).to eq(2) }
140+
it { expect(response.transfers.first).to be_a(Moip2::Resource::Transfer) }
141+
it { expect(response.transfers.first.id).to eq("TRA-WG7MJCRAILEH") }
142+
end
143+
end
144+
145+
describe "#revert" do
146+
let (:reverted_transfer) do
147+
VCR.use_cassette("revert_transfer") do
148+
transfer_api.reverse("TRA-B0W5FD5FCADG")
149+
end
150+
end
151+
152+
it { expect(reverted_transfer.id).to eq "TRA-B0W5FD5FCADG" }
153+
it { expect(reverted_transfer.status).to eq "REVERSED" }
154+
end
155+
end

vcr_cassettes/create_transfer_success.yml

Lines changed: 44 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)