Skip to content

Commit 7f8184a

Browse files
committed
in midst of adding stripe controller tests
1 parent 99f9a63 commit 7f8184a

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
defmodule AlgoraWeb.Webhooks.StripeControllerTest do
2+
use AlgoraWeb.ConnCase
3+
use Oban.Testing, repo: Algora.Repo
4+
5+
import Algora.Factory
6+
import Ecto.Query
7+
8+
alias Algora.Payments
9+
alias Algora.Payments.PaymentMethod
10+
alias Algora.Payments.Transaction
11+
alias Algora.Repo
12+
alias AlgoraWeb.Webhooks.StripeController
13+
14+
setup do
15+
# Insert a test customer
16+
user = insert(:user)
17+
customer = insert(:customer, user: user)
18+
19+
# Common metadata for stripe events
20+
metadata = %{"version" => Payments.metadata_version()}
21+
22+
{:ok, customer: customer, metadata: metadata}
23+
end
24+
25+
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()
28+
29+
# Create test transactions in the group
30+
credit_tx =
31+
insert(:transaction, %{
32+
type: :credit,
33+
status: :pending,
34+
group_id: group_id
35+
})
36+
37+
debit_tx =
38+
insert(:transaction, %{
39+
type: :debit,
40+
status: :pending,
41+
group_id: group_id
42+
})
43+
44+
# Create stripe event
45+
event = %Stripe.Event{
46+
type: "charge.succeeded",
47+
data: %{
48+
object: %Stripe.Charge{
49+
metadata: Map.put(metadata, "group_id", group_id)
50+
}
51+
}
52+
}
53+
54+
assert {:ok, nil} = StripeController.handle_event(event)
55+
56+
# Assert transactions were updated
57+
assert Repo.get(Transaction, credit_tx.id).status == :succeeded
58+
assert Repo.get(Transaction, debit_tx.id).status == :succeeded
59+
60+
# Assert jobs were created
61+
assert_enqueued(worker: Payments.Jobs.ExecutePendingTransfer, args: %{credit_id: credit_tx.id})
62+
end
63+
end
64+
65+
describe "handle_event/1 for transfer.created" do
66+
test "updates associated transaction status", %{metadata: metadata} do
67+
transfer_id = "tr_#{Ecto.UUID.generate()}"
68+
69+
transaction =
70+
insert(:transaction, %{
71+
provider: "stripe",
72+
provider_id: transfer_id,
73+
status: :pending
74+
})
75+
76+
event = %Stripe.Event{
77+
type: "transfer.created",
78+
data: %{
79+
object: %Stripe.Transfer{
80+
id: transfer_id,
81+
metadata: metadata
82+
}
83+
}
84+
}
85+
86+
assert {:ok, nil} = StripeController.handle_event(event)
87+
88+
updated_tx = Repo.get(Transaction, transaction.id)
89+
assert updated_tx.status == :succeeded
90+
assert updated_tx.succeeded_at != nil
91+
end
92+
end
93+
94+
describe "handle_event/1 for checkout.session.completed" do
95+
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()}"
98+
99+
event = %Stripe.Event{
100+
type: "checkout.session.completed",
101+
data: %{
102+
object: %Stripe.Session{
103+
customer: customer.provider_id,
104+
mode: "setup",
105+
setup_intent: setup_intent_id
106+
}
107+
}
108+
}
109+
110+
assert :ok = StripeController.handle_event(event)
111+
112+
# Assert payment method was created
113+
payment_method = Repo.one!(from p in PaymentMethod, where: p.provider_id == ^payment_method_id)
114+
assert payment_method.customer_id == customer.id
115+
end
116+
end
117+
end

0 commit comments

Comments
 (0)