Ë
    S>ie*  ã                   ó¤   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZ  G d„ de«      Z G d	„ d
e«      Z G d„ de«      Z G d„ de«      Zy)z,
Tests for WalletRepository implementation.
é    )ÚDecimal)ÚTestCase)ÚWalletRepository)ÚWalletOperationError)ÚTestUserÚ
TestWalletÚTestWalletCustomFieldc                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)Ú#WalletRepositoryInitializationTestsz*Tests for WalletRepository initialization.c                 óþ   — t        t        ddi¬«      }| j                  |j                  «       t        «       | j                  |j	                  «       t        «       | j                  |j                  «       ddi«       y)z)Test initialization with User model only.Úcredit_balanceé   ©Ú
user_modelÚpoint_typesN)r   r   ÚassertEqualÚget_user_modelÚget_wallet_balance_modelÚget_point_types©ÚselfÚrepos     úK/home/cursorai/projects/django-wallet-utils/tests/test_wallet_repository.pyÚtest_init_with_user_modelz=WalletRepositoryInitializationTests.test_init_with_user_model   sj   € äÜØ)¨1Ð-ô
ˆð
 	×Ñ˜×,Ñ,Ó.´Ô9Ø×Ñ˜×6Ñ6Ó8¼(ÔCØ×Ñ˜×-Ñ-Ó/Ð2BÀAÐ1FÕGó    c                 óÄ   — t        t        t        ddi¬«      }| j                  |j	                  «       t        «       | j                  |j                  «       t        «       y)z/Test initialization with separate wallet model.r   r   ©r   Úwallet_balance_modelr   N)r   r   r   r   r   r   r   s     r   Ú$test_init_with_separate_wallet_modelzHWalletRepositoryInitializationTests.test_init_with_separate_wallet_model   sN   € äÜÜ!+Ø)¨1Ð-ô
ˆð 	×Ñ˜×,Ñ,Ó.´Ô9Ø×Ñ˜×6Ñ6Ó8¼*ÕEr   c                 óv   — t        t        ddiddi¬«      }|j                  d«      }| j                  |d«       y)z3Test initialization with custom field name mapping.Úreward_pointsr   Úpoints)r   r   Úpoint_type_field_mapN)r   r   Úget_point_type_fieldr   )r   r   Ú
field_names      r   Útest_init_with_custom_field_mapzCWalletRepositoryInitializationTests.test_init_with_custom_field_map%   sA   € äÜØ(¨!Ð,Ø"1°8Ð!<ô
ˆð ×.Ñ.¨Ó?ˆ
Ø×Ñ˜ XÕ.r   c                 óä   — t        t        t        ddid¬«      }t        j                  j	                  dt        d«      ¬«      }|j                  dd«      }| j                  |t        d«      «       y)	z3Test initialization with custom user_id field name.r   r   Úowner_id)r   r   r   Úwallet_user_id_fieldé{   ú100.00)r(   r   N)r   r   r	   ÚobjectsÚcreater   Úget_user_balancer   )r   r   ÚwalletÚbalances       r   Ú#test_init_with_custom_user_id_fieldzGWalletRepositoryInitializationTests.test_init_with_custom_user_id_field0   so   € äÜÜ!6Ø)¨1Ð-Ø!+ô	
ˆô '×.Ñ.×5Ñ5ØÜ" 8Ó,ð 6ó 
ˆð
 ×'Ñ'¨Ð-=Ó>ˆØ×Ñ˜¤'¨(Ó"3Õ4r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r&   r1   © r   r   r   r      s   „ Ù4ò	Hò	Fò	/ó5r   r   c                   óF   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)Ú&WalletRepositoryBalanceOperationsTestszTests for balance operations.c                 ó€   — t         j                  j                  dd¬«      | _        t	        t         ddi¬«      | _        y)úSet up test fixtures.Útestuserútest@example.com©ÚusernameÚemailr   r   r   N)r   r,   r-   Úuserr   r   ©r   s    r   ÚsetUpz,WalletRepositoryBalanceOperationsTests.setUpF   s7   € ä×$Ñ$×+Ñ+°ZÐGYÐ+ÓZˆŒ	Ü$ÜØ)¨1Ð-ô
