Ë
    whBj”   ã                  óì   — d Z ddlmZ ddlZddlmc mZ ddl	m
Z
mZ ddlZddlmZmZmZmZ ddlmZ ddlmZ dd„Zddd	„Z G d
„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Zy)zHTests for token exhaustion guard: balance check, soft stop, auto-resume.é    )ÚannotationsN)Ú	MagicMockÚpatch)ÚAirminalClientÚBalanceResultÚChargeResultÚInsufficientTokensError)ÚBillingLedger)ÚSettingsc           	     óÐ   — t        d!i dd“dd“dt        | dz  «      “dd“d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “Ž}|j                  |«       t        d!i |¤ŽS )"NÚdgred_api_keyÚtestÚdry_runTÚdb_pathútest.dbÚairminal_billing_keyÚfake_keyÚairminal_billing_urlzhttps://mock.airminal.com/apiÚbilling_modeÚliveÚtokens_per_scanç333333Ó?Útokens_per_lead_67g       @Útokens_per_lead_68gš™™™™™é?Útokens_per_lead_69ç        Úbilling_max_tokens_per_cycleg      i@Úsendgrid_api_keyÚ Únotify_email_toÚnotify_email_fromztest@test.comÚ
fb_cookiesÚfb_proxy_urlÚwarmup_untilÚmax_daily_scansé   © )ÚdictÚstrÚupdater   )Útmp_pathÚ	overridesÚdefaultss      ú>/var/www/html/agent.samochodowy/tests/test_token_exhaustion.pyÚ	_settingsr/      sâ   € Üò Ùðáðô �H˜yÑ(Ô)ðñ (ð	ñ
 =ðñ ðñ ðñ ðñ ðñ ðñ &+ðñ ðñ ðñ *ðñ ðñ  ð!ñ" ð#ñ$ ð%€Hð( ‡O�O�IÔÜÑ�hÑÐó    c                ó†  — ddl }t        | dz  «      }|j                  |«      }|j                  d«       |j	                  «        |j                  «        t        | fd|i|¤Ž}t        |d¬«      }t        «       }t        d|d	¬
«      |j                  _        t        dd|dz
  d¬«      |j                  _        ||_        ||fS )zICreate a ledger with a mocked AirminalClient returning the given balance.r   Nr   zª
        CREATE TABLE IF NOT EXISTS account_guard (
            key TEXT PRIMARY KEY,
            value TEXT NOT NULL,
            updated_at TEXT NOT NULL
        )
    r   é   ©Úcycle_idTr   ©ÚsuccessÚbalanceÚlockedr   r   )r6   ÚchargedÚbalance_afterÚerror)Úsqlite3r)   ÚconnectÚexecuteÚcommitÚcloser/   r
   r   r   Úcheck_balanceÚreturn_valuer   ÚchargeÚ_client)	r+   r7   r,   r<   r   ÚconnÚsÚledgerÚmock_clients	            r.   Ú_ledger_with_mock_clientrI   ,   sÀ   € ó Ü�(˜YÑ&Ó'€GØ�?‰?˜7Ó#€DØ‡L�Lð ô 	ð 	‡K�K„MØ‡J�J„Lä�(Ñ9 GÐ9¨yÑ9€AÜ˜1 qÔ)€Fä“+€KÜ-:Ø˜g¨cô.€K×ÑÔ*ô '3Ø˜c°¸3±Àbô'€K×ÑÔ#ð !€F„NØ�;ÐÐr0   c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚTestBalancePreFlightc                ó  — t        |d¬«      \  }}|j                  }d} ||¬«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  «        y )Nç      Y@©r7   r   ©Ú
min_tokensT©Úis©zi%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.check_balance_sufficient
}(min_tokens=%(py4)s)
} is %(py9)srG   ©Úpy0Úpy2Úpy4Úpy6Úpy9úassert %(py11)sÚpy11F©zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_tokens_exhausted
}()
} is %(py7)s©rU   rV   rW   Úpy7úassert %(py9)srY   ©rI   Úcheck_balance_sufficientÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚis_tokens_exhaustedr@   ©Úselfr+   rG   Ú_Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12Ú@py_assert6Ú@py_format8s                r.   Ú$test_sufficient_balance_returns_truez9TestBalancePreFlight.test_sufficient_balance_returns_trueO   s;  € Ü,¨X¸uÔE‰	ˆ�Ø×.Ñ.ÐF¸#ÐFÑ.¸#Ô>ÐFÀ$ÐFÐ>À$ÐF×F×FÕFÐ>À$×F×F×F×F×FÑFˆv×F×FÓFˆv×F×FÔFÐ.×F×FÒF¸#×F×FÒFÐ>×F×FÒFÀ$×F×F×F×F×F×F×FØ×)Ñ)Ð4Ñ)Ó+Ð4¨uÐ4Ð+¨uÐ4×4×4Õ4Ð+¨u×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð)×4×4Ò4Ð+×4×4Ò4¨u×4×4×4×4×4×4Õ4Ø�‰�r0   c                ó  — t        |d¬«      \  }}|j                  }d} ||¬«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  «        y )Nr   rN   r   rO   FrQ   rS   rG   rT   rZ   r[   Tr\   r]   r_   rY   r`   rk   s                r.   Útest_zero_balance_returns_falsez4TestBalancePreFlight.test_zero_balance_returns_falseU   ó;  € Ü,¨X¸sÔC‰	ˆ�Ø×.Ñ.ÐG¸#ÐGÑ.¸#Ô>ÐGÀ%ÐGÐ>À%ÐG×G×GÕGÐ>À%×G×G×G×G×GÑGˆv×G×GÓGˆv×G×GÔGÐ.×G×GÒG¸#×G×GÒGÐ>×G×GÒGÀ%×G×G×G×G×G×G×GØ×)Ñ)Ð3Ñ)Ó+Ð3¨tÐ3Ð+¨tÐ3×3×3Õ3Ð+¨t×3×3×3×3×3Ñ3ˆv×3×3Ó3ˆv×3×3Ô3Ð)×3×3Ò3Ð+×3×3Ò3¨t×3×3×3×3×3×3Õ3Ø�‰�r0   c                ó  — t        |d¬«      \  }}|j                  }d} ||¬«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  «        y )Ngš™™™™™É?rN   r   rO   FrQ   rS   rG   rT   rZ   r[   Tr\   r]   r_   rY   r`   rk   s                r.   Ú"test_below_threshold_returns_falsez7TestBalancePreFlight.test_below_threshold_returns_false[   rz   r0   c                ó<  — t        |«      \  }}t        d«      |j                  _        |j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d	x}x}x}}|j                  «        y	)
z=If balance check API fails, proceed cautiously (don't block).ÚtimeoutTrQ   ©zW%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.check_balance_sufficient
}()
} is %(py7)srG   r]   r_   rY   N)rI   ÚRuntimeErrorrA   Úside_effectra   rb   rc   rd   re   rf   rg   rh   ri   r@   )
rl   r+   rG   rH   rn   ro   ru   rp   rv   rs   s
             r.   Útest_api_error_fails_openz.TestBalancePreFlight.test_api_error_fails_opena   s´   € ä6°xÓ@Ñˆ�Ü0<¸YÓ0Gˆ×!Ñ!Ô-Ø×.Ñ.Ð8Ñ.Ó0Ð8°DÐ8Ð0°DÐ8×8×8Õ8Ð0°D×8×8×8×8×8Ñ8ˆv×8×8Ó8ˆv×8×8Ô8Ð.×8×8Ò8Ð0×8×8Ò8°D×8×8×8×8×8×8Õ8Ø�‰�r0   N)Ú__name__Ú
