Ë
    °9jøI  ã                  ó¢  — 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 ddlZddlmZmZmZmZ ej$                  d„ «       Zd!d„Zej$                  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 G d„ d«      Z G d„ d«      Z G d„ d«      Z  G d„ d «      Z!y)"zLTests for GroupManager: schema, import, discovery funnel, hit_rate tracking.é    )ÚannotationsN)ÚPath)ÚDEAD_SCAN_THRESHOLDÚELIGIBLE_CATEGORIESÚHARD_DEAD_SCANSÚGroupManagerc              #  óf   K  — t        | dz  «      }t        |«      }|–— |j                  «        y­w)z!In-memory GroupManager for tests.útest.dbN©Ústrr   Úclose)Útmp_pathÚdbÚmanagers      ú4/var/www/html/agent.samochodowy/tests/test_groups.pyÚgmr      s/   è ø€ ô 
ˆX˜	Ñ!Ó	"€BÜ˜2Ó€GØ
‚MØ‡M�M…Oùs   ‚/1c                ó’   — |xs d|› �}| j                   j                  d||d|› �||f«       | j                   j                  «        y)z Helper to insert a single group.zGroup zm
        INSERT INTO fb_groups (group_id, nazwa, url, kategoria, aktywna)
        VALUES (?, ?, ?, ?, ?)
    zhttps://fb.com/groups/N)ÚconnÚexecuteÚcommit)r   Úgroup_idÚnazwaÚ	kategoriaÚaktywnas        r   Ú_insert_groupr      sQ   € àÒ(�v˜h˜ZÐ(€EØ‡G�G‡O�Oð ð �EÐ3°H°:Ð>À	È7Ð	SôUð ‡G�G‡N�NÕó    c                óD   — t        d«      D ]  }t        | d|› �«       Œ | S )z1GroupManager pre-loaded with 5 czesci_tir groups.é   Úg)Úranger   )r   Úis     r   Úgm_with_groupsr"   %   s,   € ô �1‹Xò #ˆÜ�b˜A˜a˜S˜'Õ"ð#à€Ir   c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)Ú
TestSchemac                ó  — |j                   j                  d«      }|j                  «       D �ch c]  }|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}}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}}y c c}w )Nz1SELECT name FROM sqlite_master WHERE type='table'r   Ú	fb_groups©Úin©z%(py1)s in %(py3)sÚtables©Úpy1Úpy3úassert %(py5)sÚpy5Úgroup_scan_log©r   r   ÚfetchallÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚAssertionErrorÚ_format_explanation)	Úselfr   ÚcurÚrowr*   Ú@py_assert0Ú@py_assert2Ú@py_format4Ú@py_format6s	            r   Útest_creates_tableszTestSchema.test_creates_tables.   sì   € Ø�g‰g�o‰oÐQÓRˆØ$'§L¡L£NÖ3˜S�#�a“&Ð3ˆÐ3ØÐ$ˆ{˜fÐ$×$×$Õ$ˆ{˜f×$×$Ó$ˆ{×$×$×$×$×$Ð$˜f×$×$Ó$˜f×$×$×$×$×$×$Ó$ØÐ)Ð 6Ð)×)×)Õ)Ð 6×)×)Ó)Ð×)×)×)×)×)Ð) 6×)×)Ó) 6×)×)×)×)×)×)Ô)ùò 4s   ®Fc                ó`  — |j                   j                  d«      }|j                  «       D �ch c]  }|d   ’Œ	 }}dD ]é  }||v }|sßt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  d	|› �«      d
z   d|iz  }t        t        j                  |«      «      ‚d }Œë y c c}w )NzPRAGMA table_info(fb_groups)é   )Úscans_countÚ
hits_countÚqueries_countÚlast_hit_atÚlast_scraped_atÚgroup_stater'   )z%(py0)s in %(py2)sÚcolÚcols)Úpy0Úpy2zMissing column: z
>assert %(py4)sÚpy4)r   r   r2   r3   r4   r6   r7   r8   r5   Ú_format_assertmsgr9   r:   )	r;   r   r<   r=   rL   rK   Ú@py_assert1Ú@py_format3Ú@py_format5s	            r   Útest_has_stats_columnsz!TestSchema.test_has_stats_columns4   sÃ   € Ø�g‰g�o‰oÐ<Ó=ˆØ"%§,¡,£.Ö1˜3��A“Ð1ˆÐ1ðFò 	9ˆCà˜$�;×8×8Õ8�3˜$×8×8×8×8×8Ñ8�3×8×8Ó8�3×8×8×8×8×8Ò8˜$×8×8Ó8˜$×8×8×8Ñ8Ð"2°3°%Ð 8×8×8×8×8×8Õ8ñ	9ùò 2s   ®D+c                ón  — t        |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}}y )
NÚx1z5SELECT group_state FROM fb_groups WHERE group_id='x1'r   Úuntested©ú==©z%(py1)s == %(py4)s©r,   rO   úassert %(py6)sÚpy6)	r   r   r   Úfetchoner3   r4   r5   r9   r:   )r;   r   r<   r>   Ú@py_assert3r?   rS   Ú@py_format7s           r   Útest_group_state_defaultz#TestSchema.test_group_state_default;   sw   € Ü�b˜$ÔØ�g‰g�o‰oÐUÓVˆØ�|‰|‹~˜aÑ Ð. JÐ.Ð  JÑ.×.×.Õ.Ð  J×.×.Ó.Ð ×.×.Ò. J×.×.×.×.×.×.Ô.r   c                óŒ   — t        |dz  «      }t        |«      }|j                  «        t        |«      }|j                  «        y)z<Opening same DB twice should not fail (ALTER IF NOT EXISTS).r
   Nr   )r;   r   r   Úgm1Úgm2s        r   Útest_migrate_idempotentz"TestSchema.test_migrate_idempotent@   s7   € ä�˜IÑ%Ó&ˆÜ˜2ÓˆØ�	‰	ŒÜ˜2ÓˆØ�	‰	�r   N)Ú__name__Ú
