@@ -10,44 +10,55 @@ defmodule Algora.PaymentsTest do
1010
1111 setup :verify_on_exit!
1212
13- describe "perform /1" do
13+ describe "execute_pending_transfers /1" do
1414 setup do
1515 user = insert ( :user )
1616 account = insert ( :account , user: user )
1717
1818 { :ok , user: user , account: account }
1919 end
2020
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
2322 insert ( :transaction ,
2423 user: user ,
2524 type: :credit ,
2625 status: :succeeded ,
2726 net_amount: Money . new ( 1 , :USD )
2827 )
2928
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+ )
3435
36+ stripe_transfer_id = "tr_#{ Nanoid . generate ( ) } "
37+
38+ expect ( Algora.StripeMock , :create_transfer , fn params ->
3539 { :ok ,
3640 % {
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
4145 } }
4246 end )
4347
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
4553
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 )
4855 assert transfer_tx . status == :succeeded
4956 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 ) )
5162 end
5263
5364 test "does nothing when user has no pending credits" , % { user: user } do
@@ -56,34 +67,40 @@ defmodule Algora.PaymentsTest do
5667 assert Repo . aggregate ( Transaction , :count ) == 0
5768 end
5869
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 ( )
6272
6373 insert ( :transaction ,
6474 user: user ,
6575 type: :credit ,
6676 status: :succeeded ,
67- net_amount: Money . new ( 1000 , :USD )
77+ net_amount: Money . new ( 1 , :USD )
6878 )
6979
7080 assert { :ok , nil } = Payments . execute_pending_transfers ( user . id )
81+ assert Transaction |> where ( [ t ] , t . type == :transfer ) |> Repo . aggregate ( :count ) == 0
82+ end
7183
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 )
7786
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
7996 end
8097
8198 test "handles failed stripe transfers" , % { user: user } do
8299 insert ( :transaction ,
83100 user: user ,
84101 type: :credit ,
85102 status: :succeeded ,
86- net_amount: Money . new ( 1000 , :USD )
103+ net_amount: Money . new ( 1 , :USD )
87104 )
88105
89106 expect ( Algora.StripeMock , :create_transfer , fn _params ->
@@ -92,9 +109,8 @@ defmodule Algora.PaymentsTest do
92109
93110 assert { :error , _ } = Payments . execute_pending_transfers ( user . id )
94111
95- # Verify transfer transaction status
96112 transfer_tx = Repo . one ( from t in Transaction , where: t . type == :transfer )
97- assert transfer_tx . status == :initialized
113+ assert transfer_tx . status == :failed
98114 end
99115 end
100116end
0 commit comments