__module__Ú__qualname__rw   ry   r|   r‚   r'   r0   r.   rK   rK   N   s   „ òòòór0   rK   c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestAutoResumec                ó  — t        |d¬«      \  }}|j                  }d} ||¬«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}t        ddd¬«      |j                  _        |j                  }d} ||¬«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  «        y )Nr   rN   r   rO   FrQ   rS   rG   rT   rZ   r[   Tr\   r]   r_   rY   ç      I@r5   )rI   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r   rA   rB   r@   )rl   r+   rG   rH   rn   ro   rp   rq   rr   rs   rt   ru   rv   s                r.   Ú!test_restored_balance_clears_flagz0TestAutoResume.test_restored_balance_clears_flagn   s|  € Ü6°xÈÔMÑˆ�ð ×.Ñ.ÐG¸#ÐGÑ.¸#Ô>ÐGÀ%ÐGÐ>À%ÐG×G×GÕGÐ>À%×G×G×G×G×GÑGˆv×G×GÓGˆv×G×GÔGÐ.×G×GÒG¸#×G×GÒGÐ>×G×GÒGÀ%×G×G×G×G×G×G×GØ×)Ñ)Ð3Ñ)Ó+Ð3¨tÐ3Ð+¨tÐ3×3×3Õ3Ð+¨t×3×3×3×3×3Ñ3ˆv×3×3Ó3ˆv×3×3Ô3Ð)×3×3Ò3Ð+×3×3Ò3¨t×3×3×3×3×3×3Õ3ô 2?Ø $¨sô2
ˆ×!Ñ!Ô.ð
 ×.Ñ.ÐF¸#ÐFÑ.¸#Ô>ÐFÀ$ÐFÐ>À$ÐF×F×FÕFÐ>À$×F×F×F×F×FÑFˆv×F×FÓFˆv×F×FÔFÐ.×F×FÒF¸#×F×FÒFÐ>×F×FÒFÀ$×F×F×F×F×F×F×FØ×)Ñ)Ð4Ñ)Ó+Ð4¨uÐ4Ð+¨uÐ4×4×4Õ4Ð+¨u×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð)×4×4Ò4Ð+×4×4Ò4¨u×4×4×4×4×4×4Õ4Ø�‰�r0   c                ó¦  — dd l }t        |dz  «      }|j                  |«      }|j                  d«       |j	                  «        |j                  «        t        |d¬«      \  }}|j                  d¬«       |j                  } |«       }d}	||	u }
