Ë
    ªCBjA  ã                  ó.  — d Z ddlmZ ddlZddlmc mZ ddl	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	„Z G d
„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z y)zUTests for billing: client, ledger, dedup, circuit breaker. Airminal API fully mocked.é    )ÚannotationsN)Ú	MagicMockÚpatch)ÚAirminalClientÚBalanceResultÚChargeResultÚInsufficientTokensError)ÚBillingLedger)ÚSettingsc                 ód   — t        ddddddddd	d
¬«
      }|j                  | «       t        di |¤ŽS )NÚtestTÚfake_key_for_testszhttps://mock.airminal.com/apiÚshadowç      à?ç      @ç       @ç        g      i@)
Údgred_api_keyÚdry_runÚairminal_billing_keyÚairminal_billing_urlÚbilling_modeÚtokens_per_scanÚtokens_per_lead_67Útokens_per_lead_68Útokens_per_lead_69Úbilling_max_tokens_per_cycle© )ÚdictÚupdater   )Ú	overridesÚdefaultss     ú5/var/www/html/agent.samochodowy/tests/test_billing.pyÚ	_settingsr$      sF   € ÜØØØ1Ø<ØØØØØØ%*ô€Hð ‡O�O�IÔÜÑ�hÑÐó    c                óN   — t        ddt        | dz  «      i|¤Ž}t        |d¬«      S )NÚdb_pathútest.dbé   ©Úcycle_idr   )r$   Ústrr
   )Útmp_pathr!   Úss      r#   Ú_ledgerr/   )   s+   € ÜÑAœ#˜h¨Ñ2Ó3ÐA°yÑA€AÜ˜ QÔ'Ð'r%   c                  ó|   — e Zd Z ed«      d„ «       Z ed«      d„ «       Z ed«      d„ «       Z ed«      d„ «       Zy)ÚTestAirminalClientz-agent_samochodowy.billing.client.httpx.Clientc                óŒ  — t        «       }t        «       }ddddœ|j                  _        ||j                  _        ||_        t	        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                  |«      d