__module__Ú__qualname__rB   rT   ra   re   © r   r   r$   r$   -   s   „ ò*ò9ò/ó
r   r$   c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestImportCsvc                óÐ  — |dz  }|j                  d«       |j                  t        |«      «      }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                  «       }	|	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}}y )Nú
groups.csvzŒgroup_id,nazwa,url,kategoria,aktywna
123,Test Group,https://fb.com/groups/123,czesci_tir,1
456,Other Group,https://fb.com/groups/456,inne,0
é   rX   ©z%(py0)s == %(py3)sÚcount©rM   r-   r.   r/   ÚtotalrZ   r[   r\   r]   ÚactiverD   )Ú
write_textÚ
import_csvr   r3   r4   r6   r7   r8   r5   r9   r:   Ústats)r;   r   r   Úcsv_pathrp   r?   rQ   r@   rA   rv   r>   r_   rS   r`   s                 r   Útest_import_and_countz#TestImportCsv.test_import_and_countJ   s3  € Ø˜lÑ*ˆØ×ÑðAô	
ð
 —‘œc (›mÓ,ˆØÐˆu˜‰z××Õˆu˜×××××Ñˆu××Óˆu××Ô˜××××××ÑØ—‘“
ˆØ�W‰~Ð" Ð"ˆ~ Ñ"×"×"Õ"ˆ~ ×"×"Ó"ˆ~×"×"Ò" ×"×"×"×"×"×"Ó"Ø�X‰Ð# !Ð#ˆ !Ñ#×#×#Õ#ˆ !×#×#Ó#ˆ×#×#Ò# !×#×#×#×#×#×#Ô#r   c                ó  — |dz  }|j                  d«       |j                  t        |«      «       |j                  d«       |j                  t        |«      «       |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}}|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 )Nrm   zYgroup_id,nazwa,url,kategoria,aktywna
123,Old Name,https://fb.com/groups/123,czesci_tir,0
zYgroup_id,nazwa,url,kategoria,aktywna
123,New Name,https://fb.com/groups/123,czesci_tir,1
z9SELECT nazwa, aktywna FROM fb_groups WHERE group_id='123'r   zNew NamerX   rZ   r[   r\   r]   rD   )rt   ru   r   r   r   r^   r3   r4   r5   r9   r:   )r;   r   r   rw   r<   r=   r>   r_   r?   rS   r`   s              r   Útest_upsert_updates_existingz*TestImportCsv.test_upsert_updates_existingW   s  € Ø˜lÑ*ˆØ×ÑðDô	
ð 	�‰”c˜(“mÔ$Ø×ÑðDô	
ð 	�‰”c˜(“mÔ$Ø�g‰g�o‰oÐYÓZˆØ�l‰l‹nˆØ�1‰vÐ#˜Ð#ˆv˜Ñ#×#×#Õ#ˆv˜×#×#Ó#ˆv×#×#Ò#˜×#×#×#×#×#×#Ó#Ø�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××Ôr   N)rf   rg   rh   rx   rz   ri   r   r   rk   rk   I   s   „ ò$ór   rk   c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚTestRecordScanc                ó‚  — |}|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}}|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 }||u}|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      d
œz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}|d   }d }||u}|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      d
œz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}y )NÚg0r   rn   ©ÚqueriesÚhitsznSELECT scans_count, hits_count, queries_count, last_scraped_at, last_hit_at FROM fb_groups WHERE group_id='g0'r   rD   rX   rZ   r[   r\   r]   é   )úis not)z%(py1)s is not %(py4)sé   ©	Úrecord_scanr   r   r^   r3   r4   r5   r9   r:   ©
r;   r"   r   r<   r=   r>   r_   r?   rS   r`   s
             r   Útest_updates_countersz$TestRecordScan.test_updates_countersj   sÀ  € ØˆØ
�‰�t Q¨QˆÔ/Ø�g‰g�o‰oð1ó
ˆð �l‰l‹nˆØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ!˜TÐ!ˆv˜TÐ!×!×!Õ!ˆv˜T×!×!Ó!ˆv×!×!Ò!˜T×!×!×!×!×!×!Ó!Ø�1‰vÐ!˜TÐ!ˆv˜TÐ!×!×!Õ!ˆv˜T×!×!Ó!ˆv×!×!Ò!˜T×!×!×!×!×!×!Ô!r   c                ó€  — |}|j                  ddd¬«       |j                  j                  d«      }|j                  «       d   }d }||u }|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   r   z5SELECT last_hit_at FROM fb_groups WHERE group_id='g0')Úis)z%(py1)s is %(py4)sr[   r\   r]   r…   ©	r;   r"   r   r<   r>   r_   r?   rS   r`   s	            r   Útest_no_hits_no_last_hitz'TestRecordScan.test_no_hits_no_last_hitx   s„   € ØˆØ
�‰�t Q¨QˆÔ/Ø�g‰g�o‰oÐUÓVˆØ�|‰|‹~˜aÑ Ð( DÐ(Ð  DÐ(×(×(Õ(Ð  D×(×(Ó(Ð ×(×(Ò( D×(×(×(×(×(×(Ô(r   c                ó®  — |}|j                  ddd¬«       |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}}|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}}y )Nr~   rn   rD   r   r‚   r   zPSELECT scans_count, hits_count, queries_count FROM fb_groups WHERE group_id='g0'rX   rZ   r[   r\   r]   r   r…   r‡   s
             r   Útest_incrementszTestRecordScan.test_increments~   s4  € ØˆØ
�‰�t Q¨QˆÔ/Ø
�‰�t Q¨QˆÔ/Ø�g‰g�o‰oØ^ó
ˆð �l‰l‹nˆØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××Ôr   c                ó¦  — |}|j                  ddd¬«       |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}}g }
|d   d   }d}||k(  }|}|r|d   d   }d}||k(  }|}|sþt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	|
j                  |	«       |r_t        j                  dfdf«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }|
j                  |«       t        j                  |
d«      i z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
x}x}x}x}x}}g }
|d   d   }d}||k(  }|}|r|d   d   }d}||k(  }|}|sþt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	|
j                  |	«       |r_t        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }|
j                  |«       t        j                  |
d«      i z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
x}x}x}x}x}}y )Nr~   rn   rD   r   r‚   zHSELECT queries, hits FROM group_scan_log WHERE group_id='g0' ORDER BY idrX   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚrows©rM   r,   r-   r]   úassert %(py8)sÚpy8r   )z%(py3)s == %(py6)s)r-   r]   z%(py8)s)z%(py11)s == %(py14)s)Úpy11Úpy14z%(py16)sÚpy16zassert %(py19)sÚpy19)r†   r   r   r2   r‘   r3   r4   r6   r7   r8   r5   r9   r:   ÚappendÚ_format_boolop)r;   r"   r   r<   r’   r?   Ú@py_assert5Ú@py_assert4r`   Ú@py_format9rQ   r>   Ú@py_assert10Ú@py_assert13Ú@py_assert12Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                      r   Útest_scan_log_entriesz$TestRecordScan.test_scan_log_entriesŠ   s<  € ØˆØ
�‰�t Q¨QˆÔ/Ø
�‰�t Q¨QˆÔ/Ø�g‰g�o‰oØVó
ˆð �|‰|‹~ˆÜ�4‹yÐ˜AÐˆy˜A‰~××Õˆy˜A×××××ÑŒs××ÓŒs×××××Ò�4××Ó�4××Ôˆy××Ò˜A××××××ÓÙ2ˆt�A‰w�q‰zÐ2˜QÐ2ˆz˜Q‰Ô2 4¨¡7¨1¡:Ð2°Ð2 :°¡?×2×2×2ˆz˜Q×2×2Ó2ˆz×2×2Ò2˜Q×2×2×2×2×2×2Õ2 :°×2×2Ó2 :×2×2Ò2°×2×2×2×2×2×2×2×2×2×2×2×2×2Ö2Ù2ˆt�A‰w�q‰zÐ2˜QÐ2ˆz˜Q‰Ô2 4¨¡7¨1¡:Ð2°Ð2 :°¡?×2×2×2ˆz˜Q×2×2Ó2ˆz×2×2Ò2˜Q×2×2×2×2×2×2Õ2 :°×2×2Ó2 :×2×2Ò2°×2×2×2×2×2×2×2×2×2×2×2×2×2×2r   N)rf   rg   rh   rˆ   rŒ   rŽ   r¦   ri   r   r   r|   r|   i   s   „ ò"ò)ò
ó
3r   r|   c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚTestRollingHitRatec                ó   — |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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )	Nr~   ç        rX   ©zW%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._rolling_hit_rate
}(%(py4)s)
} == %(py9)sr"   ©rM   rN   rO   r]   Úpy9úassert %(py11)sr–   )	Ú_rolling_hit_rater3   r4   r6   r7   r8   r5   r9   r:   ©	r;   r"   rQ   r_   rœ   Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s	            r   Útest_no_scans_returns_zeroz-TestRollingHitRate.test_no_scans_returns_zero˜   sž   € Ø×/Ñ/Ð<°Ð<Ñ/°Ó5Ð<¸Ð<Ð5¸Ñ<×<×<Õ<Ð5¸×<×<×<×<×<Ñ<ˆ~×<×<Ó<ˆ~×<×<Ô<Ð/×<×<Ò<°×<×<Ò<Ð5×<×<Ò<¸×<×<×<×<×<×<×<Ð<r   c                ó,  — |}|j                  ddd¬«       |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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }d
d|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}y )Nr~   r   rn   r   ç       @rX   r«   r   r¬   r®   r–   )
r†   r¯   r3   r4   r6   r7   r8   r5   r9   r:   ©
r;   r"   r   rQ   r_   rœ   r±   r²   r³   r´   s
             r   Útest_single_scanz#TestRollingHitRate.test_single_scan›   sµ   € ØˆØ