|
sÁt        j                  d	|
fd
||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}
}	|j                  «        t#        ||¬«      }t%        |d¬«      }t'        «       }t)        ddd¬«      |j*                  _        ||_        |j                  } |«       }d}	||	u }
|
sÁt        j                  d	|
fd
||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}
}	|j                  }d} ||¬«      }
d}|
|u }|sÕt        j                  d	|fd|
|f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}
x}}|j                  «        t%        |d¬«      }t'        «       }t)        ddd¬«      |j*                  _        ||_        |j                  }d} ||¬«      }
d}|
|u }|sÕt        j                  d	|fd|
|f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}
x}}|j                  } |«       }d}	||	u }
|
sÁt        j                  d	|
fd
||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}
}	|j                  «        y )Nr   r   zÂ
            CREATE TABLE IF NOT EXISTS account_guard (
                key TEXT PRIMARY KEY,
                value TEXT NOT NULL,
                updated_at TEXT NOT NULL
            )
        r   rN   r   rO   TrQ   r\   Úl1r]   r_   rY   )r   é   r3   çš™™™™™¹?r5   Úl2FrS   rT   rZ   r[   é   rM   Úl3)r<   r)   r=   r>   r?   r@   rI   ra   rj   rb   rc   rd   re   rf   rg   rh   ri   r/   r
   r   r   rA   rB   rD   )rl   r+   r<   r   rE   rŒ   rm   rn   ro   ru   rp   rv   rs   rF   r�   Úmock2rq   rr   rt   r‘   Úmock3s                        r.   Ú#test_flag_persists_across_instancesz2TestAutoResume.test_flag_persists_across_instances   sÊ  € ÛÜ�h Ñ*Ó+ˆð �‰˜wÓ'ˆØ�‰ð ô 	ð 	�‰ŒØ�
‰
Œô )¨¸3Ô?‰ˆˆAØ
×#Ñ#¨sÐ#Ô3Ø×%Ñ%Ð/Ñ%Ó'Ð/¨4Ð/Ð'¨4Ð/×/×/Õ/Ð'¨4×/×/×/×/×/Ñ/ˆr×/×/Ó/ˆr×/×/Ô/Ð%×/×/Ò/Ð'×/×/Ò/¨4×/×/×/×/×/×/Õ/Ø
�‰Œ
ô �h¨Ô0ˆÜ˜1 qÔ)ˆÜ“ˆÜ+8Ø #¨cô,
ˆ×ÑÔ(ð ˆŒ
Ø×%Ñ%Ð/Ñ%Ó'Ð/¨4Ð/Ð'¨4Ð/×/×/Õ/Ð'¨4×/×/×/×/×/Ñ/ˆr×/×/Ó/ˆr×/×/Ô/Ð%×/×/Ò/Ð'×/×/Ò/¨4×/×/×/×/×/×/Õ/Ø×*Ñ*ÐC°cÐCÑ*°cÔ:ÐC¸eÐCÐ:¸eÐC×C×CÕCÐ:¸e×C×C×C×C×CÑCˆr×C×CÓCˆr×C×CÔCÐ*×C×CÒC°c×C×CÒCÐ:×C×CÒC¸e×C×C×C×C×C×C×CØ
�‰Œ
ô ˜1 qÔ)ˆÜ“ˆÜ+8Ø %°ô,
ˆ×ÑÔ(ð ˆŒ
Ø×*Ñ*ÐB°cÐBÑ*°cÔ:ÐB¸dÐBÐ:¸dÐB×B×BÕBÐ:¸d×B×B×B×B×BÑBˆr×B×BÓBˆr×B×BÔBÐ*×B×BÒB°c×B×BÒBÐ:×B×BÒB¸d×B×B×B×B×B×B×BØ×%Ñ%Ð0Ñ%Ó'Ð0¨5Ð0Ð'¨5Ð0×0×0Õ0Ð'¨5×0×0×0×0×0Ñ0ˆr×0×0Ó0ˆr×0×0Ô0Ð%×0×0Ò0Ð'×0×0Ò0¨5×0×0×0×0×0×0Õ0Ø
�‰�
r0   N)rƒ   r„   r…   rŠ   r”   r'   r0   r.   r‡   r‡   m   s   „ òó"+r0   r‡   c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestMidCycleExhaustionc                ó<  — t        |d¬«      \  }}t        d«      |j                  _        |j	                  dd«      }d}||u }|s™t        j                  d|fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}}|j                  }d}	||	u }
|
s­t        j                  d|
fd||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
}	|j                  } |«       }
d}|
|u }|sÁt        j                  d|fd|
|f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
x}}|j                  «        y )NrM   rN   zno fundsÚg1úGroup 1FrQ   ©z%(py0)s is %(py3)sÚresult©rU   Úpy3úassert %(py5)sÚpy5T)z.%(py2)s
{%(py2)s = %(py0)s.halted
} is %(py5)srG   )rU   rV   rŸ   zassert %(py7)sr^   r\   r]   r_   rY   )rI   r	   rC   r�   Úcharge_scanrb   rc   rd   re   rf   rg   rh   ri   Úhaltedrj   r@   )rl   r+   rG   rH   r›   Ú@py_assert2rn   Ú@py_format4Ú@py_format6Ú@py_assert4ro   rv   ru   rp   rs   s                  r.   Ú,test_insufficient_tokens_sets_flag_and_haltszCTestMidCycleExhaustion.test_insufficient_tokens_sets_flag_and_halts²   s�  € Ü6°xÈÔOÑˆ�Ü)@ÀÓ)Lˆ×ÑÔ&à×#Ñ# D¨)Ó4ˆØÐˆv˜ˆ××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ�}‰}Ð$ Ð$ˆ} Ð$×$×$Õ$ˆ} ×$×$×$×$×$Ñ$ˆv×$×$Ó$ˆv×$×$Ô$ˆ}×$×$Ò$ ×$×$×$×$×$×$Ó$Ø×)Ñ)Ð3Ñ)Ó+Ð3¨tÐ3Ð+¨tÐ3×3×3Õ3Ð+¨t×3×3×3×3×3Ñ3ˆv×3×3Ó3ˆv×3×3Ô3Ð)×3×3Ò3Ð+×3×3Ò3¨t×3×3×3×3×3×3Õ3Ø�‰�r0   c                óz  — t        |d¬«      \  }}|j                  dd«      }d}||u }|s™t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}}|j                  } |«       }	d}
|	|
u }|sÁt        j                  d|fd|	|
f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}	x}}
|j                  «        y )NrM   rN   r˜   r™   TrQ   rš   r›   rœ   rž   rŸ   Fr\   rG   r]   r_   rY   )rI   r    rb   rc   rd   re   rf   rg   rh   ri   rj   r@   )rl   r+   rG   rm   r›   r¢   rn   r£   r¤   ro   ru   rp   rv   rs   s                 r.   Ú(test_successful_charge_does_not_set_flagz?TestMidCycleExhaustion.test_successful_charge_does_not_set_flag¼   s  € Ü,¨X¸uÔE‰	ˆ�Ø×#Ñ# D¨)Ó4ˆØÐˆv˜ˆ~××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ×)Ñ)Ð4Ñ)Ó+Ð4¨uÐ4Ð+¨uÐ4×4×4Õ4Ð+¨u×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð)×4×4Ò4Ð+×4×4Ò4¨u×4×4×4×4×4×4Õ4Ø�‰�r0   N)rƒ   r„   r…   r¦   r¨   r'   r0   r.   r–   r–   ±   s   „ òór0   r–   c                  ó   — e Zd Zd„ Zy)ÚTestShadowModec                óê  — t        |dd¬«      }t        |d¬«      }|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      t        j                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  } |«       }d}||u }|sÁt        j                  d|fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      t        j                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  «        y )NÚshadowr   )r   r   r2   r3   TrQ   r   rG   r]   r_   rY   Fr\   )r/   r
   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r@   )