œz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                  }d}||k(  }|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}||k(  }|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#                  «        y )NTg     Ðb@g      $@©ÚsuccessÚbalanceÚlockedúhttps://api.test/billingÚkey123©Úis©z/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sÚresult©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7©ú==)z/%(py2)s
{%(py2)s = %(py0)s.balance
} == %(py5)s)z.%(py2)s
{%(py2)s = %(py0)s.locked
} == %(py5)s)r   ÚjsonÚreturn_valueÚgetr   Úcheck_balancer4   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr5   r6   Úclose)ÚselfÚ	MockHttpxÚ	mock_httpÚ	mock_respÚclientr<   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8s              r#   Útest_check_balancez%TestAirminalClient.test_check_balance3   s£  € ä“Kˆ	Ü“Kˆ	Ø26À5ÐTXÑ&Yˆ	�‰Ô#Ø%.ˆ	�‰Ô"Ø!*ˆ	ÔäÐ :¸HÓEˆØ×%Ñ%Ó'ˆà�~‰~Ð% Ð%ˆ~ Ð%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ó%Ø�~‰~Ð& Ð&ˆ~ Ñ&×&×&Õ&ˆ~ ×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ~×&×&Ò& ×&×&×&×&×&×&Ó&Ø�}‰}Ð$ Ð$ˆ} Ñ$×$×$Õ$ˆ} ×$×$×$×$×$Ñ$ˆv×$×$Ó$ˆv×$×$Ô$ˆ}×$×$Ò$ ×$×$×$×$×$×$Ó$Ø�‰�r%   c                óê  — t        «       }t        «       }d|_        ddddœ|j                  _        ||j                  _        ||_        t        dd«      }|j                  dd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                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                   }d}||k(  }|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}||k(  }|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                  j$                  }|j&                  d   }|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }d	}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j)                  «        y )NéÈ   Tr   g     0b@)r4   ÚchargedÚbalance_afterr7   r8   zlead Dopasowanozlead-123-abcr9   r;   r<   r=   rA   rB   rC   )z/%(py2)s
{%(py2)s = %(py0)s.charged
} == %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.balance_after
} == %(py5)srE   Útokens©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6Ú	referenceÚservice_typeÚagent_fb)r   Ústatus_coderE   rF   Úpostr   Úcharger4   rI   rJ   rK   rL   rM   rN   rO   rP   r_   r`   Ú	call_argsÚkwargsrQ   )rR   rS   rT   rU   rV   r<   rW   rX   rY   rZ   r[   Úcall_kwargsÚpayloadÚ@py_assert0Ú@py_assert2Ú@py_format5Ú@py_format7s                    r#   Útest_charge_successz&TestAirminalClient.test_charge_successC   sÍ  € ä“Kˆ	Ü“Kˆ	Ø #ˆ	Ôà¨¸eñ'
ˆ	�‰Ô#ð '0ˆ	�‰Ô#Ø!*ˆ	ÔäÐ :¸HÓEˆØ—‘˜sÐ$5°~ÓFˆà�~‰~Ð% Ð%ˆ~ Ð%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ó%Ø�~‰~Ð$ Ð$ˆ~ Ñ$×$×$Õ$ˆ~ ×$×$×$×$×$Ñ$ˆv×$×$Ó$ˆv×$×$Ô$ˆ~×$×$Ò$ ×$×$×$×$×$×$Ó$Ø×#Ñ#Ð, uÐ,Ð# uÑ,×,×,Õ,Ð# u×,×,×,×,×,Ñ,ˆv×,×,Ó,ˆv×,×,Ô,Ð#×,×,Ò, u×,×,×,×,×,×,Ó,à—n‘n×.Ñ.ˆØ×$Ñ$ VÑ,ˆØ�xÑ Ð' CÐ'Ð  CÑ'×'×'Õ'Ð  C×'×'Ó'Ð ×'×'Ò' C×'×'×'×'×'×'Ó'Ø�{Ñ#Ð5 ~Ð5Ð# ~Ñ5×5×5Õ5Ð# ~×5×5Ó5Ð#×5×5Ò5 ~×5×5×5×5×5×5Ó5Ø�~Ñ&Ð4¨*Ð4Ð&¨*Ñ4×4×4Õ4Ð&¨*×4×4Ó4Ð&×4×4Ò4¨*×4×4×4×4×4×4Ó4Ø�‰�r%   c                ó\  — t        «       }t        «       }d|_        ddi|_        ddi|j                  _        ||j
                  _        ||_        t        dd«      }t        j                  t        «      5  |j                  dd	d
«       d d d «       |j                  «        y # 1 sw Y   ŒxY w)Ni’  zcontent-typezapplication/jsonÚerrorÚINSUFFICIENT_TOKENSr7   r8   r   ÚtaskÚref)r   rk   ÚheadersrE   rF   rl   r   ÚpytestÚraisesr	   rm   rQ   )rR   rS   rT   rU   rV   s        r#   Útest_charge_insufficientz+TestAirminalClient.test_charge_insufficient\   s”   € ä“Kˆ	Ü“Kˆ	Ø #ˆ	ÔØ+Ð-?Ð@ˆ	ÔØ'.Ð0EÐ&Fˆ	�‰Ô#Ø&/ˆ	�‰Ô#Ø!*ˆ	ÔäÐ :¸HÓEˆÜ�]‰]Ô2Ó3ñ 	.Ø�M‰M˜#˜v uÔ-÷	.à�‰�÷	.ð 	.ús   Á5B"Â"B+c                ó$  — t        «       }t        «       }ddddœ|j                  _        ||j                  _        ||_        t	        dd«      }|j                  «        |j                  j                  j                  d   }|d   }d}||k(  }|slt        j                  d	|fd
||f«      t        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                  «        y )NTéd   r   r3   zhttps://api.testÚ
secret_keyÚparamsÚapi_keyrC   rb   rc   rf   rg   )r   rE   rF   rG   r   rH   rn   ro   rI   rJ   rN   rO   rP   rQ   )rR   rS   rT   rU   rV   rƒ   rr   rY   rs   rt   ru   s              r#   Útest_bearer_auth_headerz*TestAirminalClient.test_bearer_auth_headerk   sÆ   € ä“Kˆ	Ü“Kˆ	Ø26À3ÐRSÑ&Tˆ	�‰Ô#Ø%.ˆ	�‰Ô"Ø!*ˆ	ÔäÐ 2°LÓAˆØ×ÑÔà—‘×(Ñ(×/Ñ/°Ñ9ˆØ�iÑ Ð0 LÐ0Ð  LÑ0×0×0Õ0Ð  L×0×0Ó0Ð ×0×0Ò0 L×0×0×0×0×0×0Ó0Ø�‰�r%   N)Ú__name__Ú
__module__Ú__qualname__r   r\   rv   r   r…   r   r%   r#   r1   r1   2   sh   „ Ù
Ð:Ó;ñó <ðñ Ð:Ó;ñó <ðñ0 Ð:Ó;ñó <ðñ Ð:Ó;ñó <ñr%   r1   c                  ó<   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚTestLedgerShadowc           	     óf  — t        |«      }|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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }	dd	|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}x}}|j                  «        y )
NÚg1ú
Test GroupTr9   )z[%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.charge_scan
}(%(py4)s, %(py6)s)
} is %(py11)sÚledger)r>   r?   re   rg   Úpy8Úpy11zassert %(py13)sÚpy13©r/   Úcharge_scanrI   rJ   rK   rL   rM   rN   rO   rP   rQ   )rR   r-   rŽ   rW   rY   Ú@py_assert5Ú@py_assert7Ú@py_assert10Ú@py_assert9Ú@py_format12Ú@py_format14s              r#   Útest_shadow_always_proceedsz,TestLedgerShadow.test_shadow_always_proceeds€   sÃ   € Ü˜Ó"ˆØ×!Ñ!Ð= $Ð=¨Ð=Ñ! $¨Ó5Ð=¸Ð=Ð5¸Ð=×=×=Õ=Ð5¸×=×=×=×=×=Ñ=ˆv×=×=Ó=ˆv×=×=Ô=Ð!×=×=Ò= $×=×=Ò=¨×=×=Ò=Ð5×=×=Ò=¸×=×=×=×=×=×=×=Ñ=Ø�‰�r%   c                ó8  — t        |«      }|j                  t        j                  «      5  |j	                  dd«       d d d «       d„ |j
                  D «       }t        |«      }|s•ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}|j                  «        y # 1 sw Y   ŒÓxY w)NrŒ   r�   c              3  ó8   K  — | ]  }d |j                   v –— Œ y­w)Úwould_chargeN©Úmessage©Ú.0Úrs     r#   ú	<genexpr>zATestLedgerShadow.test_shadow_logs_would_charge.<locals>.<genexpr>‰   s   è ø€ ÒG°1�> Q§Y¡YÔ.ÑGùó   ‚ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©r>   r?   re   )r/   Úat_levelÚloggingÚINFOr“   Úrecordsr¦   rK   rL   rI   rM   rN   rO   rP   rQ   )rR   r-   ÚcaplogrŽ   rW   rY   rt   s          r#   Útest_shadow_logs_would_chargez.TestLedgerShadow.test_shadow_logs_would_charge…   s­   € Ü˜Ó"ˆØ�_‰_œWŸ\™\Ó*ñ 	3Ø×Ñ˜t \Ô2÷	3áG¸¿¹ÔGÐGŒsÐGÓGÐGÑG×G×G×G×GÕGŒs×G×GÓGŒs×G×GÔGÐG×G×GÒGÐG×G×G×G×G×GÒGØ�‰�÷	3ð 	3ús   «DÄDc                ó  — t        |«      }|j                  dd«       |j                  dd«       |j                  }d}||k(  }|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                  «        y ©NrŒ   úGroup 1Úg2úGroup 2ç      ð?rC   ©z3%(py2)s
{%(py2)s = %(py0)s.cycle_total
} == %(py5)srŽ   r=   rA   rB   ©r/   r“   Úcycle_totalrI   rJ   rK   rL   rM   rN   rO   rP   rQ   ©rR   r-   rŽ   rW   rX   rY   rZ   r[   s           r#   Útest_shadow_tracks_cycle_totalz/TestLedgerShadow.test_shadow_tracks_cycle_totalŒ   ó§   € Ü˜Ó"ˆØ×Ñ˜4 Ô+Ø×Ñ˜4 Ô+Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ó(Ø�‰�r%   c                óð  — t        |«      }|j                  ddd«       |j                  }d}||k(  }|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                  «        y )NÚ
DopasowanoÚc1Úp1r   rC   r´   rŽ   r=   rA   rB   ©r/   Úcharge_leadr¶   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r·   s           r#   Útest_shadow_lead_67_charges_5z.TestLedgerShadow.test_shadow_lead_67_charges_5“   s™   € Ü˜Ó"ˆØ×Ñ˜<¨¨tÔ4Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ó(Ø�‰�r%   c                óð  — t        |«      }|j                  ddd«       |j                  }d}||k(  }|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                  «        y )NzDo weryfikacjir¼   r½   r   rC   r´   rŽ   r=   rA   rB   r¾   r·   s           r#   Útest_shadow_lead_68_charges_2z.TestLedgerShadow.test_shadow_lead_68_charges_2™   sš   € Ü˜Ó"ˆØ×ÑÐ+¨T°4Ô8Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ó(Ø�‰�r%   c                ó:  — t        |«      }|j                  d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}||k(  }	|	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                  «        y )NzBrak dopasowaniar¼   r½   Tr9   ©z%(py0)s is %(py3)sr<   ©r>   Úpy3úassert %(py5)sr@   r   rC   r´   rŽ   r=   rA   rB   )r/   r¿   rI   rJ   rK   rL   rM   rN   rO   rP   r¶   rQ   )rR   r-   rŽ   r<   rs   rW   Ú@py_format4rZ   rX   rY   r[   s              r#   Útest_shadow_lead_69_charges_0z.TestLedgerShadow.test_shadow_lead_69_charges_0Ÿ   sô   € Ü˜Ó"ˆØ×#Ñ#Ð$6¸¸dÓCˆØÐˆv˜ˆ~××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ó(Ø�‰�r%   c                ó2  — t        |«      }t        «       |_        |j                  dd«       |j	                  ddd«       |j                  j
                  j                  «        |j                  j                  j                  «        |j                  «        y )NrŒ   ÚGroupr»   r¼   r½   )	r/   r   Ú_clientr“   r¿   rm   Úassert_not_calledrH   rQ   )rR   r-   rŽ   s      r#   Útest_shadow_never_calls_apiz,TestLedgerShadow.test_shadow_never_calls_api¦   sl   € Ü˜Ó"ˆä"›ˆŒØ×Ñ˜4 Ô)Ø×Ñ˜<¨¨tÔ4Ø�‰×Ñ×/Ñ/Ô1Ø�‰×$Ñ$×6Ñ6Ô8Ø�‰�r%   c                óì  — t        |«      }|j                  dd«       |j                  j                  d«      }|j	                  «       }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t
        «      rt        j                  t
        «      nd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}}|d   d   }
d}|
|k(  }|slt        j                  d|fd|
|f«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}
x}}|d   d   }
d}|
|k(  }|slt        j                  d|fd|
|f«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}
x}}|d   d   }
d}|
|k(  }|slt        j                  d|fd|
|f«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}
x}}|d   d   }
d}|
|k(  }|slt        j                  d|fd|
|f«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}
x}}|j                  «        y )NrŒ   r�   úSELECT * FROM billing_logr)   rC   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚrows©r>   rd   rÆ   rg   úassert %(py8)sr�   r   r<   r�   rb   rc   rf   rg   Úmoder   ra   r   rh   ú	scan-g1-1)r/   r“   Ú_connÚexecuteÚfetchallrÒ   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )rR   r-   rŽ   ÚcurrÓ   rs   r”   rX   ru   Ú@py_format9rr   rY   rt   s                r#   Útest_shadow_writes_billing_logz/TestLedgerShadow.test_shadow_writes_billing_log°   s$  € Ü˜Ó"ˆØ×Ñ˜4 Ô.Ø�l‰l×"Ñ"Ð#>Ó?ˆØ�|‰|‹~ˆÜ�4‹yÐ˜AÐˆy˜A‰~××Õˆy˜A×××××ÑŒs××ÓŒs×××××Ò�4××Ó�4××Ôˆy××Ò˜A××××××ÓØ�A‰w�xÑ Ð2 NÐ2Ð  NÑ2×2×2Õ2Ð  N×2×2Ó2Ð ×2×2Ò2 N×2×2×2×2×2×2Ó2Ø�A‰w�v‰Ð* (Ð*ˆ (Ñ*×*×*Õ*ˆ (×*×*Ó*ˆ×*×*Ò* (×*×*×*×*×*×*Ó*Ø�A‰w�xÑ Ð' CÐ'Ð  CÑ'×'×'Õ'Ð  C×'×'Ó'Ð ×'×'Ò' C×'×'×'×'×'×'Ó'Ø�A‰w�{Ñ#Ð2 {Ð2Ð# {Ñ2×2×2Õ2Ð# {×2×2Ó2Ð#×2×2Ò2 {×2×2×2×2×2×2Ó2Ø�‰�r%   N)r†   r‡   rˆ   rš   r­   r¸   rÀ   rÂ   rÉ   rÎ   rÝ   r   r%   r#   rŠ   rŠ      s*   „ òò
òòòòòó
r%   rŠ   c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚTestLedgerDedupc                ó  — t        |«      }|j                  dd«       |j                  dd«       |j                  }d}||k(  }|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                  «        y )
NrŒ   rË   r   rC   r´   rŽ   r=   rA   rB   rµ   r·   s           r#   Ú%test_same_reference_not_charged_twicez5TestLedgerDedup.test_same_reference_not_charged_twiceÂ   s§   € Ü˜Ó"ˆØ×Ñ˜4 Ô)Ø×Ñ˜4 Ô)Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ó(Ø�‰�r%   c                ó  — t        |«      }|j                  dd«       |j                  dd«       |j                  }d}||k(  }|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                  «        y r¯   rµ   r·   s           r#   Ú&test_different_references_both_chargedz6TestLedgerDedup.test_different_references_both_chargedÉ   r¹   r%   c                ó„  — t        |dz  «      }t        |¬«      }t        |d¬«      }|j                  dd«       |j	                  «        t        |d¬«      }|j                  dd«       |j
                  }d}||k(  }|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	                  «        y )Nr(   ©r'   r)   r*   rŒ   rË   r   rC   r´   Úl2r=   rA   rB   ©r,   r$   r
   r“   rQ   r¶   rI   rJ   rK   rL   rM   rN   rO   rP   ©rR   r-   Údbr.   Úl1ræ   rW   rX   rY   rZ   r[   s              r#   Ú$test_dedup_persists_across_instancesz4TestLedgerDedup.test_dedup_persists_across_instancesÐ   óÎ   € Ü�˜IÑ%Ó&ˆÜ˜bÔ!ˆä˜1 qÔ)ˆØ
�‰�t˜WÔ%Ø
�‰Œ
ä˜1 qÔ)ˆØ
�‰�t˜WÔ%Ø�~‰~Ð$ Ð$ˆ~ Ñ$×$×$Õ$ˆ~ ×$×$×$×$×$Ñ$ˆr×$×$Ó$ˆr×$×$Ô$ˆ~×$×$Ò$ ×$×$×$×$×$×$Ó$Ø
�‰�
r%   c                ó„  — t        |dz  «      }t        |¬«      }t        |d¬«      }|j                  dd«       |j	                  «        t        |d¬«      }|j                  dd«       |j
                  }d}||k(  }|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	                  «        y )Nr(   rå   r)   r*   rŒ   rË   é   r   rC   r´   ræ   r=   rA   rB   rç   rè   s              r#   Ú"test_different_cycle_new_referencez2TestLedgerDedup.test_different_cycle_new_referenceÝ   rì   r%   N)r†   r‡   rˆ   rá   rã   rë   rï   r   r%   r#   rß   rß   Á   s   „ òòòór%   rß   c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestLedgerCircuitBreakerc                ó¨  — t        |d¬«      }t        d«      D ]  }|j                  d|› �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                  |«      d
œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|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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                  |«      d
œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}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                  «        y )Ng      @)r   é   ÚgzGroup Fr9   ©z.%(py2)s
{%(py2)s = %(py0)s.halted
} is %(py5)srŽ   r=   rA   rB   rC   r´   Úg6zGroup 6TrÄ   r<   rÅ   rÇ   r@   )r/   Úranger“   ÚhaltedrI   rJ   rK   rL   rM   rN   rO   rP   r¶   rQ   )rR   r-   rŽ   ÚirW   rX   rY   rZ   r[   r<   rs   rÈ   s               r#   Útest_halts_when_exceeds_maxz4TestLedgerCircuitBreaker.test_halts_when_exceeds_maxð   sþ  € Ü˜ÀÔDˆä�q“ò 	6ˆAØ×Ñ  1 #˜w¨&°°¨Õ5ð	6à�}‰}Ð% Ð%ˆ} Ð%×%×%Õ%ˆ} ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ}×%×%Ò% ×%×%×%×%×%×%Ó%Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ó(ð ×#Ñ# D¨)Ó4ˆØ�}‰}Ð$ Ð$ˆ} Ð$×$×$Õ$ˆ} ×$×$×$×$×$Ñ$ˆv×$×$Ó$ˆv×$×$Ô$ˆ}×$×$Ò$ ×$×$×$×$×$×$Ó$ØÐˆv˜ˆ~××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ�‰�r%   c                óâ  — t        |dd¬«      }t        «       }t        dddd¬«      |j                  _        ||_        |j                  d	d
«       |j                  dd«       |j                  d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                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}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!                  «        y )NÚliver³   )r   r   Tr   ç     àX@Ú ©r4   r_   r`   rx   rŒ   r°   r±   r²   Úg3zGroup 3r9   rõ   rŽ   r=   rA   rB   FrÄ   r<   rÅ   rÇ   r@   )r/   r   r   rm   rF   rÌ   r“   rø   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )rR   r-   rŽ   Úmock_clientr<   rW   rX   rY   rZ   r[   rs   rÈ   s               r#   Útest_halt_blocks_in_livez1TestLedgerCircuitBreaker.test_halt_blocks_in_liveþ   s=  € Ü˜°ÐUXÔYˆä“kˆÜ*6Ø #°TÀô+
ˆ×ÑÔ'ð %ˆŒà×Ñ˜4 Ô+Ø×Ñ˜4 Ô+Ø×#Ñ# D¨)Ó4ˆØ�}‰}Ð$ Ð$ˆ} Ð$×$×$Õ$ˆ} ×$×$×$×$×$Ñ$ˆv×$×$Ó$ˆv×$×$Ô$ˆ}×$×$Ò$ ×$×$×$×$×$×$Ó$ØÐˆv˜ˆ××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ�‰�r%   N)r†   r‡   rˆ   rú   r  r   r%   r#   rñ   rñ   ï   s   „ òór%   rñ   c                  ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTestLedgerLivec                óÐ  — t        |d¬«      }t        «       }t        ddd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                  j                  «        |j                  j                   j"                  d   }	d}|	|k(  }|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%                  «        y )Nrü   ©r   Tr   rý   rþ   rÿ   rŒ   r°   r9   rÄ   r<   rÅ   rÇ   r@   rî   r×   rC   )z%(py0)s == %(py3)sr{   )r/   r   r   rm   rF   rÌ   r“   rI   rJ   rK   rL   rM   rN   rO   rP   Úassert_called_oncern   ÚargsrQ   )
rR   r-   rŽ   r  r<   rs   rW   rÈ   rZ   r{   s
             r#   Útest_live_calls_apiz"TestLedgerLive.test_live_calls_api  s4  € Ü˜°Ô7ˆÜ“kˆÜ*6Ø #°TÀô+
ˆ×ÑÔ'ð %ˆŒà×#Ñ# D¨)Ó4ˆØÐˆv˜ˆ~××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ×Ñ×-Ñ-Ô/à× Ñ ×*Ñ*×/Ñ/°Ñ2ˆØ!Ð!ˆs�kÑ!×!×!Õ!ˆs�k×!×!×!×!×!Ñ!ˆs×!×!Ó!ˆs×!×!Ô!�k×!×!×!×!×!×!Ñ!Ø�‰�r%   c                ó  — t        |d¬«      }t        «       }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                  «        y )Nrü   r  zno fundsrŒ   r°   Fr9   rÄ   r<   rÅ   rÇ   r@   )r/   r   r	   rm   Úside_effectrÌ   r“   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )	rR   r-   rŽ   r  r<   rs   rW   rÈ   rZ   s	            r#   Útest_live_insufficient_blocksz,TestLedgerLive.test_live_insufficient_blocks$  s¢   € Ü˜°Ô7ˆÜ“kˆÜ)@ÀÓ)Lˆ×ÑÔ&Ø$ˆŒà×#Ñ# D¨)Ó4ˆØÐˆv˜ˆ××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ�‰�r%   c                óÞ  — t        |d¬«      }t        «       }t        d«      |j                  _        ||_        |j                  t        j                  «      5  |j                  dd«      }d 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}}d„ |j$                  D «       }t'        |«      }
|
s•ddt        j                  «       v st        j                  t&        «      rt        j                  t&        «      ndt        j                  |«      t        j                  |
«      dœz  }t!        t        j"                  |«      «      ‚d x}}
|j)                  «        y # 1 sw Y   �ŒyxY w)Nrü   r  ÚtimeoutrŒ   r°   Fr9   rÄ   r<   rÅ   rÇ   r@   c              3  ó8   K  — | ]  }d |j                   v –— Œ y­w)zairminal API errorNrž   r    s     r#   r£   z<TestLedgerLive.test_live_api_error_blocks.<locals>.<genexpr>7  s   è ø€ ÒM¸Ð'¨1¯9©9Ô4ÑMùr¤   r¥   r¦   r§   )r/   r   ÚRuntimeErrorrm   r  rÌ   r¨   r©   ÚERRORr“   rI   rJ   rK   rL   rM   rN   rO   rP   r«   r¦   rQ   )rR   r-   r¬   rŽ   r  r<   rs   rW   rÈ   rZ   rY   rt   s               r#   Útest_live_api_error_blocksz)TestLedgerLive.test_live_api_error_blocks.  s*  € Ü˜°Ô7ˆÜ“kˆÜ)5°iÓ)@ˆ×ÑÔ&Ø$ˆŒà�_‰_œWŸ]™]Ó+ñ 	9Ø×'Ñ'¨¨iÓ8ˆF÷	9àÐˆv˜ˆ××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑÙM¸f¿n¹nÔMÐMŒsÐMÓMÐMÑM×M×M×M×MÕMŒs×M×MÓMŒs×M×MÔMÐM×M×MÒMÐM×M×M×M×M×MÒMØ�‰�÷		9ñ 	9ús   ÁG"Ç"G,c                ó®  — t        |d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                  «        y )Nrü   rþ   )r   r   rŒ   r°   Fr9   rÄ   r<   rÅ   rÇ   r@   r’   )rR   r-   rŽ   r<   rs   rW   rÈ   rZ   s           r#   Útest_live_no_key_blocksz&TestLedgerLive.test_live_no_key_blocks:  sƒ   € Ü˜°ÈRÔPˆØ×#Ñ# D¨)Ó4ˆØÐˆv˜ˆ××Õˆv˜×××××Ñˆv××Óˆv××Ô˜××××××ÑØ�‰�r%   c                óJ  — t        |d¬«      }t        «       }t        dddd¬«      |j                  _        ||_        |j                  dd	d
«       |j                  j                  d«      }|j                  «       }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                   t        «      nd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}}|d   d   }d}||k(  }|slt        j                  d|fd||f«      t        j                   |«      t        j                   |«      dœz  }dd|iz  }	t#        t        j$                  |	«      «      ‚d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f«      t        j                   |«      t        j                   |«      dœz  }dd|iz  }	t#        t        j$                  |	«      «      ‚d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f«      t        j                   |«      t        j                   |«      dœz  }dd|iz  }	t#        t        j$                  |	«      «      ‚d x}x}}|j'                  «        y )Nrü   r  Tr   g     ÀW@rþ   rÿ   r»   r¼   r½   z0SELECT * FROM billing_log WHERE result='charged'r)   rC   rÑ   rÒ   rÓ   rÔ   rÕ   r�   r   ra   rb   rc   rf   rg   r`   rh   z
lead-c1-p1)r/   r   r   rm   rF   rÌ   r¿   rØ   rÙ   rÚ   rÒ   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )rR   r-   rŽ   r  rÛ   rÓ   rs   r”   rX   ru   rÜ   rr   rY   rt   s                 r#   Útest_live_logs_chargedz%TestLedgerLive.test_live_logs_charged@  s  € Ü˜°Ô7ˆÜ“kˆÜ*6Ø #°TÀô+
ˆ×ÑÔ'ð %ˆŒà×Ñ˜<¨¨tÔ4Ø�l‰l×"Ñ"Ð#UÓVˆØ�|‰|‹~ˆÜ�4‹yÐ˜AÐˆy˜A‰~××Õˆy˜A×××××ÑŒs××ÓŒs×××××Ò�4××Ó�4××Ôˆy××Ò˜A××××××ÓØ�A‰w�xÑ Ð' CÐ'Ð  CÑ'×'×'Õ'Ð  C×'×'Ó'Ð ×'×'Ò' C×'×'×'×'×'×'Ó'Ø�A‰w�Ñ'Ð/¨4Ð/Ð'¨4Ñ/×/×/Õ/Ð'¨4×/×/Ó/Ð'×/×/Ò/¨4×/×/×/×/×/×/Ó/Ø�A‰w�{Ñ#Ð3 |Ð3Ð# |Ñ3×3×3Õ3Ð# |×3×3Ó3Ð#×3×3Ò3 |×3×3×3×3×3×3Ó3Ø�‰�r%   N)r†   r‡   rˆ   r	  r  r  r  r  r   r%   r#   r  r    s   „ òò ò
òór%   r  c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestInvalidateEmptyScansc                ó¤  — t        |dz  «      }t        |¬«      }dd l}|j                  |«      }|j	                  d«       |j	                  d«       |j	                  d«       |j                  «        |j                  «        t        |d¬«      }|j                  d	d
«       |j                  «        t        |d¬«      }|j                  dd«       |j                  |«      }|j                  «        |d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}}
|d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}}
|j                  |«      }|j	                  d«      j                  «       }|d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}}
|j	                  d«      j                  «       }|d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}}
|j                  «        y )Nr(   rå   r   úÚ
            CREATE TABLE IF NOT EXISTS cycle_log (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                started_at TEXT NOT NULL,
                posts_fetched INTEGER DEFAULT 0
            )
        zKINSERT INTO cycle_log (started_at, posts_fetched) VALUES ('2026-01-01', 10)zJINSERT INTO cycle_log (started_at, posts_fetched) VALUES ('2026-01-02', 0)r)   r*   rŒ   r°   rî   r±   r²   ÚinvalidatedrC   rb   rc   rf   rg   ra   r   z3SELECT result FROM billing_log WHERE cycle_id = '2'Úinvalid_empty_scanz3SELECT result FROM billing_log WHERE cycle_id = '1'r�   )r,   r$   Úsqlite3ÚconnectrÙ   ÚcommitrQ   r
   r“   Úinvalidate_empty_scansrI   rJ   rN   rO   rP   Úfetchone)rR   r-   ré   r.   r  Úconnrê   ræ   r<   rr   rY   rs   rt   ru   Úrows                  r#   Ú(test_invalidates_scans_from_empty_cycleszATestInvalidateEmptyScans.test_invalidates_scans_from_empty_cyclesW  s^  € Ü�˜IÑ%Ó&ˆÜ˜bÔ!ˆó 	Ø�‰˜rÓ"ˆØ�‰ð ô 	ð 	�‰ÐbÔcØ�‰ÐaÔbØ�‰ŒØ�
‰
Œô ˜1 qÔ)ˆØ
�‰�t˜YÔ'Ø
�‰Œ
ä˜1 qÔ)ˆØ
�‰�t˜YÔ'Ø×*Ñ*¨2Ó.ˆØ
�‰Œ
à�mÑ$Ð)¨Ð)Ð$¨Ñ)×)×)Õ)Ð$¨×)×)Ó)Ð$×)×)Ò)¨×)×)×)×)×)×)Ó)Ø�hÑÐ& 3Ð&Ð 3Ñ&×&×&Õ&Ð 3×&×&Ó&Ð×&×&Ò& 3×&×&×&×&×&×&Ó&ð �‰˜rÓ"ˆØ�l‰lØAó
ç
‰(‹*ð 	ð �1‰vÐ-Ð-Ð-ˆvÐ-Ñ-×-×-Õ-ˆvÐ-×-×-Ó-ˆv×-×-Ò-Ð-×-×-×-×-×-×-Ó-ð �l‰lØAó
ç
‰(‹*ð 	ð �1‰vÐ'˜Ð'ˆv˜Ñ'×'×'Õ'ˆv˜×'×'Ó'ˆv×'×'Ò'˜×'×'×'×'×'×'Ó'Ø�
‰
�r%   c                óB  — t        |dz  «      }dd l}|j                  |«      }|j                  d«       |j                  d«       |j	                  «        |j                  «        t        |¬«      }t        |d¬«      }|j                  |«      }|j                  «        |d   }d}	||	k(  }
|
slt        j                  d	|
fd
||	f«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
}	y )Nr(   r   r  zJINSERT INTO cycle_log (started_at, posts_fetched) VALUES ('2026-01-01', 5)rå   r)   r*   r  rC   rb   rc   rf   rg   )r,   r  r  rÙ   r  rQ   r$   r
   r   rI   rJ   rN   rO   rP   )rR   r-   ré   r  r"  r.   rŽ   r<   rr   rY   rs   rt   ru   s                r#   Ú!test_no_empty_cycles_returns_zeroz:TestInvalidateEmptyScans.test_no_empty_cycles_returns_zero…  sÕ   € Ü�˜IÑ%Ó&ˆãØ�‰˜rÓ"ˆØ�‰ð ô 	ð 	�‰ÐaÔbØ�‰ŒØ�
‰
Œä˜bÔ!ˆÜ˜q¨1Ô-ˆØ×.Ñ.¨rÓ2ˆØ�‰ŒØ�mÑ$Ð)¨Ð)Ð$¨Ñ)×)×)Õ)Ð$¨×)×)Ó)Ð$×)×)Ò)¨×)×)×)×)×)×)Ô)r%   N)r†   r‡   rˆ   r$  r&  r   r%   r#   r  r  V  s   „ ò,ó\*r%   r  c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestReferenceFormatc                ó°  — t        |«      }|j                  dd«       |j                  j                  d«      }|j	                  «       d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «        y )NÚ	group_abcÚTestú!SELECT reference FROM billing_logr   zscan-group_abc-1rC   rb   rc   rf   rg   )r/   r“   rØ   rÙ   r!  rI   rJ   rN   rO   rP   rQ   ©	rR   r-   rŽ   rÛ   rr   rY   rs   rt   ru   s	            r#   Útest_scan_referencez'TestReferenceFormat.test_scan_reference¡  s–   € Ü˜Ó"ˆØ×Ñ˜;¨Ô/Ø�l‰l×"Ñ"Ð#FÓGˆØ�|‰|‹~˜aÑ Ð6Ð$6Ð6Ð Ð$6Ñ6×6×6Õ6Ð Ð$6×6×6Ó6Ð ×6×6Ò6Ð$6×6×6×6×6×6×6Ó6Ø�‰�r%   c                ó²  — t        |«      }|j                  ddd«       |j                  j                  d«      }|j	                  «       d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «        y )Nr»   Ú	client_42Úpost_xyzr,  r   zlead-client_42-post_xyzrC   rb   rc   rf   rg   )r/   r¿   rØ   rÙ   r!  rI   rJ   rN   rO   rP   rQ   r-  s	            r#   Útest_lead_referencez'TestReferenceFormat.test_lead_reference¨  s˜   € Ü˜Ó"ˆØ×Ñ˜<¨°jÔAØ�l‰l×"Ñ"Ð#FÓGˆØ�|‰|‹~˜aÑ Ð=Ð$=Ð=Ð Ð$=Ñ=×=×=Õ=Ð Ð$=×=×=Ó=Ð ×=×=Ò=Ð$=×=×=×=×=×=×=Ó=Ø�‰�r%   N)r†   r‡   rˆ   r.  r2  r   r%   r#   r(  r(     s   „ òór%   r(  c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestKeyMaskingc                óX  — t        |d¬«      }|j                  t        j                  «      5  |j	                  dd«       d d d «       dj                  d„ |j                  D «       «      }d}||v}|s™t        j                  d|fd||f«      t        j                  |«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}}|j                  «        y # 1 sw Y   ŒáxY w)NÚSECRET_KEY_123©r   rŒ   rË   ú c              3  ó4   K  — | ]  }|j                   –— Œ y ­w)Nrž   r    s     r#   r£   z=TestKeyMasking.test_key_not_in_shadow_logs.<locals>.<genexpr>¹  s   è ø€ Ò>¨!˜AŸI�IÑ>ùs   ‚©únot in)z%(py1)s not in %(py3)sÚall_logs)rd   rÆ   rÇ   r@   )r/   r¨   r©   ÚDEBUGr“   Újoinr«   rI   rJ   rN   rK   rL   rM   rO   rP   rQ   )	rR   r-   r¬   rŽ   r<  rr   rs   rÈ   rZ   s	            r#   Útest_key_not_in_shadow_logsz*TestKeyMasking.test_key_not_in_shadow_logsµ  sÁ   € Ü˜Ð8HÔIˆØ�_‰_œWŸ]™]Ó+ñ 	.Ø×Ñ˜t WÔ-÷	.à—8‘8Ñ>¨v¯~©~Ô>Ó>ˆØÐ/Ð xÐ/×/×/Õ/Ð x×/×/Ó/Ð×/×/×/×/×/Ð/ x×/×/Ó/ x×/×/×/×/×/×/Ó/Ø�‰�÷		.ð 	.ús   ­D Ä D)c           	     óÂ  — t        |d¬«      }|j                  dd«       |j                  j                  d«      }|j	                  «       D �]  }|j                  «       D ]ë  }d}||   }t        |«      }||v}	|	sÉt        j                  d|	fd||f«      t        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      d	œz  }
d
d|
iz  }t        t        j                  |«      «      ‚d x}x}	x}}Œí �Œ |j                  «        y )Nr6  r7  rŒ   rË   rÐ   r:  )z4%(py1)s not in %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r,   )rd   rÆ   r@   rB   zassert %(py9)sÚpy9)r/   r“   rØ   rÙ   rÚ   Úkeysr,   rI   rJ   rN   rK   rL   rM   rO   rP   rQ   )rR   r-   rŽ   rÛ   r#  Úcolrr   rX   Ú@py_assert6rs   r[   Ú@py_format10s               r#   Ú!test_key_not_in_billing_log_tablez0TestKeyMasking.test_key_not_in_billing_log_table½  sí   € Ü˜Ð8HÔIˆØ×Ñ˜4 Ô)Ø�l‰l×"Ñ"Ð#>Ó?ˆØ—<‘<“>ó 	=ˆCØ—x‘x“zò =�Ø'Ð<°3°s±8Ð<¬s°8«}Ð<Ð'¨}Ð<×<×<Õ<Ð'¨}×<×<Ó<Ð'×<×<×<×<×<Ð<¬s×<×<Ó<¬s×<×<Ô<°8×<×<Ò<¨}×<×<×<×<×<×<Ö<ò=ð	=ð 	�‰�r%   N)r†   r‡   rˆ   r?  rF  r   r%   r#   r4  r4  ´  s   „ òór%   r4  )Úreturnr   )rG  r
   )!Ú__doc__Ú
__future__r   ÚbuiltinsrK   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterI   r©   Úunittest.mockr   r   r}   Ú agent_samochodowy.billing.clientr   r   r   r	   Ú agent_samochodowy.billing.ledgerr
   Úagent_samochodowy.configr   r$   r/   r1   rŠ   rß   rñ   r  r  r(  r4  r   r%   r#   ú<module>rR     sŽ   ðÙ [å "ç  „ ƒß *ã ÷ó õ ;Ý -ó ó"(÷Fñ F÷Z;ñ ;÷D'ñ '÷\ñ ÷H<ñ <÷FC*ñ C*÷Tñ ÷(ò r%   