�‰�t Q¨QˆÔ/Ø×#Ñ#Ð0 DÐ0Ñ# DÓ)Ð0¨SÐ0Ð)¨SÑ0×0×0Õ0Ð)¨S×0×0×0×0×0Ñ0ˆr×0×0Ó0ˆr×0×0Ô0Ð#×0×0Ò0 D×0×0Ò0Ð)×0×0Ò0¨S×0×0×0×0×0×0×0Ð0r   c           	     óÐ  — |}|j                  ddd¬«       |j                  ddd¬«       t        d«      D ]  }|j                  ddd¬«       Œ |j                  }d}d} |||¬«      }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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}	}y )Nr~   é
   r   r   r   )Úwindowrª   rX   )zh%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s._rolling_hit_rate
}(%(py4)s, window=%(py6)s)
} == %(py11)sr   ©rM   rN   rO   r]   r•   r–   úassert %(py13)sÚpy13)r†   r    r¯   r3   r4   r6   r7   r8   r5   r9   r:   )r;   r"   r   Ú_rQ   r_   rœ   r²   rŸ   Ú@py_assert9r´   Ú@py_format14s               r   Útest_window_limitedz&TestRollingHitRate.test_window_limited    sþ   € ØˆØ
�‰�t R¨bˆÔ1Ø
�‰�t R¨bˆÔ1Ü�r“ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à×#Ñ#Ð; DÐ;°Ð;Ñ# D°Ô4Ð;¸Ð;Ð4¸Ñ;×;×;Õ;Ð4¸×;×;×;×;×;Ñ;ˆr×;×;Ó;ˆr×;×;Ô;Ð#×;×;Ò; D×;×;Ò;°×;×;Ò;Ð4×;×;Ò;¸×;×;×;×;×;×;×;Ò;r   c                ó”  — |}t        d«      D ]  }|j                  ddd¬«       Œ t        d«      D ]  }|j                  ddd¬«       Œ |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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}y )Nr   r~   r‚   r   r   rD   ç      à?rX   r«   r   r¬   r®   r–   )r    r†   r¯   r3   r4   r6   r7   r8   r5   r9   r:   ©r;   r"   r   rÀ   rQ   r_   rœ   r±   r²   r³   r´   s              r   Útest_hit_rate_reflects_recentz0TestRollingHitRate.test_hit_rate_reflects_recent¨   sí   € ØˆÜ�q“ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4ä�q“ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à×#Ñ#Ð0 DÐ0Ñ# DÓ)Ð0¨SÐ0Ð)¨SÑ0×0×0Õ0Ð)¨S×0×0×0×0×0Ñ0ˆr×0×0Ó0ˆr×0×0Ô0Ð#×0×0Ò0 D×0×0Ò0Ð)×0×0Ò0¨S×0×0×0×0×0×0×0Ð0r   N)rf   rg   rh   rµ   r¹   rÃ   rÇ   ri   r   r   r¨   r¨   —   s   „ ò=ò1ò
<ó1r   r¨   c                  ó   — e Zd Zd„ Zd„ Zy)ÚTestWindowStatsc                ó  — |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}}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}}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}}y )Nr~   r   rX   ro   Úscansrq   r.   r/   r€   rª   Úhr)	Ú_window_statsr3   r4   r6   r7   r8   r5   r9   r:   )	r;   r"   rË   r€   rÌ   r?   rQ   r@   rA   s	            r   Útest_no_scanszTestWindowStats.test_no_scans²   s!  € Ø+×9Ñ9¸$Ó?Ñˆˆw˜ØÐˆu˜‰z××Õˆu˜×××××Ñˆu××Óˆu××Ô˜××××××ÑØÐˆw˜!‰|××Õˆw˜!×××××Ñˆw××Óˆw××Ô˜!××××××ÑØÐˆr�S‰y××Õˆr�S×××××Ñˆr××Óˆr××Ô�S××××××Òr   c                óf  — |}|j                  ddd¬«       |j                  ddd¬«       |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}}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}}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}}y )Nr~   r‚   rD   r   rn   r   rX   ro   rË   rq   r.   r/   r   r€   rÅ   rÌ   )
r†   rÍ   r3   r4   r6   r7   r8   r5   r9   r:   )
r;   r"   r   rË   r€   rÌ   r?   rQ   r@   rA   s
             r   Útest_with_scanszTestWindowStats.test_with_scans¸   sJ  € ØˆØ
�‰�t Q¨QˆÔ/Ø
�‰�t Q¨QˆÔ/Ø×-Ñ-¨dÓ3Ñˆˆw˜ØÐˆu˜‰z××Õˆu˜×××××Ñˆu××Óˆu××Ô˜××××××ÑØÐˆw˜!‰|××Õˆw˜!×××××Ñˆw××Óˆw××Ô˜!××××××ÑØÐˆr�S‰y××Õˆr�S×××××Ñˆr××Óˆr××Ô�S××××××Òr   N)rf   rg   rh   rÎ   rÐ   ri   r   r   rÉ   rÉ   ±   s   „ òór   rÉ   c                  ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTestComputeStatec                ó   — |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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )	Nr~   rW   rX   ©zT%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._compute_state
}(%(py4)s)
} == %(py9)sr"   r¬   r®   r–   )	Ú_compute_stater3   r4   r6   r7   r8   r5   r9   r:   r°   s	            r   Útest_untested_no_scansz'TestComputeState.test_untested_no_scansÃ   sž   € Ø×,Ñ,Ð@¨TÐ@Ñ,¨TÓ2Ð@°jÐ@Ð2°jÑ@×@×@Õ@Ð2°j×@×@×@×@×@Ñ@ˆ~×@×@Ó@ˆ~×@×@Ô@Ð,×@×@Ò@¨T×@×@Ò@Ð2×@×@Ò@°j×@×@×@×@×@×@×@Ð@r   c                óZ  — |}t        t        dz
  «      D ]  }|j                  ddd¬«       Œ |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                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      d	œz  }	d
