ó
    ^v(jí   ã                   ó>  • S r SSKrSSKJs  Jr  SSKrSSKJ	r	  SSK
JrJr  SSKrSSKJr  SSKJr  SSKJrJrJrJrJr  SSKJr  \R4                  " S	S
9S\R6                  S\	4S j5       r " S S5      r " S S5      r " S S5      r " S S5      r  " S S5      r!g)z(Tests for database connection utilities.é    N)ÚPath)Ú	MagicMockÚpatch)ÚEngine)ÚSession)Úget_database_urlÚ
get_engineÚget_sessionÚget_session_factoryÚinit_db)Úget_settingsT)ÚautouseÚmonkeypatchÚtmp_pathc              #   óŠ   #   • U R                  U5        [        R                  " 5         S v •  [        R                  " 5         g 7f)N)Úchdirr   Úcache_clear)r   r   s     Ú2/home/mande/repo/quber/tests/db/test_connection.pyÚisolate_settingsr      s0   é € ð
 ×Ñ�hÔÜ×ÒÔÛ	Ü×ÒÕùs   ‚AAc                   ó*   • \ rS rSrSrS rS rS rSrg)ÚTestGetDatabaseUrlé    z$Tests for get_database_url function.c                 óü  • [         R                  " [        R                  0 SS9   [	        5       nSo!U:H  o3(       d¥  [
        R                  " SU4SX45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=p2S
S
S
5        g
! , (       d  f       g
= f)z5Test database URL with default environment variables.T©Úclearz=postgresql+psycopg://quber:quber_dev@localhost:5432/quber_rag©ú==©z%(py0)s == %(py3)sÚurl©Úpy0Úpy3úassert %(py5)sÚpy5N©r   ÚdictÚosÚenvironr   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Úselfr   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6s         r   Útest_default_valuesÚ&TestGetDatabaseUrl.test_default_values#   s‡   € ä�ZŠZœŸ
™
 B¨dÓ3Ü"Ó$ˆCàYÐYÐYÑY×Y×Y×YÒY�3×Y×Y×Y×Y×YÕY�3×Y×Y×YÑY�3×Y×YÕYÐY×Y×Y×Y×Y×Y×YÑY÷ 4×3Ö3ús   ¥B?C-Ã-
C;c                 ó  • SSSSSS.n[         R                  " [        R                  USS9   [	        5       nS	o2U:H  oD(       d¥  [
        R                  " S
U4SX#45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=pCSSS5        g! , (       d  f       g= f)z4Test database URL with custom environment variables.Úcustom_userÚcustom_passzdb.example.comÚ5433Ú	custom_db)ÚPOSTGRES_USERÚPOSTGRES_PASSWORDÚPOSTGRES_HOSTÚPOSTGRES_PORTÚPOSTGRES_DBTr   zJpostgresql+psycopg://custom_user:custom_pass@db.example.com:5433/custom_dbr   r   r   r    r#   r$   Nr%   ©r1   Úenv_varsr   r2   r3   r4   r5   s          r   Útest_custom_valuesÚ%TestGetDatabaseUrl.test_custom_values*   s¡   € ð +Ø!.Ø-Ø#Ø&ñ
ˆô �ZŠZœŸ
™
 H°DÓ9Ü"Ó$ˆCàfÐfÐfÑf×f×f×fÒf�3×f×f×f×f×fÕf�3×f×f×fÑf�3×f×fÕfÐf×f×f×f×f×f×fÑf÷ :×9Ö9ús   ­B?C5Ã5
Dc                 ó  • SSS.n[         R                  " [        R                  USS9   [	        5       nSo2U:H  oD(       d¥  [
        R                  " SU4SX#45      S	[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS	[
        R                  " U5      S
.-  nSSU0-  n[        [
        R                  " U5      5      eS=pCSSS5        g! , (       d  f       g= f)z9Test database URL with some custom environment variables.ÚtestuserÚtesthost)r=   r?   Tr   z?postgresql+psycopg://testuser:quber_dev@testhost:5432/quber_ragr   r   r   r    r#   r$   Nr%   rB   s          r   Útest_partial_custom_valuesÚ-TestGetDatabaseUrl.test_partial_custom_values9   s›   € ð (Ø'ñ
ˆô
 �ZŠZœŸ
™
 H°DÓ9Ü"Ó$ˆCð \Ð[Ð[Ñ[×[×[×[Ò[�3×[×[×[×[×[Õ[�3×[×[×[Ñ[�3×[×[Õ[Ð[×[×[×[×[×[×[Ñ[÷	 :×9Ö9ús   ªB?C2Ã2
D © N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r6   rD   rI   Ú__static_attributes__rK   ó    r   r   r       s   † Ù.òZògõ\rR   r   c                   ó|   • \ rS rSrSr\" S5      \" S5      S 5       5       r\" S5      \" S5      S 5       5       rSrg)	ÚTestGetEngineéG   zTests for get_engine function.z!quber.db.connection.create_enginez$quber.db.connection.get_database_urlc                 óš  • SUl         [        5       nSUR                  l        SUR                  l        X2l         [        5       nUR                  5         UR                  SSSS9  XC:H  oU(       dÛ  [        R                  " SU4SXC45      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
S.-  nSSU0-  n[        [        R                  " U5      5      eSng)z+Test creating engine with default settings.úpostgresql+psycopg://testÚtest_dbÚ	localhostFT©ÚechoÚpool_pre_pingr   ©z%(py0)s == %(py2)sÚengineÚmock_engine©r!   Úpy2úassert %(py4)sÚpy4N)Úreturn_valuer   r   ÚdatabaseÚhostr	   Úassert_called_onceÚassert_called_once_withr)   r*   r+   r,   r-   r.   r/   r0   )r1   Úmock_get_urlÚmock_create_enginer_   r^   r3   Ú@py_format3Ú@py_format5s           r   Útest_get_engine_defaultÚ%TestGetEngine.test_get_engine_defaultJ   sÎ   € ð %@ˆÔ!Ü“kˆØ#,ˆ�‰Ô Ø*ˆ�‰ÔØ*5Ô'ä“ˆà×'Ñ'Ô)Ø×2Ñ2Ø'¨eÀ4ð 	3ñ 	
ð Ñ$×$×$×$Ò$ˆv×$×$×$×$×$Õ$ˆv×$×$×$Ñ$ˆv×$×$×$×$×$Ö$˜×$×$×$Ñ$˜×$×$×$×$×$×$Ó$rR   c                 óª   • SUl         [        5       nSUR                  l        SUR                  l        X2l         [        SS9  UR                  SSSS9  g)z$Test creating engine with echo=True.rW   rX   rY   T)r[   rZ   N)rd   r   r   re   rf   r	   rh   )r1   ri   rj   r_   s       r   Útest_get_engine_with_echoÚ'TestGetEngine.test_get_engine_with_echo\   sR   € ð %@ˆÔ!Ü“kˆØ#,ˆ�‰Ô Ø*ˆ�‰ÔØ*5Ô'ä˜Òà×2Ñ2Ð3NÐUYÐimÐ2ÒnrR   rK   N)	rL   rM   rN   rO   rP   r   rm   rp   rQ   rK   rR   r   rT   rT   G   sU   † Ù(á
Ð.Ó/Ù
Ð1Ó2ñ%ó 3ó 0ð%ñ  Ð.Ó/Ù
Ð1Ó2ñ
oó 3ó 0ó
orR   rT   c                   ó‚   • \ rS rSrSr\" S5      \" S5      S 5       5       r\" S5      S 5       r\" S5      S 5       rSr	g	)
Ú
TestInitDbék   zTests for init_db function.zquber.db.connection.Baseúquber.db.connection.get_enginec                 óè   • [        [        S9nX1l        [        5       nXBl        [	        5         UR                  5         UR                  R                  U5        UR                  R                  5         g)z5Test init_db creates a new engine when none provided.©ÚspecN)
r   r   rd   Úmetadatar   rg   Ú
create_allrh   Údrop_allÚassert_not_called)r1   Úmock_get_engineÚ	mock_baser_   Úmock_metadatas        r   Útest_init_db_without_engineÚ&TestInitDb.test_init_db_without_enginen   sX   € ô  ¤VÑ,ˆØ'2Ô$Ü!›ˆØ*ÔäŒ	à×*Ñ*Ô,Ø× Ñ ×8Ñ8¸ÔEØ×Ñ×0Ñ0Õ2rR   c                 ó†   • [        [        S9n[        5       nX1l        [        US9  UR                  R                  U5        g)z"Test init_db uses provided engine.rw   ©r^   N)r   r   ry   r   rz   rh   ©r1   r~   r_   r   s       r   Útest_init_db_with_engineÚ#TestInitDb.test_init_db_with_engine}   s7   € ô  ¤VÑ,ˆÜ!›ˆØ*Ôä�{Ò#à× Ñ ×8Ñ8¸ÕErR   c                 ó¾   • [        [        S9n[        5       nX1l        [        USS9  UR                  R                  U5        UR                  R                  U5        g)z-Test init_db drops tables when drop_all=True.rw   T)r^   r{   N)r   r   ry   r   r{   rh   rz   r„   s       r   Útest_init_db_with_drop_allÚ%TestInitDb.test_init_db_with_drop_allˆ   sM   € ô  ¤VÑ,ˆÜ!›ˆØ*Ôä�{¨TÒ2à×Ñ×6Ñ6°{ÔCØ× Ñ ×8Ñ8¸ÕErR   rK   N)
rL   rM   rN   rO   rP   r   r€   r…   rˆ   rQ   rK   rR   r   rs   rs   k   sc   † Ù%á
Ð%Ó&Ù
Ð+Ó,ñ3ó -ó 'ð3ñ Ð%Ó&ñFó 'ðFñ Ð%Ó&ñ	Fó 'ó	FrR   rs   c                   óf   • \ rS rSrSr\" S5      \" S5      S 5       5       r\" S5      S 5       rSrg)	ÚTestGetSessionFactoryé•   z'Tests for get_session_factory function.ú quber.db.connection.sessionmakerru   c                 ól  • [        [        S9nX1l        [        5       nXBl        [        5       nUR	                  5         UR                  USS9  XT:H  of(       dÛ  [        R                  " SU4SXT45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nS	S
U0-  n[        [        R                  " U5      5      eSng)z-Test creating session factory without engine.rw   F©ÚbindÚexpire_on_commitr   r]   ÚfactoryÚmock_factoryr`   rb   rc   N)r   r   rd   r   rg   rh   r)   r*   r+   r,   r-   r.   r/   r0   )	r1   r}   Úmock_sessionmakerr_   r“   r’   r3   rk   rl   s	            r   Ú'test_get_session_factory_without_engineÚ=TestGetSessionFactory.test_get_session_factory_without_engine˜   s¶   € ô  ¤VÑ,ˆØ'2Ô$Ü “{ˆØ)5Ô&ä%Ó'ˆà×*Ñ*Ô,Ø×1Ñ1°{ÐUZÐ1Ñ[ØÑ&×&×&×&Ò&ˆw×&×&×&×&×&Õ&ˆw×&×&×&Ñ&ˆw×&×&×&×&×&Ö&˜,×&×&×&Ñ&˜,×&×&×&×&×&×&Ó&rR   c                 ó>  • [        [        S9n[        5       nX1l        [        US9nUR	                  USS9  XC:H  oU(       dÛ  [
        R                  " SU4SXC45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS	.-  nS
SU0-  n[        [
        R                  " U5      5      eSng)z3Test creating session factory with provided engine.rw   rƒ   Fr�   r   r]   r’   r“   r`   rb   rc   N)r   r   rd   r   rh   r)   r*   r+   r,   r-   r.   r/   r0   )r1   r”   r_   r“   r’   r3   rk   rl   s           r   Ú$test_get_session_factory_with_engineÚ:TestGetSessionFactory.test_get_session_factory_with_engine§   s¦   € ô  ¤VÑ,ˆÜ “{ˆØ)5Ô&ä%¨[Ñ9ˆà×1Ñ1°{ÐUZÐ1Ñ[ØÑ&×&×&×&Ò&ˆw×&×&×&×&×&Õ&ˆw×&×&×&Ñ&ˆw×&×&×&×&×&Ö&˜,×&×&×&Ñ&˜,×&×&×&×&×&×&Ó&rR   rK   N)	rL   rM   rN   rO   rP   r   r•   r˜   rQ   rK   rR   r   r‹   r‹   •   sE   † Ù1á
Ð-Ó.Ù
Ð+Ó,ñ'ó -ó /ð'ñ Ð-Ó.ñ	'ó /ó	'rR   r‹   c                   ó˜   • \ rS rSrSr\" S5      \" S5      S 5       5       r\" S5      \" S5      S 5       5       r\" S5      S 5       rSr	g	)
ÚTestGetSessioné´   z&Tests for get_session context manager.r�   ru   c                 ó  • [        [        S9nX1l        [        [        S9n[        US9nXRl        [	        5        nXd:H  ow(       dÛ  [
        R                  " SU4SXd45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n	[        [
        R                  " U	5      5      eS
nS
S
S
5        UR                  R                  5         UR                  R                  5         UR                   R#                  5         g
! , (       d  f       N]= f)z6Test get_session context manager successful execution.rw   ©rd   r   r]   ÚsessionÚmock_sessionr`   rb   rc   N)r   r   rd   r   r
   r)   r*   r+   r,   r-   r.   r/   r0   Úcommitrg   ÚcloseÚrollbackr|   )
r1   r}   r”   r_   r    r“   rŸ   r3   rk   rl   s
             r   Útest_get_session_successÚ'TestGetSession.test_get_session_success·   sç   € ô  ¤VÑ,ˆØ'2Ô$ä ¤gÑ.ˆÜ ¨lÑ;ˆØ)5Ô&äŒ]˜gØÑ*×*×*×*Ò*�7×*×*×*×*×*Õ*�7×*×*×*Ñ*�7×*×*×*×*×*Ö*˜l×*×*×*Ñ*˜l×*×*×*×*×*×*Ò*÷ ð 	×Ñ×.Ñ.Ô0Ø×Ñ×-Ñ-Ô/Ø×Ñ×/Ñ/Õ1÷ �]ús   ºC(E9Å9
Fc                 ó¸  • [        [        S9nX1l        [        [        S9n[        US9nXRl        [        R
                  " [        5         [        5          [        S5      e! , (       d  f       O= f SSS5        O! , (       d  f       O= fUR                  R                  5         UR                  R                  5         UR                  R                  5         g)z0Test get_session context manager with exception.rw   rž   z
Test errorN)r   r   rd   r   ÚpytestÚraisesÚ
ValueErrorr
   r£   rg   r¢   r¡   r|   )r1   r}   r”   r_   r    r“   s         r   Útest_get_session_with_exceptionÚ.TestGetSession.test_get_session_with_exceptionÉ   s˜   € ô  ¤VÑ,ˆØ'2Ô$ä ¤gÑ.ˆÜ ¨lÑ;ˆØ)5Ô&ä�]Š]œ:Õ&Ü•Ü  Ó.Ð.÷ •ú�÷ '×&Ö&úð 	×Ñ×0Ñ0Ô2Ø×Ñ×-Ñ-Ô/Ø×Ñ×-Ñ-Õ/s   Á
A<ÁA!Á!
A/	Á+A<Á<
B
c                 óŠ  • [        [        S9n[        [        S9n[        US9nXAl        [	        US9 nXS:H  of(       dÛ  [
        R                  " SU4SXS45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nS	S
U0-  n[        [
        R                  " U5      5      eSnSSS5        UR                  USS9  g! , (       d  f       N= f)z&Test get_session with provided engine.rw   rž   rƒ   r   r]   rŸ   r    r`   rb   rc   NFr�   )r   r   r   rd   r
   r)   r*   r+   r,   r-   r.   r/   r0   rh   )	r1   r”   r_   r    r“   rŸ   r3   rk   rl   s	            r   Ú%test_get_session_with_provided_engineÚ4TestGetSession.test_get_session_with_provided_engineÜ   sÃ   € ô  ¤VÑ,ˆÜ ¤gÑ.ˆÜ ¨lÑ;ˆØ)5Ô&ä Ò,°ØÑ*×*×*×*Ò*�7×*×*×*×*×*Õ*�7×*×*×*Ñ*�7×*×*×*×*×*Ö*˜l×*×*×*Ñ*˜l×*×*×*×*×*×*Ò*÷ -ð 	×1Ñ1°{ÐUZÐ1Ò[÷ -Õ,ús   ³C(D4Ä4
ErK   N)
rL   rM   rN   rO   rP   r   r¤   rª   r­   rQ   rK   rR   r   r›   r›   ´   so   † Ù0á
Ð-Ó.Ù
Ð+Ó,ñ2ó -ó /ð2ñ  Ð-Ó.Ù
Ð+Ó,ñ0ó -ó /ð0ñ" Ð-Ó.ñ
\ó /ó
\rR   r›   )"rP   Úbuiltinsr+   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter)   r'   Úpathlibr   Úunittest.mockr   r   r§   Úsqlalchemy.enginer   Úsqlalchemy.ormr   Úquber.db.connectionr   r	   r
   r   r   Úquber.settingsr   ÚfixtureÚMonkeyPatchr   r   rT   rs   r‹   r›   rK   rR   r   Ú<module>r»      s›   ðÙ .ç  „ ƒ	Ý ß *ã Ý $Ý "÷õ õ (ð ‡‚˜Ñð &×"4Ñ"4ð Àó ó ð÷$\ñ $\÷N!oñ !o÷H'Fñ 'F÷T'ñ '÷>3\ò 3\rR   