
    Hi7                         d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZ d	d
lmZ  G d de      Zy)z!Tests for point transfer feature.    )Decimal)Mockpatch)TestCase)WalletService)InsufficientBalanceErrorInvalidParamsErrorUserNotFoundError)transfer_completed)WALLET_TRANSFER   )TestUserc                   j    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)TransferPointsTestsz*Test cases for the transfer_points method.c                    ddl m} t        j                  j	                  dd      | _        t        j                  j	                  dd      | _        dddd	} |t        |
      | _        t        | j                        | _	        | j                  j                  | j
                  j                  dt        d      d       y)zSet up test data.r   )WalletRepositoryuser1zuser1@test.com)usernameemailuser2zuser2@test.com   )cash_balancecredit_balancereward_points)
user_modelpoint_typesr   1000.00zInitial balanceuser_id
point_typeamountremarksN)wallet_utilsr   r   objectscreater   r   repor   service	add_pointidr   )selfr   r   s      I/home/cursorai/projects/django-wallet-utils/tests/test_transfer_points.pysetUpzTransferPointsTests.setUp   s    1 %%,,gEU,V
%%,,gEU,V
 

 %kR	$TYY/ 	JJMM%9%%	 	 	
    c                    t        d      }| j                  j                  | j                  j                  | j
                  j                  dd|d      }| j                  d|       | j                  d|       | j                  d|       | j                  |d   | j                  j                         | j                  |d	   | j
                  j                         | j                  |d
   |       | j                  j                  | j                  j                  d      }| j                  j                  | j
                  j                  d      }| j                  |t        d             | j                  |t        d             y)z8Test transferring points of the same type between users.100.00r   zTransfer testfrom_user_id
to_user_idfrom_point_typeto_point_typer!   r"   transfer_idfrom_transaction_idto_transaction_idr1   r2   r!   z900.00N)
r   r'   transfer_pointsr   r)   r   assertInassertEqualr&   get_user_balance)r*   transfer_amountresultuser1_balanceuser2_balances        r+   test_transfer_same_point_typez1TransferPointsTests.test_transfer_same_point_type0   s0    "(+ --zz}}*("# . 
 	mV,+V4)62/?-tzz}}=)?; 		224::==.Q		224::==.Q(9:(9:r-   c                 ,   t        d      }| j                  j                  | j                  j                  | j
                  j                  dd|d      }| j                  |d   d       | j                  |d   d       | j                  j                  | j                  j                  d      }| j                  j                  | j
                  j                  d      }| j                  |t        d             | j                  |t        d             y	)
z6Test transferring points across different point types.50.00r   r   zCash to credit transferr0   r3   r4   z950.00N)	r   r'   r8   r   r)   r   r:   r&   r;   )r*   r<   r=   
user1_cashuser2_credits        r+   test_transfer_cross_typez,TransferPointsTests.test_transfer_cross_typeM   s     "'* --zz}}**"- . 
 	 12NC02BC YY//

~N
yy11$**--AQRWX%67ww'78r-   c                    t        d      }| j                  j                  | j                  j                  | j                  j                  dd|d      }| j                  |d   |d          | j                  j                  | j                  j                  d      }| j                  j                  | j                  j                  d      }| j                  |t        d             | j                  |t        d             y	)
z6Test self-transfer (same user, different point types).z200.00r   r   zConvert cash to creditr0   r1   r2   z800.00N)r   r'   r8   r   r)   r:   r&   r;   )r*   r<   r=   cashcredits        r+   test_transfer_selfz&TransferPointsTests.test_transfer_selff   s     "(+ --zz}}**", . 
 	/1EF yy))$**--H++DJJMM;KLwx01!23r-   c           	         t        d      }| j                  t              5 }| j                  j	                  | j
                  j                  | j                  j                  dd|d       ddd       | j                  j                  j                         | j                  |j                  j                         y# 1 sw Y   TxY w)z(Test transfer with insufficient balance.z2000.00r   zOver budgetr0   N)r   assertRaisesr   r'   r8   r   r)   r   assertIsNotNone	exception	available	requested)r*   r<   ctxs      r+   "test_transfer_insufficient_balancez6TransferPointsTests.test_transfer_insufficient_balance~   s     "), 78CLL((!ZZ]]::== .,&% )  9 	S]]445S]]445 98s   A