d|	iz  }
t        t	        j                  |
«      «      ‚d x}x}x}x}}y )NrD   r~   r   r   rW   rX   rÔ   r   r¬   r®   r–   ©r    r   r†   rÕ   r3   r4   r6   r7   r8   r5   r9   r:   rÆ   s              r   Útest_untested_few_scansz(TestComputeState.test_untested_few_scansÆ   sÏ   € ØˆÜÔ*¨QÑ.Ó/ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à× Ñ Ð4 Ð4Ñ  Ó&Ð4¨*Ð4Ð&¨*Ñ4×4×4Õ4Ð&¨*×4×4×4×4×4Ñ4ˆr×4×4Ó4ˆr×4×4Ô4Ð ×4×4Ò4 ×4×4Ò4Ð&×4×4Ò4¨*×4×4×4×4×4×4×4Ð4r   c                ó,  — |}|j                  ddd¬«       |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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œz  }d
d|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}y )Nr~   rn   rD   r   ÚprovenrX   rÔ   r   r¬   r®   r–   )
r†   rÕ   r3   r4   r6   r7   r8   r5   r9   r:   r¸   s
             r   Útest_proven_with_queriesz)TestComputeState.test_proven_with_queriesÌ   sµ   € ØˆØ
�‰�t Q¨QˆÔ/Ø× Ñ Ð2 Ð2Ñ  Ó&Ð2¨(Ð2Ð&¨(Ñ2×2×2Õ2Ð&¨(×2×2×2×2×2Ñ2ˆr×2×2Ó2ˆr×2×2Ô2Ð ×2×2Ò2 ×2×2Ò2Ð&×2×2Ò2¨(×2×2×2×2×2×2×2Ð2r   c                ó|  — |}|j                  ddd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |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                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      d	œz  }	d
d|	iz  }
t        t	        j                  |
«      «      ‚dx}x}x}x}}y)z'One query in window keeps group proven.r~   rD   r   r   rÛ   rX   rÔ   r   r¬   r®   r–   N)r†   r    r   rÕ   r3   r4   r6   r7   r8   r5   r9   r:   rÆ   s              r   Ú&test_proven_even_with_many_empty_scansz7TestComputeState.test_proven_even_with_many_empty_scansÑ   sÞ   € àˆØ
�‰�t Q¨QˆÔ/ÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4ð × Ñ Ð2 Ð2Ñ  Ó&Ð2¨(Ð2Ð&¨(Ñ2×2×2Õ2Ð&¨(×2×2×2×2×2Ñ2ˆr×2×2Ó2ˆr×2×2Ô2Ð ×2×2Ò2 ×2×2Ò2Ð&×2×2Ò2¨(×2×2×2×2×2×2×2Ð2r   c                óT  — |}t        t        «      D ]  }|j                  ddd¬«       Œ |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                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }	d	d
|	iz  }
t        t	        j                  |
«      «      ‚d x}x}x}x}}y )Nr~   r   r   ÚdeadrX   rÔ   r   r¬   r®   r–   rØ   rÆ   s              r   Útest_dead_thresholdz$TestComputeState.test_dead_thresholdÚ   sÊ   € ØˆÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à× Ñ Ð0 Ð0Ñ  Ó&Ð0¨&Ð0Ð&¨&Ñ0×0×0Õ0Ð&¨&×0×0×0×0×0Ñ0ˆr×0×0Ó0ˆr×0×0Ô0Ð ×0×0Ò0 ×0×0Ò0Ð&×0×0Ò0¨&×0×0×0×0×0×0×0Ð0r   N)rf   rg   rh   rÖ   rÙ   rÜ   rÞ   rá   ri   r   r   rÒ   rÒ   Â   s   „ òAò5ò3ò
3ó1r   rÒ   c                  ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTestAutoCullc                óæ  — t        |dd¬«       t        t        «      D ]  }|j                  dd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}}|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}}|
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 )NÚd1rD   ©r   r   r   rà   rX   rZ   r[   r\   r]   Úculled_this_runz>SELECT aktywna, group_state FROM fb_groups WHERE group_id='d1')r   r    r   r†   Ú	auto_cullr3   r4   r5   r9   r:   r   r   r^   )r;   r   rÀ   Úresultr>   r_   r?   rS   r`   r<   r=   s              r   Útest_marks_dead_inactivez%TestAutoCull.test_marks_dead_inactiveâ   sš  € Ü�b˜$¨Õ*ÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à—‘“ˆØ�f‰~Ð" Ð"ˆ~ Ñ"×"×"Õ"ˆ~ ×"×"Ó"ˆ~×"×"Ò" ×"×"×"×"×"×"Ó"ØÐ'Ñ(Ð-¨AÐ-Ð(¨AÑ-×-×-Õ-Ð(¨A×-×-Ó-Ð(×-×-Ò-¨A×-×-×-×-×-×-Ó-Ø�g‰g�o‰oÐ^Ó_ˆØ�l‰l‹nˆØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ˜Ðˆv˜Ñ××Õˆv˜××Óˆv××Ò˜××××××Ôr   c                ó¾  — t        |dd¬«       |j                  dd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                  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}}|	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 )NÚp1r   ræ   r‚   rD   r   rÛ   rX   rZ   r[   r\   r]   z>SELECT aktywna, group_state FROM fb_groups WHERE group_id='p1'©r   r†   rè   r3   r4   r5   r9   r:   r   r   r^   )
r;   r   ré   r>   r_   r?   rS   r`   r<   r=   s
             r   Útest_marks_proven_activez%TestAutoCull.test_marks_proven_activeî   s6  € Ü�b˜$¨Õ*Ø