ˆ�	r   c                 óB  — | j                   j                  | j                  j                  dt	        d«      ¬«      }| j                  |t	        d«      «       | j                  j                  «        | j                  | j                  j                  t	        d«      «       y)zTest update_balance for adding.r   r+   ©Úuser_idÚ
point_typeÚamountN©r   Úupdate_balancer@   Úidr   r   Úrefresh_from_dbr   ©r   Únew_balances     r   Útest_update_balance_addz>WalletRepositoryBalanceOperationsTests.test_update_balance_addN   sw   € à—i‘i×.Ñ.Ø—I‘I—L‘LØ'Ü˜8Ó$ð /ó 
ˆð 	×Ñ˜¤g¨hÓ&7Ô8Ø�	‰	×!Ñ!Ô#Ø×Ñ˜Ÿ™×1Ñ1´7¸8Ó3DÕEr   c                 óÐ   — | j                  t        «      5  | j                  j                  | j                  j
                  dt        d«      d¬«       ddd«       y# 1 sw Y   yxY w)z.Test update_balance prevents negative balance.r   ú-100.00F©rE   rF   rG   Úallow_negativeN)ÚassertRaisesÚ
ValueErrorr   rI   r@   rJ   r   rA   s    r   Ú(test_update_balance_negative_not_allowedzOWalletRepositoryBalanceOperationsTests.test_update_balance_negative_not_allowedZ   sL   € à×ÑœzÕ*Ø�I‰I×$Ñ$ØŸ	™	Ÿ™Ø+Ü˜yÓ)Ø$ð	 %ô ÷ +×*Ñ*ús   –=AÁA%c                 óD  — | j                   j                  | j                  j                  dt	        d«      d¬«      }| j                  |t	        d«      «       | j                  j                  «        | j                  | j                  j                  t	        d«      «       y)z,Test update_balance allows negative balance.r   rP   TrQ   NrH   rL   s     r   Ú$test_update_balance_negative_allowedzKWalletRepositoryBalanceOperationsTests.test_update_balance_negative_allowedd   sz   € à—i‘i×.Ñ.Ø—I‘I—L‘LØ'Ü˜9Ó%Øð	 /ó 
ˆð 	×Ñ˜¤g¨iÓ&8Ô9Ø�	‰	×!Ñ!Ô#Ø×Ñ˜Ÿ™×1Ñ1´7¸9Ó3EÕFr   c                 óÒ  — t        d«      | j                  _        | j                  j                  «        | j                  j                  | j                  j                  dt        d«      ¬«      \  }}| j                  |«       | j                  |t        d«      «       | j                  j                  «        | j                  | j                  j                  t        d«      «       y)z:Test atomic deduction succeeds when balance is sufficient.z1000.00r   ú500.00rD   N©
r   r@   r   Úsaver   Údeduct_balance_atomicrJ   Ú
assertTruer   rK   ©r   ÚsuccessrM   s      r   Ú"test_deduct_balance_atomic_successzIWalletRepositoryBalanceOperationsTests.test_deduct_balance_atomic_successq   s©   € ô $+¨9Ó#5ˆ�	‰	Ô Ø�	‰	�‰Ôà#Ÿy™y×>Ñ>Ø—I‘I—L‘LØ'Ü˜8Ó$ð  ?ó  
Ñˆ�ð 	�‰˜Ô Ø×Ñ˜¤g¨hÓ&7Ô8Ø�	‰	×!Ñ!Ô#Ø×Ñ˜Ÿ™×1Ñ1´7¸8Ó3DÕEr   c                 óÒ  — t        d«      | j                  _        | j                  j                  «        | j                  j                  | j                  j                  dt        d«      ¬«      \  }}| j                  |«       | j                  |t        d«      «       | j                  j                  «        | j                  | j                  j                  t        d«      «       y)z9Test atomic deduction fails when balance is insufficient.r+   r   rY   rD   N)
r   r@   r   r[   r   r\   rJ   ÚassertFalser   rK   )r   r_   Úcurrent_balances      r   Ú'test_deduct_balance_atomic_insufficientzNWalletRepositoryBalanceOperationsTests.test_deduct_balance_atomic_insufficient‚   s¬   € ô $+¨8Ó#4ˆ�	‰	Ô Ø�	‰	�‰Ôà#'§9¡9×#BÑ#BØ—I‘I—L‘LØ'Ü˜8Ó$ð $Có $
Ñ ˆ�ð 	×Ñ˜Ô!Ø×Ñ˜¬'°(Ó*;Ô<Ø�	‰	×!Ñ!Ô#Ø×Ñ˜Ÿ™×1Ñ1´7¸8Ó3DÕEr   c                 ó@  — t        d«      | j                  _        | j                  j                  «        | j                  j                  | j                  j                  dt        d«      ¬«      \  }}| j                  |«       | j                  |t        d«      «       y)z)Test atomic deduction with exact balance.rY   r   rD   z0.00N)	r   r@   r   r[   r   r\   rJ   r]   r   r^   s      r   Ú(test_deduct_balance_atomic_exact_balancezOWalletRepositoryBalanceOperationsTests.test_deduct_balance_atomic_exact_balance“   sy   € ô $+¨8Ó#4ˆ�	‰	Ô Ø�	‰	�‰Ôà#Ÿy™y×>Ñ>Ø—I‘I—L‘LØ'Ü˜8Ó$ð  ?ó  
Ñˆ�ð 	�‰˜Ô Ø×Ñ˜¤g¨f£oÕ6r   c                 óÔ  — t        d«      | j                  _        | j                  j                  «        | j                  j                  | j                  j                  dt        d«      d¬«      \  }}| j                  |«       | j                  |t        d«      «       | j                  j                  «        | j                  | j                  j                  t        d«      «       y)z/Test atomic deduction with allow_negative=True.r+   r   rY   TrQ   z-400.00NrZ   r^   s      r   Ú)test_deduct_balance_atomic_allow_negativezPWalletRepositoryBalanceOperationsTests.test_deduct_balance_atomic_allow_negative¢   s¬   € ô $+¨8Ó#4ˆ�	‰	Ô Ø�	‰	�‰Ôà#Ÿy™y×>Ñ>Ø—I‘I—L‘LØ'Ü˜8Ó$Øð	  ?ó  
Ñˆ�ð 	�‰˜Ô Ø×Ñ˜¤g¨iÓ&8Ô9Ø�	‰	×!Ñ!Ô#Ø×Ñ˜Ÿ™×1Ñ1´7¸9Ó3EÕFr   c                 ó  — t        d«      | j                  _        | j                  j                  «        | j                  j                  | j                  j                  d«      }| j                  |t        d«      «       y)zTest get_user_balance.z123.45r   N)r   r@   r   r[   r   r.   rJ   r   ©r   r0   s     r   Útest_get_user_balancez<WalletRepositoryBalanceOperationsTests.test_get_user_balance´   sU   € ä#*¨8Ó#4ˆ�	‰	Ô Ø�	‰	�‰Ôà—)‘)×,Ñ,¨T¯Y©Y¯\©\Ð;KÓLˆØ×Ñ˜¤'¨(Ó"3Õ4r   N)r2   r3   r4   r5   rB   rN   rU   rW   r`   rd   rf   rh   rk   r6   r   r   r8   r8   C   s7   „ Ù'ò
ò
FòòGòFò"Fò"7òGó$5r   r8   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)Ú"WalletRepositorySeparateModelTestsz0Tests for repository with separate wallet model.c                 ó  — t         j                  j                  dd¬«      | _        t        j                  j                  | j                  j
                  t        d«      ¬«      | _        t        t         t        ddi¬«      | _	        y	)
