Skip to content

Commit eeeab32

Browse files
committed
update tests
1 parent ea3b1d3 commit eeeab32

File tree

3 files changed

+59
-40
lines changed

3 files changed

+59
-40
lines changed

lib/algora/payments/payments.ex

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -320,26 +320,24 @@ defmodule Algora.Payments do
320320
# TODO: provide idempotency key
321321
case Algora.Stripe.create_transfer(%{
322322
amount: MoneyUtils.to_minor_units(transaction.net_amount),
323-
currency: to_string(transaction.net_amount.currency),
323+
currency: MoneyUtils.to_stripe_currency(transaction.net_amount),
324324
destination: account.provider_id
325325
}) do
326326
{:ok, transfer} ->
327327
# it's fine if this fails since we'll receive a webhook
328-
_result = try_update_transaction(transaction, transfer)
328+
transaction
329+
|> change(%{status: :succeeded, provider_id: transfer.id, provider_meta: Util.normalize_struct(transfer)})
330+
|> Repo.update()
331+
329332
{:ok, transfer}
330333

331334
{:error, error} ->
335+
# TODO: inconsistent state if this fails
336+
transaction
337+
|> change(%{status: :failed})
338+
|> Repo.update()
339+
332340
{:error, error}
333341
end
334342
end
335-
336-
defp try_update_transaction(transaction, transfer) do
337-
transaction
338-
|> change(%{
339-
status: if(transfer.status == :succeeded, do: :succeeded, else: :failed),
340-
provider_id: transfer.id,
341-
provider_meta: Util.normalize_struct(transfer)
342-
})
343-
|> Repo.update()
344-
end
345343
end

lib/algora/shared/money_utils.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ defmodule Algora.MoneyUtils do
1717
amount_int
1818
end
1919

20+
@spec to_stripe_currency(Money.t()) :: String.t()
21+
def to_stripe_currency(money) do
22+
money.currency |> to_string() |> String.downcase()
23+
end
24+
2025
# TODO: Find a way to make this obsolete
2126
# Why does ecto return {currency, amount} instead of Money.t()?
2227
def ensure_money_field(struct, field) do

test/algora/payments_test.exs

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,44 +10,55 @@ defmodule Algora.PaymentsTest do
1010

1111
setup :verify_on_exit!
1212

13-
describe "perform/1" do
13+
describe "execute_pending_transfers/1" do
1414
setup do
1515
user = insert(:user)
1616
account = insert(:account, user: user)
1717

1818
{:ok, user: user, account: account}
1919
end
2020

21-
test "executes transfer when there are pending credits", %{user: user} do
22-
# Create a successful credit transaction
21+
test "executes transfer when there are pending credits", %{user: user, account: account} do
2322
insert(:transaction,
2423
user: user,
2524
type: :credit,
2625
status: :succeeded,
2726
net_amount: Money.new(1, :USD)
2827
)
2928

30-
# Mock Stripe transfer creation
31-
expect(Algora.StripeMock, :create_transfer, fn params ->
32-
assert params.amount == 100
33-
assert params.currency == "USD"
29+
insert(:transaction,
30+
user: user,
31+
type: :credit,
32+
status: :succeeded,
33+
net_amount: Money.new(2, :USD)
34+
)
3435

36+
stripe_transfer_id = "tr_#{Nanoid.generate()}"
37+
38+
expect(Algora.StripeMock, :create_transfer, fn params ->
3539
{:ok,
3640
%{
37-
id: "tr_123",
38-
status: :succeeded,
39-
amount: 100,
40-
currency: "USD"
41+
id: stripe_transfer_id,
42+
amount: params.amount,
43+
currency: params.currency,
44+
destination: params.destination
4145
}}
4246
end)
4347

44-
assert {:ok, _transfer} = Payments.execute_pending_transfers(user.id)
48+
assert {:ok, transfer} = Payments.execute_pending_transfers(user.id)
49+
assert transfer.id == stripe_transfer_id
50+
assert transfer.amount == 100 + 200
51+
assert transfer.currency == "usd"
52+
assert transfer.destination == account.provider_id
4553

46-
# Verify transfer transaction was created
47-
transfer_tx = Repo.get_by(Transaction, provider_id: "tr_123")
54+
transfer_tx = Repo.get_by(Transaction, provider_id: stripe_transfer_id)
4855
assert transfer_tx.status == :succeeded
4956
assert transfer_tx.type == :transfer
50-
assert Money.equal?(transfer_tx.net_amount, Money.new(1, :USD))
57+
assert transfer_tx.provider == "stripe"
58+
assert transfer_tx.provider_meta["id"] == stripe_transfer_id
59+
assert Money.equal?(transfer_tx.net_amount, Money.new(1 + 2, :USD))
60+
assert Money.equal?(transfer_tx.gross_amount, Money.new(1 + 2, :USD))
61+
assert Money.equal?(transfer_tx.total_fee, Money.new(0, :USD))
5162
end
5263

5364
test "does nothing when user has no pending credits", %{user: user} do
@@ -56,34 +67,40 @@ defmodule Algora.PaymentsTest do
5667
assert Repo.aggregate(Transaction, :count) == 0
5768
end
5869

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)
70+
test "does nothing when user has payouts disabled", %{user: user, account: account} do
71+
account |> change(payouts_enabled: false) |> Repo.update()
6272

6373
insert(:transaction,
6474
user: user,
6575
type: :credit,
6676
status: :succeeded,
67-
net_amount: Money.new(1000, :USD)
77+
net_amount: Money.new(1, :USD)
6878
)
6979

7080
assert {:ok, nil} = Payments.execute_pending_transfers(user.id)
81+
assert Transaction |> where([t], t.type == :transfer) |> Repo.aggregate(:count) == 0
82+
end
7183

72-
# Verify no transfer was created
73-
transfer_count =
74-
Transaction
75-
|> where([t], t.type == :transfer)
76-
|> Repo.aggregate(:count)
84+
test "does nothing when user has no stripe account", %{user: user} do
85+
Repo.delete_all(Account)
7786

78-
assert transfer_count == 0
87+
insert(:transaction,
88+
user: user,
89+
type: :credit,
90+
status: :succeeded,
91+
net_amount: Money.new(1, :USD)
92+
)
93+
94+
assert {:ok, nil} = Payments.execute_pending_transfers(user.id)
95+
assert Transaction |> where([t], t.type == :transfer) |> Repo.aggregate(:count) == 0
7996
end
8097

8198
test "handles failed stripe transfers", %{user: user} do
8299
insert(:transaction,
83100
user: user,
84101
type: :credit,
85102
status: :succeeded,
86-
net_amount: Money.new(1000, :USD)
103+
net_amount: Money.new(1, :USD)
87104
)
88105

89106
expect(Algora.StripeMock, :create_transfer, fn _params ->
@@ -92,9 +109,8 @@ defmodule Algora.PaymentsTest do
92109

93110
assert {:error, _} = Payments.execute_pending_transfers(user.id)
94111

95-
# Verify transfer transaction status
96112
transfer_tx = Repo.one(from t in Transaction, where: t.type == :transfer)
97-
assert transfer_tx.status == :initialized
113+
assert transfer_tx.status == :failed
98114
end
99115
end
100116
end

0 commit comments

Comments
 (0)