�‰�t Q¨QˆÔ/Ø—‘“ˆØ�hÑÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$Ó$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$Ø�g‰g�o‰oÐ^Ó_ˆØ�l‰l‹nˆØ�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××ÓØ�1‰vÐ!˜Ð!ˆv˜Ñ!×!×!Õ!ˆv˜×!×!Ó!ˆv×!×!Ò!˜×!×!×!×!×!×!Ô!r   c                óº  — t        |dd¬«       |j                  dd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                  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}}y )NÚu1r   ræ   r   rW   rD   rX   rZ   r[   r\   r]   z1SELECT aktywna FROM fb_groups WHERE group_id='u1'rí   )	r;   r   ré   r>   r_   r?   rS   r`   r<   s	            r   Útest_untested_unchangedz$TestAutoCull.test_untested_unchangedø   sè   € Ü�b˜$¨Õ*Ø
�‰�t Q¨QˆÔ/Ø—‘“ˆØ�jÑ!Ð& QÐ&Ð! QÑ&×&×&Õ&Ð! Q×&×&Ó&Ð!×&×&Ò& Q×&×&×&×&×&×&Ó&Ø�g‰g�o‰oÐQÓRˆØ�|‰|‹~˜aÑ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%Ó%Ð ×%×%Ò% A×%×%×%×%×%×%Ô%r   c           	     ó  — t        |ddd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «       }|j
                  }d}d} |||«      }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                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}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}}y )NÚt1Ú	transportrD   ©r   r   r   r   rà   rX   )zS%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
} == %(py11)sré   r½   r¾   r¿   z1SELECT aktywna FROM fb_groups WHERE group_id='t1'rZ   r[   r\   r]   )r   r    r   r†   rè   Úgetr3   r4   r6   r7   r8   r5   r9   r:   r   r   r^   )r;   r   rÀ   ré   rQ   r_   rœ   r²   rŸ   rÁ   r´   rÂ   r<   r>   r?   rS   r`   s                    r   Ú$test_ignores_non_eligible_categoriesz1TestAutoCull.test_ignores_non_eligible_categories   sW  € Ü�b˜$¨+¸qÕAÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à—‘“ˆà�z‰zÐ)˜&Ð) !Ð)‰z˜& !Ó$Ð)¨Ð)Ð$¨Ñ)×)×)Õ)Ð$¨×)×)×)×)×)Ñ)ˆv×)×)Ó)ˆv×)×)Ô)ˆz×)×)Ò)˜&×)×)Ò) !×)×)Ò)Ð$×)×)Ò)¨×)×)×)×)×)×)×)Ñ)Ø�g‰g�o‰oÐQÓRˆØ�|‰|‹~˜aÑ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%Ó%Ð ×%×%Ò% A×%×%×%×%×%×%Ô%r   c                ó€  — t        |dd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        |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dd¬«       |j	                  «        |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}}|	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)u8   A dead group that gets a query during retest â†’ proven.Úr1rD   ræ   r   r   z5SELECT group_state FROM fb_groups WHERE group_id='r1'rà   rX   rZ   r[   r\   r]   Nz>SELECT group_state, aktywna FROM fb_groups WHERE group_id='r1'rÛ   )r   r    r   r†   rè   r   r   r^   r3   r4   r5   r9   r:   )
r;   r   rÀ   r<   r>   r_   r?   rS   r`   r=   s
             r   Útest_dead_revives_to_provenz(TestAutoCull.test_dead_revives_to_proven
  s  € ä�b˜$¨Õ*ÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à
�‰ŒØ�g‰g�o‰oÐUÓVˆØ�|‰|‹~˜aÑ Ð* FÐ*Ð  FÑ*×*×*Õ*Ð  F×*×*Ó*Ð ×*×*Ò* F×*×*×*×*×*×*Ó*ð 	�‰�t Q¨QˆÔ/Ø
�‰ŒØ�g‰g�o‰oÐ^Ó_ˆØ�l‰l‹nˆØ�1‰vÐ!˜Ð!ˆv˜Ñ!×!×!Õ!ˆv˜×!×!Ó!ˆv×!×!Ò!˜×!×!×!×!×!×!Ó!Ø�1‰vÐ˜Ðˆv˜‰{××Õˆv˜××Óˆv××Ò˜××××××Ôr   N)rf   rg   rh   rê   rî   rñ   r÷   rú   ri   r   r   rã   rã   á   s   „ ò
 ò"ò&ò&ór   rã   c                  óH   — 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)ÚTestPickGroupsc                óF  — |j                  d«      }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}}y )
Nr»   r   rX   r�   r‘   ré   r“   r”   r•   )
Úpick_groupsr‘   r3   r4   r6   r7   r8   r5   r9   r:   )r;   r"   ré   r?   rœ   r�   r`   rž   s           r   Ú"test_returns_all_when_fewer_than_nz1TestPickGroups.test_returns_all_when_fewer_than_n  sž   € Ø×+Ñ+¨BÓ/ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××Ôr   c                ó|  — t        d«      D ]8  }t        |d|› �«       t        d«      D ]  }|j                  d|› �dd¬«       Œ Œ: t        d«      D ]  }t        |d|› �«       Œ |j                  «        d}d}t        |«      D ](  }|j	                  d	«      }|D ]  }|d
   dk(  sŒ|dz  }Œ Œ* d	}||z  }	d}