B>>Cc           
      $   d}| j                  t              5 }| j                  j                  | j                  j
                  |ddt        d      d       ddd       | j                  j                  j                  |       y# 1 sw Y   0xY w)z+Test transfer to a user that doesn't exist.i r   r/   zTo ghostr0   N)
rK   r
   r'   r8   r   r)   r   r:   rM   r   )r*   nonexistent_user_idrP   s      r+   #test_transfer_nonexistent_recipientz7TransferPointsTests.test_transfer_nonexistent_recipient   s~     $ 01SLL((!ZZ]]. .,x(" )  2 	..0CD 21s   ?BBc           
      H   | j                  t              5 }| j                  j                  | j                  j
                  | j                  j
                  ddt        d      d       ddd       | j                  j                  j                  d       y# 1 sw Y   0xY w)z#Test transfer with negative amount.r   z-50.00zNegative testr0   Nr8   rK   r	   r'   r8   r   r)   r   r   r:   rM   methodr*   rP   s     r+   test_transfer_negative_amountz1TransferPointsTests.test_transfer_negative_amount   s~     12cLL((!ZZ]]::== .,x(' )  3 	--/@A 32   ABB!c           
      H   | j                  t              5 }| j                  j                  | j                  j
                  | j                  j
                  ddt        d      d       ddd       | j                  j                  j                  d       y# 1 sw Y   0xY w)zTest transfer with zero amount.r   z0.00z	Zero testr0   Nr8   rV   rX   s     r+   test_transfer_zero_amountz-TransferPointsTests.test_transfer_zero_amount   s}     12cLL((!ZZ]]::== .,v# )  3 	--/@A 32rZ   c           	      T   ddd}| j                   j                  | j                  j                  | j                  j                  ddt        d      d|      }| j                   j                  |d         }| j                   j                  |d	         }| j                  d
|j                         | j                  |j                  d
   d       | j                  d|j                         | j                  |j                  d   | j                  j                         | j                  d|j                         | j                  |j                  d   d       | j                  d|j                         | j                  |j                  d   | j                  j                         y)z#Test transfer with custom metadata.zORD-123summer_promo)order_idcampaignr   z75.00zPromo transfer)r1   r2   r3   r4   r!   r"   metadatar6   r7   r_   transfer_tor`   transfer_fromN)
r'   r8   r   r)   r   r   get_transaction_by_idr9   
extra_datar:   )r*   ra   r=   from_record	to_records        r+   test_transfer_with_metadataz/TransferPointsTests.test_transfer_with_metadata   sU    !*~F --zz}}*(7#$ . 
 ll88@U9VWLL66v>Q7RS	j+"8"89//
;YGm[%;%;<//>

Nj)"6"67--j9>Joy';';<--o>

Nr-   c                 2   | j                   j                  }d }t        j                  | j                   d|      5  | j	                  t
              5  | j                   j                  | j                  j                  | j                  j                  ddt        d      d       ddd       ddd       | j                  j                  | j                  j                  d      }| j                  |t        d	             y# 1 sw Y   ]xY w# 1 sw Y   axY w)
z9Test that transfer is atomic (both succeed or both fail).c                      t        d      )NzSimulated failure)	Exception)argskwargss     r+   failing_add_pointzFTransferPointsTests.test_transfer_atomicity.<locals>.failing_add_point   s    /00r-   r(   )side_effectr   r/   zShould failr0   Nr   )r'   r(   r   objectrK   rk   r8   r   r)   r   r   r&   r;   r:   )r*   original_add_pointrn   balances       r+   test_transfer_atomicityz+TransferPointsTests.test_transfer_atomicity   s     "\\33	1 \\$,,ARS""9-,,!%#zz}}$2"0"8,) -  . T )),,TZZ]]NK')"45 .- TSs$   DAD%DD
	DDc           	         g fd}t        j                  |       	 | j                  j                  | j                  j
                  | j                  j
                  ddt        d      d      }| j                  t              d       d   }| j                  |d   |d          | j                  |d	   | j                  j
                         | j                  |d
   | j                  j
                         | j                  |d   t        d             | j                  |d          | j                  |d          t        j                  |       y# t        j                  |       w xY w)zFTest that transfer_completed signal is sent after successful transfer.c                 (    j                  |       y )N)append)senderrm   signal_receiveds     r+   signal_handlerzETransferPointsTests.test_transfer_signal_sent.<locals>.signal_handler  s    ""6*r-   r   r/   zSignal testr0   r   r   r5   r1   r2   r!   rf   rg   N)r   connectr'   r8   r   r)   r   r   r:   lenrL   
