Skip to content

Commit a30ded2

Browse files
committed
make tests pass
1 parent 7f8184a commit a30ded2

File tree

4 files changed

+100
-26
lines changed

4 files changed

+100
-26
lines changed

lib/algora/integrations/stripe/stripe.ex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,16 @@ defmodule Algora.Stripe do
3232

3333
def create(params), do: Algora.Stripe.client(__MODULE__).create(params)
3434
end
35+
36+
defmodule PaymentMethod do
37+
@moduledoc false
38+
39+
def attach(params), do: Algora.Stripe.client(__MODULE__).attach(params)
40+
end
41+
42+
defmodule SetupIntent do
43+
@moduledoc false
44+
45+
def retrieve(id, params), do: Algora.Stripe.client(__MODULE__).retrieve(id, params)
46+
end
3547
end

lib/algora_web/controllers/webhooks/stripe_controller.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ defmodule AlgoraWeb.Webhooks.StripeController do
9898
type: "checkout.session.completed",
9999
data: %{object: %Stripe.Session{customer: customer_id, mode: "setup", setup_intent: setup_intent_id}}
100100
}) do
101-
with {:ok, setup_intent} <- Stripe.SetupIntent.retrieve(setup_intent_id, %{}),
101+
with {:ok, setup_intent} <- Algora.Stripe.SetupIntent.retrieve(setup_intent_id, %{}),
102102
pm_id = setup_intent.payment_method,
103-
{:ok, payment_method} <- Stripe.PaymentMethod.attach(%{payment_method: pm_id, customer: customer_id}),
103+
{:ok, payment_method} <- Algora.Stripe.PaymentMethod.attach(%{payment_method: pm_id, customer: customer_id}),
104104
{:ok, customer} <- Repo.fetch_by(Customer, provider: "stripe", provider_id: customer_id),
105105
{:ok, _} <- Payments.create_payment_method(customer, payment_method) do
106106
Payments.broadcast()

test/algora_web/controllers/webhooks/stripe_controller_test.exs

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,86 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
55
import Algora.Factory
66
import Ecto.Query
77

8+
alias Algora.Bounties
89
alias Algora.Payments
910
alias Algora.Payments.PaymentMethod
1011
alias Algora.Payments.Transaction
1112
alias Algora.Repo
1213
alias AlgoraWeb.Webhooks.StripeController
1314

1415
setup do
15-
# Insert a test customer
16-
user = insert(:user)
17-
customer = insert(:customer, user: user)
18-
19-
# Common metadata for stripe events
16+
sender = insert(:user)
17+
recipient = insert(:user)
18+
customer = insert(:customer, user: sender)
2019
metadata = %{"version" => Payments.metadata_version()}
21-
22-
{:ok, customer: customer, metadata: metadata}
20+
{:ok, customer: customer, metadata: metadata, sender: sender, recipient: recipient}
2321
end
2422

2523
describe "handle_event/1 for charge.succeeded" do
26-
test "updates transaction status and creates jobs for credits", %{metadata: metadata} do
27-
group_id = Ecto.UUID.generate()
24+
test "updates transaction status and enqueues PromptPayoutConnect job", %{
25+
metadata: metadata,
26+
sender: sender,
27+
recipient: recipient
28+
} do
29+
group_id = "#{Algora.Util.random_int()}"
30+
31+
debit_tx =
32+
insert(:transaction, %{
33+
type: :debit,
34+
status: :initialized,
35+
group_id: group_id,
36+
user_id: sender.id
37+
})
2838

29-
# Create test transactions in the group
3039
credit_tx =
3140
insert(:transaction, %{
3241
type: :credit,
33-
status: :pending,
34-
group_id: group_id
42+
status: :initialized,
43+
group_id: group_id,
44+
user_id: recipient.id
3545
})
3646