|	|
z  }||kD  }|sît        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      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}x}	x}
}y)z'Proven groups should get ~50% of slots.r‚   Úprn   rD   r   Úur   éd   r„   rJ   rÛ   g333333Ó?©ú>)z)%(py0)s > ((%(py2)s * %(py4)s) * %(py7)s)Úproven_countÚtrials)rM   rN   rO   Úpy7zassert %(py10)sÚpy10N)r    r   r†   rè   rþ   r3   r4   r6   r7   r8   r5   r9   r:   )r;   r   r!   rÀ   r  r  Úpickedr   r_   rœ   Ú@py_assert6r±   rQ   rž   Ú@py_format11s                  r   Útest_proven_gets_slotsz%TestPickGroups.test_proven_gets_slots!  su  € ô �q“ò 	;ˆAÜ˜"  ! ˜gÔ&Ü˜1“Xò ;�Ø—‘  1 #˜w°¸�Õ:ñ;ð	;ô �q“ò 	'ˆAÜ˜"  ! ˜gÕ&ð	'à
�‰Œð ˆØˆÜ�v“ò 	&ˆAØ—^‘^ AÓ&ˆFØò &�Ø�]Ñ# xÓ/Ø  AÑ%‘Lñ&ð	&ð ()Ð.˜f q™jÐ.¨3Ð.˜j¨3Ñ.Ð.ˆ|Ð.Ñ.×.×.Õ.ˆ|Ð.×.×.×.×.×.Ñ.ˆ|×.×.Ó.ˆ|×.×.×.×.×.Ò.˜f×.×.Ó.˜f×.×.Ô. q×.×.Ò.¨3×.×.×.×.×.×.×.Ð.r   c                ó$  — t        |ddd¬«       t        |ddd¬«       |j                  d«      }|D �ch c]  }|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}}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}}yc c}w )z:Untested pool must only include active groups (aktywna=1).rð   Úmechanika_poradyr   rõ   Úu2rD   r‚   r   ©únot in©z%(py1)s not in %(py3)sÚidsr+   r.   r/   Nr'   r)   ©
r   rþ   r3   r4   r5   r6   r7   r8   r9   r:   ©	r;   r   ré   r   r  r>   r?   r@   rA   s	            r   Ú$test_untested_pool_excludes_inactivez3TestPickGroups.test_untested_pool_excludes_inactive7  sú   € ä�b˜$Ð*<ÀaÕHÜ�b˜$Ð*<ÀaÕHØ—‘ Ó"ˆØ&,Ö- ˆq�‹}Ð-ˆÐ-ØÐˆt˜3ˆ××Õˆt˜3××Óˆt×××××Ð˜3××Ó˜3××××××ÓØÐˆt�sˆ{××Õˆt�s××Óˆt×××××Ð�s××Ó�s××××××Ôùò .ó   ´Fc                ó®  — t        d«      D ]  }t        |d|› �dd¬«       Œ t        |ddd¬«       |j                  d«      }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}}
y)z0Only aktywna=1 untested groups enter the funnel.r»   ÚinactiveÚ
czesci_tirr   rõ   Úactive1rD   r   rX   r�   r‘   ré   r“   r”   r•   Nr   rZ   r[   r\   r]   ©r    r   rþ   r‘   r3   r4   r6   r7   r8   r5   r9   r:   )r;   r   r!   ré   r?   rœ   r�   r`   rž   r>   r_   rS   s               r   Útest_untested_active_onlyz(TestPickGroups.test_untested_active_only@  s)  € ä�r“ò 	QˆAÜ˜" ¨¨˜n¸ÈaÖPð	Qä�b˜)¨|ÀQÕGØ—‘ Ó"ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××ÓØ�a‰y˜Ñ$Ð1¨	Ð1Ð$¨	Ñ1×1×1Õ1Ð$¨	×1×1Ó1Ð$×1×1Ò1¨	×1×1×1×1×1×1Ô1r   c                ó  — t        d«      D ]8  }t        |d|› �«       t        d«      D ]  }|j                  d|› �dd¬«       Œ Œ: t        d«      D ]<  }t        |d|› �«       t        t        «      D ]  }|j                  d|› �dd¬«       Œ Œ> |j	                  «        t        «       }t        d«      D ]7  }|j                  d«      }|D ]  }|d	   d
k(  sŒ|j                  |d   «       Œ! Œ9 t        |«      }d}||kD  }	|	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}	}y)z)Dead groups should get ~15% retest slots.rn   r  r‚   rD   r   Údr   é2   rJ   rà   r   r  )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr‘   Ú	dead_seenr“   r”   r•   N)r    r   r†   r   rè   Úsetrþ   Úaddr‘   r3   r4   r6   r7   r8   r5   r9   r:   )r;   r   r!   rÀ   r"  r
  r   r?   rœ   r�   r`   rž   s               r   Útest_retest_includes_deadz(TestPickGroups.test_retest_includes_deadI  s“  € ô �q“ò 	;ˆAÜ˜"  ! ˜gÔ&Ü˜1“Xò ;�Ø—‘  1 #˜w°¸�Õ:ñ;ð	;ô �q“ò 	;ˆAÜ˜"  ! ˜gÔ&ÜÔ.Ó/ò ;�Ø—‘  1 #˜w°¸�Õ:ñ;ð	;ð 	�‰Œô “Eˆ	Ü�r“ò 	1ˆAØ—^‘^ AÓ&ˆFØò 1�Ø�]Ñ# vÓ-Ø—M‘M ! J¡-Õ0ñ1ð	1ô
 �9‹~Ð! Ð!ˆ~ Ñ!×!×!Õ!ˆ~ ×!×!×!×!×!Ñ!Œs×!×!Ó!Œs×!×!×!×!×!Ò!�9×!×!Ó!�9×!×!Ô!ˆ~×!×!Ò! ×!×!×!×!×!×!Ô!r   c                ó   — |j                   }d} ||«      }g }||k(  }|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}}y )Nr‚   rX   )zQ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.pick_groups
}(%(py4)s)
} == %(py9)sr   r¬   r®   r–   )	rþ   r3   r4   r6   r7   r8   r5   r9   r:   )	r;   r   rQ   r_   rœ   r±   r²   r³   r´   s	            r   Útest_empty_poolzTestPickGroups.test_empty_pool_  sš   € Ø�~‰~Ð&˜aÐ&‰~˜aÓ Ð& BÐ&Ð  BÑ&×&×&Õ&Ð  B×&×&×&×&×&Ñ&ˆr×&×&Ó&ˆr×&×&Ô&ˆ~×&×&Ò&˜a×&×&Ò&Ð ×&×&Ò& B×&×&×&×&×&×&×&Ð&r   c                ó’  — t        d«      D ]  }t        |d|› �«       Œ |j                  d«      }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}}Œ„ y)z3When proven pool is empty, slots spill to untested.r   r  r‚   rX   r�   r‘   ré   r“   r”   r•   NrJ   rW   rZ   r[   r\   r]   r  )r;   r   r!   ré   r?   rœ   r�   r`   rž   r   r>   r_   rS   s                r   Útest_overflow_spillsz#TestPickGroups.test_overflow_spillsb  s   € ä�q“ò 	'ˆAÜ˜"  ! ˜gÕ&ð	'à—‘ Ó"ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××Óàò 	2ˆAØ�]Ñ#Ð1 zÐ1Ð# zÑ1×1×1Õ1Ð# z×1×1Ó1Ð#×1×1Ò1 z×1×1×1×1×1×1Ô1ñ	2r   c                óv  — |}|j                  ddd¬«       |j                  d«      }t        d„ |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}}y )Nr~   r   rn   r   c              3  ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w©r   r~   Nri   ©Ú.0r   s     r   ú	<genexpr>z9TestPickGroups.test_hit_rate_in_result.<locals>.<genexpr>p  ó   è ø€ Ò=˜ q¨¡}¸Ó'<”!Ñ=ùó   ‚�Úhit_rater·   rX   rZ   r[   r\   r]   ©r†   rþ   Únextr3   r4   r5   r9   r:   ©
r;   r"   r   ré   r~   r>   r_   r?   rS   r`   s
             r   Útest_hit_rate_in_resultz&TestPickGroups.test_hit_rate_in_resultl  s…   € ØˆØ
�‰�t Q¨QˆÔ/Ø—‘ Ó"ˆÜÑ=˜VÔ=Ó=ˆØ�*‰~Ð$ Ð$ˆ~ Ñ$×$×$Õ$ˆ~ ×$×$Ó$ˆ~×$×$Ò$ ×$×$×$×$×$×$Ô$r   c                óž  — |}|j                  ddd¬«       |j                  ddd¬«       |j                  d«      }t        d„ |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}}y )Nr~   r   r   r   c              3  ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­wr,  ri   r-  s     r   r/  z@TestPickGroups.test_scans_in_window_in_result.<locals>.<genexpr>x  r0  r1  Úscans_in_windowrn   rX   rZ   r[   r\   r]   r3  r5  s
             r   Útest_scans_in_window_in_resultz-TestPickGroups.test_scans_in_window_in_results  sœ   € ØˆØ