disconnect)r*   ry   r=   signal_datarx   s       @r+   test_transfer_signal_sentz-TransferPointsTests.test_transfer_signal_sent   s7    	+ 	"">2	:\\11!ZZ]]::== .,x(% 2 F S115)!,K[79NO[8$**--H[6

F[2GH4EF  ]!;<  [!9:)).9)).9s   D"E E.c           	         ddl m} | j                  j                  | j                  j
                  | j                  j
                  ddt        d      d|      }| j                  j                  |d         }| j                  j                  |d         }| j                  |j                  |       | j                  |j                  |       y	)
z+Test transfer with custom transaction type.r   )SYSTEM_REWARDr   rB   zCustom type test)r1   r2   r3   r4   r!   r"   
trans_typer6   r7   N)wallet_utils.transaction_typesr   r'   r8   r   r)   r   r   rd   r:   r   )r*   r   r=   rf   rg   s        r+   test_transfer_custom_trans_typez3TransferPointsTests.test_transfer_custom_trans_type  s     	A --zz}}*(7#&$ . 
 ll88@U9VWLL66v>Q7RS	//?--}=r-   c           	         d}| j                   j                  | j                  j                  | j                  j                  ddt        d      d|      }| j                   j                  |d         }| j                   j                  |d         }| j                  |j                  |       | j                  |j                  |       y)	z'Test transfer with custom initiator ID.c   r   z25.00zAdmin transfer)r1   r2   r3   r4   r!   r"   iidr6   r7   N)	r'   r8   r   r)   r   r   rd   r:   r   )r*   admin_user_idr=   rf   rg   s        r+   test_transfer_with_custom_iidz1TransferPointsTests.test_transfer_with_custom_iid3  s      --zz}}*(7#$ . 
 ll88@U9VWLL66v>Q7RS	-86r-   c           	      p   | j                   j                  | j                  j                  | j                  j                  ddt        d      d      }h d}| j                  t        |j                               |       | j                  d|d          |d    d|d	    }| j                  |d   |       y
)z/Test that transfer returns all expected values.r   r/   zComplete testr0   >   r!   success
to_balancer2   r5   from_balancer1   r4   r3   r7   r6   :r5   r6   r7   N)
r'   r8   r   r)   r   r   r:   setkeysr9   )r*   r=   expected_keysexpected_ids       r+   test_transfer_return_valuesz/TransferPointsTests.test_transfer_return_valuesI  s     --zz}}*(8$# . 

 	V[[]+]; 	c6-01 567q@S9T8UV.<r-   c           	      L   | j                   j                  | j                  j                  dt	        d      d       | j                   j                  | j                  j                  | j                  j                  ddt	        d      d      }| j                  j                  | j                  j                  d      }| j                  j                  | j                  j                  d      }| j                  |t	        d             | j                  |t	        d	             y
)z>Test that transfer respects decimal precision for point types.r   100zInitial pointsr   z25.999zRounding testr0   7426N)
r'   r(   r   r)   r   r8   r   r&   r;   r:   )r*   r=   user1_pointsuser2_pointss       r+   test_transfer_decimal_precisionz3TransferPointsTests.test_transfer_decimal_precisionj  s     	JJMM&5>$	 	 	
 --zz}}+)8$# . 
 yy11$**--Qyy11$**--Qwt}5wt}5r-   N)__name__
__module____qualname____doc__r,   r@   rE   rI   rQ   rT   rY   r\   rh   rs   r~   r   r   r   r    r-   r+   r   r      sV    4
2;:92406(E&BBO<66:B>,7,=B6r-   r   N)r   decimalr   unittest.mockr   r   django.testr   r#   r   wallet_utils.exceptionsr   r	   r
   wallet_utils.signalsr   r   r   modelsr   r   r   r-   r+   <module>r      s7    '  %   & 
 4 : o6( o6r-   