rl   r+   rF   rG   rn   ro   ru   rp   rv   rs   s
             r.   Ú%test_shadow_check_balance_always_truez4TestShadowMode.test_shadow_check_balance_always_trueÉ   s3  € Ü�h¨XÈBÔOˆÜ˜q¨1Ô-ˆà×.Ñ.Ð8Ñ.Ó0Ð8°DÐ8Ð0°DÐ8×8×8Õ8Ð0°D×8×8×8×8×8Ñ8ˆv×8×8Ó8ˆv×8×8Ô8Ð.×8×8Ò8Ð0×8×8Ò8°D×8×8×8×8×8×8Õ8Ø×)Ñ)Ð4Ñ)Ó+Ð4¨uÐ4Ð+¨uÐ4×4×4Õ4Ð+¨u×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð)×4×4Ò4Ð+×4×4Ò4¨u×4×4×4×4×4×4Õ4Ø�‰�r0   N)rƒ   r„   r…   r­   r'   r0   r.   rª   rª   È   s   „ ór0   rª   c                  óD   — e Zd Z ed«      d„ «       Z ed«      d„ «       Zy)ÚTestTokenAlarmEmailzsendgrid.SendGridAPIClientc                ó¢   — t        |dd¬«      }t        |d¬«      }|j                  |dd¬«       |j                  «        |j	                  «        y )	NúSG.fakeúa@b.com©r   r    r2   r3   TrŽ   ©Ú	exhaustedr7   ©r/   r
   Úsend_tokens_alarmÚassert_calledr@   ©rl   ÚMockSGr+   rF   rG   s        r.   Útest_exhaustion_alarm_sendsz/TestTokenAlarmEmail.test_exhaustion_alarm_sends×   sF   € ä�h°ÈIÔVˆÜ˜q¨1Ô-ˆØ× Ñ  ¨d¸CÐ Ô@Ø×ÑÔØ�‰�r0   c                ó¢   — t        |dd¬«      }t        |d¬«      }|j                  |dd¬«       |j                  «        |j	                  «        y )	Nr±   r²   r³   r2   r3   Fr‰   r´   r¶   r¹   s        r.   Útest_restoration_alarm_sendsz0TestTokenAlarmEmail.test_restoration_alarm_sendsß   sF   € ä�h°ÈIÔVˆÜ˜q¨1Ô-ˆØ× Ñ  ¨e¸TÐ ÔBØ×ÑÔØ�‰�r0   N)rƒ   r„   r…   r   r»   r½   r'   r0   r.   r¯   r¯   Ö   s4   „ Ù
Ð'Ó(ñó )ðñ Ð'Ó(ñó )ñr0   r¯   )Úreturnr   )rM   )r7   Úfloat)Ú__doc__Ú
__future__r   Úbuiltinsrd   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterb   Úunittest.mockr   r   ÚpytestÚ agent_samochodowy.billing.clientr   r   r   r	   Ú agent_samochodowy.billing.ledgerr
   Úagent_samochodowy.configr   r/   rI   rK   r‡   r–   rª   r¯   r'   r0   r.   ú<module>rË      sf   ðÙ Nå "ç  „ × *ã ÷ó õ ;Ý -ó ô2÷Dñ ÷>=ñ =÷Hñ ÷.ñ ÷ò r0   