�‰�t Q¨QˆÔ/Ø
�‰�t Q¨QˆÔ/Ø—‘ Ó"ˆÜÑ=˜VÔ=Ó=ˆØÐ#Ñ$Ð)¨Ð)Ð$¨Ñ)×)×)Õ)Ð$¨×)×)Ó)Ð$×)×)Ò)¨×)×)×)×)×)×)Ô)r   c                ó$  — t        |ddd¬«       t        |ddd¬«       |j                  d«      }|D �ch c]  }|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}}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}}yc c}w )z8Groups from non-eligible categories shouldn't be picked.ró   rô   rD   rõ   Úe1r  r   r   r  r  r  r+   r.   r/   Nr'   r)   r  r  s	            r   Útest_non_eligible_excludedz)TestPickGroups.test_non_eligible_excluded{  sø   € ä�b˜$¨+¸qÕAÜ�b˜$¨,ÀÕBØ—‘ Ó"ˆØ&,Ö- ˆq�‹}Ð-ˆÐ-ØÐˆt˜3ˆ××Õˆt˜3××Óˆt×××××Ð˜3××Ó˜3××××××ÓØÐˆt�sˆ{××Õˆt�s××Óˆt×××××Ð�s××Ó�s××××××Ôùò .r  N)rf   rg   rh   rÿ   r  r  r  r%  r'  r)  r6  r:  r=  ri   r   r   rü   rü     s4   „ ò ò/ò,ò2ò"ò,'ò2ò%ò*ór   rü   c                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚTestRankingc                ó‚  — t        |d«       |j                  ddd¬«       t        |d«       t        |d«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        |j                  «       }|D �cg c]  }|d   ‘Œ	 }}g 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}}y c c}w )Nrì   r‚   rD   r   rð   rå   r   rJ   )rÛ   rW   rà   rX   ro   Ústatesrq   r.   r/   )r   r†   r    r   rè   Úrankingr3   r4   r6   r7   r8   r5   r9   r:   )
r;   r   rÀ   rB  r   rA  r?   rQ   r@   rA   s
             r   Útest_ranking_order_by_statez'TestRanking.test_ranking_order_by_state†  sæ   € Ü�b˜$ÔØ
�‰�t Q¨QˆÔ/Ü�b˜$ÔÜ�b˜$ÔÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à
�‰Œà—*‘*“,ˆØ,3Ö4 q�!�MÓ"Ð4ˆÐ4Ú7Ð7ˆvÐ7Ñ7×7×7Õ7ˆvÐ7×7×7×7×7×7Ñ7ˆv×7×7Ó7ˆv×7×7Ô7Ð7×7×7×7×7×7×7Ò7ùò 5s   ÂD<c                ó’  — t        |d«       |j                  ddd¬«       |j                  ddd¬«       |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}}y )NÚg1r   r   r9  rn   rX   rZ   r[   r\   r]   )r   r†   rB  r3   r4   r5   r9   r:   )r;   r   rB  r>   r_   r?   rS   r`   s           r   Ú%test_ranking_includes_scans_in_windowz1TestRanking.test_ranking_includes_scans_in_window“  s’   € Ü�b˜$ÔØ
�‰�t Q¨QˆÔ/Ø
�‰�t Q¨QˆÔ/Ø—*‘*“,ˆØ�q‰zÐ+Ñ,Ð1°Ð1Ð,°Ñ1×1×1Õ1Ð,°×1×1Ó1Ð,×1×1Ò1°×1×1×1×1×1×1Ô1r   c                óÒ  — t        |d«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        |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}}
y)z6Ranking should show dead groups too (not just active).rå   r   r   rD   rX   r�   r‘   rB  r“   r”   r•   NrJ   rà   rZ   r[   r\   r]   )r   r    r   r†   rè   rB  r‘   r3   r4   r6   r7   r8   r5   r9   r:   )r;   r   rÀ   rB  r?   rœ   r�   r`   rž   r>   r_   rS   s               r   Útest_ranking_shows_all_statesz)TestRanking.test_ranking_shows_all_statesš  s)  € ä�b˜$ÔÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à
�‰Œà—*‘*“,ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó Ø�q‰z˜-Ñ(Ð2¨FÐ2Ð(¨FÑ2×2×2Õ2Ð(¨F×2×2Ó2Ð(×2×2Ò2¨F×2×2×2×2×2×2Ô2r   N)rf   rg   rh   rC  rF  rH  ri   r   r   r?  r?  …  s   „ ò8ò2ó	3r   r?  c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚTestHardDeadc                ó˜  — t        |dd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        |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t        t        «      «      }	|	D �
ch c]  }
|
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}}yc c}
w )zHGroups with >=HARD_DEAD_SCANS and 0 lifetime queries are never retested.Úhd1rD   ræ   r   r   z6SELECT group_state FROM fb_groups WHERE group_id='hd1'rà   rX   rZ   r[   r\   r]   Nr   r  r  r  r+   r.   r/   )r   r    r   r†   rè   r   r   r^   r3   r4   r5   r9   r:   Ú_get_groups_by_stateÚlistr   r6   r7   r8   )r;   r   rÀ   r<   r>   r_   r?   rS   r`   Ú	dead_poolr   r  r@   rA   s                 r   Ú#test_hard_dead_excluded_from_retestz0TestHardDead.test_hard_dead_excluded_from_retest§  s7  € ä�b˜%¨Õ+ä”Ó'ò 	5ˆAØ�N‰N˜5¨!°!ˆNÕ4ð	5à
�‰ŒØ�g‰g�o‰oÐVÓWˆØ�|‰|‹~˜aÑ Ð* FÐ*Ð  FÑ*×*×*Õ*Ð  F×*×*Ó*Ð ×*×*Ò* F×*×*×*×*×*×*Ó*ð ×+Ñ+¨F´DÔ9LÓ4MÓNˆ	Ø&/Ö0 ˆq�‹}Ð0ˆÐ0ØÐˆu˜CÐ××Õˆu˜C××Óˆu×××××Ð˜C××Ó˜C××××××Ôùò 1s   ÄGc                óF  — t        |dd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        |j                  dt        t        «      «      }|D �ch c]  }|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}}yc c}w )z9Groups with <HARD_DEAD_SCANS still appear in retest pool.Úsd1rD   ræ   r   r   rà   r   r'   r)   r  r+   r.   r/   N)r   r    r   r†   rè   rM  rN  r   r3   r4   r5   r6   r7   r8   r9   r:   ©
r;   r   rÀ   rO  r   r  r>   r?   r@   rA   s
             r   Útest_soft_dead_still_retestedz*TestHardDead.test_soft_dead_still_retested¶  sÊ   € ä�b˜%¨Õ+ÜÔ*Ó+ò 	5ˆAØ�N‰N˜5¨!°!ˆNÕ4ð	5à
