@@ -10,44 +10,55 @@ defmodule Algora.PaymentsTest do
10
10
11
11
setup :verify_on_exit!
12
12
13
- describe "perform /1" do
13
+ describe "execute_pending_transfers /1" do
14
14
setup do
15
15
user = insert ( :user )
16
16
account = insert ( :account , user: user )
17
17
18
18
{ :ok , user: user , account: account }
19
19
end
20
20
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
23
22
insert ( :transaction ,
24
23
user: user ,
25
24
type: :credit ,
26
25
status: :succeeded ,
27
26
net_amount: Money . new ( 1 , :USD )
28
27
)
29
28
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
+ )
34
35
36
+ stripe_transfer_id = "tr_#{ Nanoid . generate ( ) } "
37
+
38
+ expect ( Algora.StripeMock , :create_transfer , fn params ->
35
39
{ :ok ,
36
40
% {
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
41
45
} }
42
46
end )
43
47
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
45
53
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 )
48
55
assert transfer_tx . status == :succeeded
49
56
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 ) )
51
62
end
52
63
53
64
test "does nothing when user has no pending credits" , % { user: user } do
@@ -56,34 +67,40 @@ defmodule Algora.PaymentsTest do
56
67
assert Repo . aggregate ( Transaction , :count ) == 0
57
68
end
58
69
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 ( )
62
72
63
73
insert ( :transaction ,
64
74
user: user ,
65
75
type: :credit ,
66
76
status: :succeeded ,
67
- net_amount: Money . new ( 1000 , :USD )
77
+ net_amount: Money . new ( 1 , :USD )
68
78
)
69
79
70
80
assert { :ok , nil } = Payments . execute_pending_transfers ( user . id )
81
+ assert Transaction |> where ( [ t ] , t . type == :transfer ) |> Repo . aggregate ( :count ) == 0
82
+ end
71
83
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 )
77
86
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
79
96
end
80
97
81
98
test "handles failed stripe transfers" , % { user: user } do
82
99
insert ( :transaction ,
83
100
user: user ,
84
101
type: :credit ,
85
102
status: :succeeded ,
86
- net_amount: Money . new ( 1000 , :USD )
103
+ net_amount: Money . new ( 1 , :USD )
87
104
)
88
105
89
106
expect ( Algora.StripeMock , :create_transfer , fn _params ->
@@ -92,9 +109,8 @@ defmodule Algora.PaymentsTest do
92
109
93
110
assert { :error , _ } = Payments . execute_pending_transfers ( user . id )
94
111
95
- # Verify transfer transaction status
96
112
transfer_tx = Repo . one ( from t in Transaction , where: t . type == :transfer )
97
- assert transfer_tx . status == :initialized
113
+ assert transfer_tx . status == :failed
98
114
end
99
115
end
100
116
end
0 commit comments