r:   r;   r<   r=   rY   )rE   r   r   r   r   N)
r   r,   r-   r@   r   rJ   r   r/   r   r   rA   s    r   rB   z(WalletRepositorySeparateModelTests.setUpÀ   sl   € ä×$Ñ$×+Ñ+°ZÐGYÐ+ÓZˆŒ	Ü ×(Ñ(×/Ñ/Ø—I‘I—L‘LÜ" 8Ó,ð 0ó 
ˆŒô %ÜÜ!+Ø)¨1Ð-ô
ˆ�	r   c                 óB  — | j                   j                  | j                  j                  dt	        d«      ¬«      }| j                  |t	        d«      «       | j                  j                  «        | j                  | j                  j                  t	        d«      «       y)z/Test update_balance with separate wallet model.r   r+   rD   z600.00N)	r   rI   r@   rJ   r   r   r/   rK   r   rL   s     r   Ú"test_update_balance_separate_modelzEWalletRepositorySeparateModelTests.test_update_balance_separate_modelÍ   sw   € à—i‘i×.Ñ.Ø—I‘I—L‘LØ'Ü˜8Ó$ð /ó 
ˆð 	×Ñ˜¤g¨hÓ&7Ô8Ø�‰×#Ñ#Ô%Ø×Ñ˜Ÿ™×3Ñ3´W¸XÓ5FÕGr   c                 ój  — | j                   j                  | j                  j                  dt	        d«      ¬«      \  }}| j                  |«       | j                  |t	        d«      «       | j                  j                  «        | j                  | j                  j                  t	        d«      «       y)z1Test atomic deduction with separate wallet model.r   z200.00rD   z300.00N)
r   r\   r@   rJ   r   r]   r   r/   rK   r   r^   s      r   Ú)test_deduct_balance_atomic_separate_modelzLWalletRepositorySeparateModelTests.test_deduct_balance_atomic_separate_modelÙ   sˆ   € à#Ÿy™y×>Ñ>Ø—I‘I—L‘LØ'Ü˜8Ó$ð  ?ó  
Ñˆ�ð 	�‰˜Ô Ø×Ñ˜¤g¨hÓ&7Ô8Ø�‰×#Ñ#Ô%Ø×Ñ˜Ÿ™×3Ñ3´W¸XÓ5FÕGr   c                 óš   — | j                   j                  | j                  j                  d«      }| j	                  |t        d«      «       y)z1Test get_user_balance with separate wallet model.r   rY   N)r   r.   r@   rJ   r   r   rj   s     r   Ú$test_get_user_balance_separate_modelzGWalletRepositorySeparateModelTests.test_get_user_balance_separate_modelæ   s6   € à—)‘)×,Ñ,¨T¯Y©Y¯\©\Ð;KÓLˆØ×Ñ˜¤'¨(Ó"3Õ4r   N)r2   r3   r4   r5   rB   rp   rr   rt   r6   r   r   rm   rm   ½   s   „ Ù:ò
ò
HòHó5r   rm   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)Ú&WalletRepositoryTransactionRecordTestsz&Tests for transaction record creation.c                 óP  — t         j                  j                  dd¬«      | _        t	        t         ddi¬«      | _        ddlm} dd	lm}  |d
dd| j                  j                  dt        d«      t        d«      dd|j                  «       j                  «       ddi¬«      | _        y
)r:   r;   r<   r=   r   r   r   r   ©ÚTransactionRecord©ÚdatetimeNéœÿÿÿÚcr+   iè  zTest transactionÚtestÚdata©rJ   ÚwtypeÚiidÚuidÚtyperG   r0   Ú
trans_typeÚdescrÚcdateÚ
extra_data)r   r,   r-   r@   r   r   Úwallet_utils.servicery   r{   rJ   r   ÚnowÚ	isoformatÚrecord)r   ry   r{   s      r   rB   z,WalletRepositoryTransactionRecordTests.setUpï   s’   € ä×$Ñ$×+Ñ+°ZÐGYÐ+ÓZˆŒ	Ü$ÜØ)¨1Ð-ô
ˆŒ	õ 	;Ý%á'ØØ"ØØ—	‘	—‘ØÜ˜8Ó$Ü˜HÓ%ØØ$Ø—,‘,“.×*Ñ*Ó,Ø Ð'ô
ˆ�r   c                 ó   — | j                   j                  | j                  «      }| j                  |t        «       | j                  |d«       ddlm} |j                  j                  |¬«      }| j                  |j                  d«       | j                  |j                  t        d«      «       | j                  |j                  ddi«       y)	z#Test creating a transaction record.r   )ÚWalletTransaction)rJ   r   r+   r~   r   N)r   Úcreate_transaction_recordrŒ   ÚassertIsInstanceÚintÚassertGreaterÚwallet_utils.modelsrŽ   r,   Úgetr   r�   rG   r   rˆ   )r   Útransaction_idrŽ   Útxns       r   Útest_create_transaction_recordzEWalletRepositoryTransactionRecordTests.test_create_transaction_record  sŸ   € àŸ™×<Ñ<¸T¿[¹[ÓIˆà×Ñ˜n¬cÔ2Ø×Ñ˜>¨1Ô-õ 	:Ø×'Ñ'×+Ñ+¨~Ð+Ó>ˆØ×Ñ˜Ÿ™Ð$4Ô5Ø×Ñ˜Ÿ™¤W¨XÓ%6Ô7Ø×Ñ˜Ÿ™¨&°&Ð)9Õ:r   c                 ó  — ddl m } ddlm}  |ddd| j                  j                  dt        d«      t        d«      dd	|j                  «       i ¬
«      }| j                  j                  |«      }| j                  |t        «       y)z6Test creating transaction record with datetime object.r   rz   rx   Nr   r|   r}   z50.00ÚTestr€   )r{   r‰   ry   r@   rJ   r   rŠ   r   r�   r�   r‘   )r   r{   ry   rŒ   r•   s        r   Ú,test_create_transaction_record_with_datetimezSWalletRepositoryTransactionRecordTests.test_create_transaction_record_with_datetime  sq   € å%Ý:á"ØØ"ØØ—	‘	—‘ØÜ˜7Ó#Ü˜GÓ$ØØØ—,‘,“.Øô
ˆð Ÿ™×<Ñ<¸VÓDˆØ×Ñ˜n¬cÕ2r   N)r2   r3   r4   r5   rB   r—   rš   r6   r   r   rv   rv   ì   s   „ Ù0ò
ò0;ó3r   rv   N)r5   Údecimalr   Údjango.testr   Úwallet_utilsr   Úwallet_utils.exceptionsr   Útests.modelsr   r   r	   r   r8   rm   rv   r6   r   r   Ú<module>r       sS   ðñõ Ý  å )Ý 8ß DÑ Dô45¨(ô 45ônw5¨Xô w5ôt,5¨ô ,5ô^=3¨Xõ =3r   