@@ -5,43 +5,86 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
5
5
import Algora.Factory
6
6
import Ecto.Query
7
7
8
+ alias Algora.Bounties
8
9
alias Algora.Payments
9
10
alias Algora.Payments.PaymentMethod
10
11
alias Algora.Payments.Transaction
11
12
alias Algora.Repo
12
13
alias AlgoraWeb.Webhooks.StripeController
13
14
14
15
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 )
20
19
metadata = % { "version" => Payments . metadata_version ( ) }
21
-
22
- { :ok , customer: customer , metadata: metadata }
20
+ { :ok , customer: customer , metadata: metadata , sender: sender , recipient: recipient }
23
21
end
24
22
25
23
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
+ } )
28
38
29
- # Create test transactions in the group
30
39
credit_tx =
31
40
insert ( :transaction , % {
32
41
type: :credit ,
33
- status: :pending ,
34
- group_id: group_id
42
+ status: :initialized ,
43
+ group_id: group_id ,
44
+ user_id: recipient . id
35
45
} )
36
46
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
+
37
72
debit_tx =
38
73
insert ( :transaction , % {
39
74
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
42
86
} )
43
87
44
- # Create stripe event
45
88
event = % Stripe.Event {
46
89
type: "charge.succeeded" ,
47
90
data: % {
@@ -51,26 +94,25 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
51
94
}
52
95
}
53
96
54
- assert { :ok , nil } = StripeController . handle_event ( event )
97
+ assert { :ok , _ } = StripeController . handle_event ( event )
55
98
56
- # Assert transactions were updated
57
99
assert Repo . get ( Transaction , credit_tx . id ) . status == :succeeded
58
100
assert Repo . get ( Transaction , debit_tx . id ) . status == :succeeded
59
101
60
- # Assert jobs were created
61
102
assert_enqueued ( worker: Payments.Jobs.ExecutePendingTransfer , args: % { credit_id: credit_tx . id } )
62
103
end
63
104
end
64
105
65
106
describe "handle_event/1 for transfer.created" do
66
107
test "updates associated transaction status" , % { metadata: metadata } do
67
- transfer_id = "tr_#{ Ecto.UUID . generate ( ) } "
108
+ transfer_id = "tr_#{ Algora.Util . random_int ( ) } "
68
109
69
110
transaction =
70
111
insert ( :transaction , % {
71
112
provider: "stripe" ,
72
113
provider_id: transfer_id ,
73
- status: :pending
114
+ type: :transfer ,
115
+ status: :initialized
74
116
} )
75
117
76
118
event = % Stripe.Event {
@@ -93,8 +135,7 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
93
135
94
136
describe "handle_event/1 for checkout.session.completed" do
95
137
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 ( ) } "
98
139
99
140
event = % Stripe.Event {
100
141
type: "checkout.session.completed" ,
@@ -109,8 +150,9 @@ defmodule AlgoraWeb.Webhooks.StripeControllerTest do
109
150
110
151
assert :ok = StripeController . handle_event ( event )
111
152
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 )
114
156
assert payment_method . customer_id == customer . id
115
157
end
116
158
end
0 commit comments