�‰Œà×+Ñ+¨F´DÔ9LÓ4MÓNˆ	Ø&/Ö0 ˆq�‹}Ð0ˆÐ0ØÐˆu˜ˆ|××Õˆu˜××Óˆu×××××Ð˜××Ó˜××××××Ôùò 1s   Á*Dc                ón  — t        |dd¬«       |j                  ddd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        |j                  dt        t        «      «      }|D �ch c]  }|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}}yc c}w )zCGroups with many scans but some lifetime queries are not hard-dead.Úmixed1rD   ræ   r   r   rà   r   r'   r)   r  r+   r.   r/   N)r   r†   r    r   rè   rM  rN  r   r3   r4   r5   r6   r7   r8   r9   r:   rS  s
             r   Ú/test_hard_dead_with_past_queries_still_retestedz<TestHardDead.test_hard_dead_with_past_queries_still_retestedÁ  sÛ   € ä�b˜(¨AÕ.Ø
�‰�x¨°ˆÔ3Ü”Ó'ò 	8ˆAØ�N‰N˜8¨Q°QˆNÕ7ð	8à
�‰Œà×+Ñ+¨F´DÔ9LÓ4MÓNˆ	Ø&/Ö0 ˆq�‹}Ð0ˆÐ0ØÐˆx˜3ˆ××Õˆx˜3××Óˆx×××××Ð˜3××Ó˜3××××××Ôùò 1s   Á>D2c           	     óü  — t        |dd¬«       t        |dd¬«       t        t        «      D ]  }|j                  ddd¬«       Œ |j	                  «        t        d«      D ]š  }|j                  d«      }|D ]‚  }|d	   }d}||k7  }|slt        j                  d
|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚dx}x}}Œ„ Œœ y)z+pick_groups never returns hard-dead groups.Úalive1rD   ræ   rL  r   r   é   r‚   r   )ú!=)z%(py1)s != %(py4)sr[   r\   r]   N)r   r    r   r†   rè   rþ   r3   r4   r5   r9   r:   )
r;   r   rÀ   r
  r   r>   r_   r?   rS   r`   s
             r   Útest_hard_dead_not_pickedz&TestHardDead.test_hard_dead_not_pickedÍ  sÉ   € ô 	�b˜(¨AÕ.Ü�b˜%¨Õ+Ü”Ó'ò 	5ˆAØ�N‰N˜5¨!°!ˆNÕ4ð	5à
�‰Œä�r“ò 	.ˆAØ—^‘^ AÓ&ˆFØò .�Ø˜‘}Ð-¨Ð-�}¨Ñ-×-×-Õ-�}¨×-×-Ó-�}×-×-Ò-¨×-×-×-×-×-×-Ô-ñ.ñ	.r   N)rf   rg   rh   rP  rT  rW  r\  ri   r   r   rJ  rJ  ¦  s   „ ò ò	ò
ó.r   rJ  c                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚTestPostsReturnedc                ó„  — |}|j                  d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}}y )Nr~   rn   rD   é   )r€   r�   Úposts_returnedú=SELECT posts_returned FROM group_scan_log WHERE group_id='g0'r   rX   rZ   r[   r\   r]   r…   r‹   s	            r   Útest_posts_returned_recordedz.TestPostsReturned.test_posts_returned_recordedÝ  sŠ   € ØˆØ
�‰�t Q¨Q¸rˆÔBØ�g‰g�o‰oØKó
ˆð �|‰|‹~˜aÑ Ð& BÐ&Ð  BÑ&×&×&Õ&Ð  B×&×&Ó&Ð ×&×&Ò& B×&×&×&×&×&×&Ô&r   c                ó‚  — |}|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}}y )
Nr~   r   r   rb  rX   rZ   r[   r\   r]   r…   r‹   s	            r   Ú!test_posts_returned_defaults_zeroz3TestPostsReturned.test_posts_returned_defaults_zeroå  sˆ   € ØˆØ
�‰�t Q¨QˆÔ/Ø�g‰g�o‰oØKó
ˆð �|‰|‹~˜aÑ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%Ó%Ð ×%×%Ò% A×%×%×%×%×%×%Ô%r   c                óÎ  — |j                   j                  d«      }|j                  «       D �ch c]  }|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}}y c c}w )
Nz!PRAGMA table_info(group_scan_log)rD   ra  r'   r)   rL   r+   r.   r/   r1   )	r;   r   r<   r=   rL   r>   r?   r@   rA   s	            r   Ú'test_scan_log_has_posts_returned_columnz9TestPostsReturned.test_scan_log_has_posts_returned_columní  s“   € Ø�g‰g�o‰oÐAÓBˆØ"%§,¡,£.Ö1˜3��A“Ð1ˆÐ1ØÐ'Ð 4Ð'×'×'Õ'Ð 4×'×'Ó'Ð×'×'×'×'×'Ð' 4×'×'Ó' 4×'×'×'×'×'×'Ô'ùò 2s   ®C"N)rf   rg   rh   rc  re  rg  ri   r   r   r^  r^  Ü  s   „ ò'ò&ó(r   r^  c                  ó   — e Zd Zd„ Zy)Ú	TestStatsc                ó  — t        |d«       |j                  ddd¬«       t        |d«       t        |d«       t        t        «      D ]  }|j                  ddd¬«       Œ |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   }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}}y )Nrì   rn   rD   r   rð   rå   r   Úby_staterÛ   rX   rZ   r[   r\   r]   rW   rà   )r   r†   r    r   rè   rv   r3   r4   r5   r9   r:   )	r;   r   rÀ   rv   r>   r_   r?   rS   r`   s	            r   Útest_by_statezTestStats.test_by_stateô  sr  € Ü�b˜$ÔØ
�‰�t Q¨QˆÔ/Ü�b˜$ÔÜ�b˜$ÔÜÔ*Ó+ò 	4ˆAØ�N‰N˜4¨°ˆNÕ3ð	4à
�‰Œà—‘“
ˆØ�ZÑ  Ñ*Ð/¨aÐ/Ð*¨aÑ/×/×/Õ/Ð*¨a×/×/Ó/Ð*×/×/Ò/¨a×/×/×/×/×/×/Ó/Ø�ZÑ  Ñ,Ð1°Ð1Ð,°Ñ1×1×1Õ1Ð,°×1×1Ó1Ð,×1×1Ò1°×1×1×1×1×1×1Ó1Ø�ZÑ  Ñ(Ð-¨AÐ-Ð(¨AÑ-×-×-Õ-Ð(¨A×-×-Ó-Ð(×-×-Ò-¨A×-×-×-×-×-×-Ô-r   N)rf   rg   rh   rl  ri   r   r   ri  ri  ó  s   „ ó.r   ri  )Nr  rD   )"Ú__doc__Ú
__future__r   Úbuiltinsr6   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter3   ÚcsvÚpathlibr   ÚpytestÚ!agent_samochodowy.ingestor.groupsr   r   r   r   Úfixturer   r   r"   r$   rk   r|   r¨   rÉ   rÒ   rã   rü   r?  rJ  r^  ri  ri   r   r   ú<module>rx     s×   ðÙ Rå "ç  „ ƒ
Ý ã ÷ó ð ‡�ñó ðóð ‡�ñó ð÷ñ ÷8ñ ÷@+3ñ +3÷\1ñ 1÷4ñ ÷"1ñ 1÷>8ñ 8÷vfñ f÷R3ñ 3÷B3.ñ 3.÷l(ñ (÷..ò .r   