Skip to content

Commit ea3b1d3

Browse files
committed
add tests
1 parent 1d59dc9 commit ea3b1d3

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

test/algora/payments_test.exs

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
defmodule Algora.PaymentsTest do
2+
use Algora.DataCase
3+
4+
import Mox
5+
6+
alias Algora.Payments
7+
alias Algora.Payments.Account
8+
alias Algora.Payments.Transaction
9+
alias Algora.Repo
10+
11+
setup :verify_on_exit!
12+
13+
describe "perform/1" do
14+
setup do
15+
user = insert(:user)
16+
account = insert(:account, user: user)
17+
18+
{:ok, user: user, account: account}
19+
end
20+
21+
test "executes transfer when there are pending credits", %{user: user} do
22+
# Create a successful credit transaction
23+
insert(:transaction,
24+
user: user,
25+
type: :credit,
26+
status: :succeeded,
27+
net_amount: Money.new(1, :USD)
28+
)
29+
30+
# Mock Stripe transfer creation
31+
expect(Algora.StripeMock, :create_transfer, fn params ->
32+
assert params.amount == 100
33+
assert params.currency == "USD"
34+
35+
{:ok,
36+
%{
37+
id: "tr_123",
38+
status: :succeeded,
39+
amount: 100,
40+
currency: "USD"
41+
}}
42+
end)
43+
44+
assert {:ok, _transfer} = Payments.execute_pending_transfers(user.id)
45+
46+
# Verify transfer transaction was created
47+
transfer_tx = Repo.get_by(Transaction, provider_id: "tr_123")
48+
assert transfer_tx.status == :succeeded
49+
assert transfer_tx.type == :transfer
50+
assert Money.equal?(transfer_tx.net_amount, Money.new(1, :USD))
51+
end
52+
53+
test "does nothing when user has no pending credits", %{user: user} do
54+
assert {:ok, nil} = Payments.execute_pending_transfers(user.id)
55+
56+
assert Repo.aggregate(Transaction, :count) == 0
57+
end
58+
59+
test "does nothing when user has no stripe account", %{user: user} do
60+
# Delete the account created in setup
61+
Repo.delete_all(Account)
62+
63+
insert(:transaction,
64+
user: user,
65+
type: :credit,
66+
status: :succeeded,
67+
net_amount: Money.new(1000, :USD)
68+
)
69+
70+
assert {:ok, nil} = Payments.execute_pending_transfers(user.id)
71+
72+
# Verify no transfer was created
73+
transfer_count =
74+
Transaction
75+
|> where([t], t.type == :transfer)
76+
|> Repo.aggregate(:count)
77+
78+
assert transfer_count == 0
79+
end
80+
81+
test "handles failed stripe transfers", %{user: user} do
82+
insert(:transaction,
83+
user: user,
84+
type: :credit,
85+
status: :succeeded,
86+
net_amount: Money.new(1000, :USD)
87+
)
88+
89+
expect(Algora.StripeMock, :create_transfer, fn _params ->
90+
{:error, %{message: "Insufficient funds"}}
91+
end)
92+
93+
assert {:error, _} = Payments.execute_pending_transfers(user.id)
94+
95+
# Verify transfer transaction status
96+
transfer_tx = Repo.one(from t in Transaction, where: t.type == :transfer)
97+
assert transfer_tx.status == :initialized
98+
end
99+
end
100+
end

test/support/factory.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,11 @@ defmodule Algora.Factory do
108108
id: Nanoid.generate(),
109109
provider: "stripe",
110110
provider_id: sequence(:acct, &"acct_#{&1}"),
111+
provider_meta: %{},
111112
name: "Kevin 'The Carver'",
112113
details_submitted: true,
113114
charges_enabled: true,
115+
payouts_enabled: true,
114116
service_agreement: "recipient",
115117
country: "US",
116118
type: :express,

0 commit comments

Comments
 (0)