47+
event = %Stripe.Event{
48+
type: "charge.succeeded",
49+
data: %{
50+
object: %Stripe.Charge{
51+
metadata: Map.put(metadata, "group_id", group_id)
52+
}
53+
}
54+
}
55+
56+
assert {:ok, _} = StripeController.handle_event(event)
57+
58+
assert Repo.get(Transaction, credit_tx.id).status == :succeeded
59+
assert Repo.get(Transaction, debit_tx.id).status == :succeeded
60+
61+
assert_enqueued(worker: Bounties.Jobs.PromptPayoutConnect)
62+
end
63+
64+
test "updates transaction status and enqueues ExecutePendingTransfer for enabled accounts", %{
65+
metadata: metadata,
66+
sender: sender,
67+
recipient: recipient
68+
} do
69+
_account = insert(:account, %{user_id: recipient.id, payouts_enabled: true})
70+
group_id = "#{Algora.Util.random_int()}"
71+
3772
debit_tx =
3873
insert(:transaction, %{
3974
type: :debit,
40-
status: :pending,
41-
group_id: group_id
75+
status: :initialized,
76+
group_id: group_id,
77+
user_id: sender.id
78+
})
79+
80+
credit_tx =
81+
insert(:transaction, %{
82+
type: :credit,
83+
status: :initialized,
84+
group_id: group_id,
85+
user_id: recipient.id
4286
})
4387

44-
# Create stripe event
4588
event = %Stripe.Event{
4689
type: "charge.succeeded",
4790
data: %{
@@ -51,26 +94,25 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
5194
}
5295
}
5396

54-
assert {:ok, nil} = StripeController.handle_event(event)
97+
assert {:ok, _} = StripeController.handle_event(event)
5598

56-
# Assert transactions were updated
5799
assert Repo.get(Transaction, credit_tx.id).status == :succeeded
58100
assert Repo.get(Transaction, debit_tx.id).status == :succeeded
59101

60-
# Assert jobs were created
61102
assert_enqueued(worker: Payments.Jobs.ExecutePendingTransfer, args: %{credit_id: credit_tx.id})
62103
end
63104
end
64105

65106
describe "handle_event/1 for transfer.created" do
66107
test "updates associated transaction status", %{metadata: metadata} do
67-
transfer_id = "tr_#{Ecto.UUID.generate()}"
108+
transfer_id = "tr_#{Algora.Util.random_int()}"
68109

69110
transaction =
70111
insert(:transaction, %{
71112
provider: "stripe",
72113
provider_id: transfer_id,
73-
status: :pending
114+
type: :transfer,
115+
status: :initialized
74116
})
75117

76118
event = %Stripe.Event{
@@ -93,8 +135,7 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
93135

94136
describe "handle_event/1 for checkout.session.completed" do
95137
test "creates payment method for setup mode", %{customer: customer} do
96-
setup_intent_id = "seti_#{Ecto.UUID.generate()}"
97-
payment_method_id = "pm_#{Ecto.UUID.generate()}"
138+
setup_intent_id = "seti_#{Algora.Util.random_int()}"
98139

99140
event = %Stripe.Event{
100141
type: "checkout.session.completed",
@@ -109,8 +150,9 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
109150

110151
assert :ok = StripeController.handle_event(event)
111152

112-
# Assert payment method was created
113-
payment_method = Repo.one!(from p in PaymentMethod, where: p.provider_id == ^payment_method_id)
153+
{:ok, setup_intent} = Algora.Stripe.SetupIntent.retrieve(setup_intent_id, %{})
154+
155+
payment_method = Repo.one!(from p in PaymentMethod, where: p.provider_id == ^setup_intent.payment_method)
114156
assert payment_method.customer_id == customer.id
115157
end
116158
end

test/support/stripe_mock.ex

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,24 @@ defmodule Algora.Support.StripeMock do
5757
{:ok, %Stripe.Session{id: "cs_#{Algora.Util.random_int()}", url: "https://example.com/stripe"}}
5858
end
5959
end
60+
61+
defmodule PaymentMethod do
62+
@moduledoc false
63+
def attach(%{payment_method: payment_method_id}) do
64+
{:ok, %Stripe.PaymentMethod{id: payment_method_id}}
65+
end
66+
end
67+
68+
defmodule SetupIntent do
69+
@moduledoc false
70+
def retrieve(id, _params) do
71+
payment_method_id = "pm_#{:erlang.phash2(id)}"
72+
73+
{:ok,
74+
%Stripe.SetupIntent{
75+
id: "seti_#{:erlang.phash2(id)}",
76+
payment_method: payment_method_id
77+
}}
78+
end
79+
end
6080
end

0 commit comments

Comments
 (0)