Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/algora/payments/jobs/execute_pending_transfers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ defmodule Algora.Payments.Jobs.ExecutePendingTransfer do
@moduledoc false
use Oban.Worker,
queue: :transfers,
max_attempts: 1
max_attempts: 1,
unique: [period: :infinity]

alias Algora.Payments

Expand Down
3 changes: 2 additions & 1 deletion lib/algora/payments/payments.ex
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,9 @@ defmodule Algora.Payments do
{:ok, updated_account} <- update_account(account, stripe_account) do
user = Accounts.get_user(account.user_id)

if user && stripe_account.charges_enabled do
if user && stripe_account.payouts_enabled do
Accounts.update_settings(user, %{country: stripe_account.country})
enqueue_pending_transfers(account.user_id)
end

{:ok, updated_account}
Expand Down
55 changes: 55 additions & 0 deletions test/algora/payments_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -290,4 +290,59 @@ defmodule Algora.PaymentsTest do
assert transfer_tx1.id == transfer_tx2.id
end
end

describe "refresh_stripe_account/1" do
test "executes pending transfers", %{user: user} do
group_id0 = Nanoid.generate()
group_id1 = Nanoid.generate()
group_id2 = Nanoid.generate()

credit0 =
insert(:transaction,
user: user,
type: :credit,
status: :succeeded,
net_amount: Money.new(100, :USD),
group_id: group_id0
)

_transfer0 =
insert(:transaction,
user: user,
type: :transfer,
status: :succeeded,
net_amount: Money.new(100, :USD),
group_id: group_id0
)

credit1 =
insert(:transaction,
user: user,
type: :credit,
status: :succeeded,
net_amount: Money.new(100, :USD),
group_id: group_id1
)

credit2 =
insert(:transaction,
user: user,
type: :credit,
status: :succeeded,
net_amount: Money.new(100, :USD),
group_id: group_id2
)

assert {:ok, _account} = Payments.refresh_stripe_account(user)
jobs = all_enqueued()
assert length(jobs) == 2
refute_enqueued(worker: ExecutePendingTransfer, args: %{credit_id: credit0.id})
assert_enqueued(worker: ExecutePendingTransfer, args: %{credit_id: credit1.id})
assert_enqueued(worker: ExecutePendingTransfer, args: %{credit_id: credit2.id})

assert {:ok, _account} = Payments.refresh_stripe_account(user)
jobs = all_enqueued()
assert length(jobs) == 2
end
end
end
23 changes: 23 additions & 0 deletions test/support/stripe_mock.ex
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,27 @@ defmodule Algora.Support.StripeMock do
{:ok, %Stripe.Customer{id: "cus_#{Algora.Util.random_int()}"}}
end
end

defmodule Account do
@moduledoc false
def retrieve(id) do
{:ok,
%Stripe.Account{
id: id,
charges_enabled: true,
payouts_enabled: true,
default_currency: "usd",
details_submitted: true,
country: "US",
settings: %{
payouts: %{
schedule: %{
interval: "daily",
delay_days: 3
}
}
}
}}
end
end
end