
    ؾ.j
                    f    d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 dZ
dZddZdd	Zdd
ZddZdS )    )annotationsN)candidates_to_watchlist_entriesdedupe_candidatesmake_observation_candidatevalidate_candidate_addresswrite_discovery_report*0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbreturnNonec                     t          t          ddddd          } t          t                    du sJ | j        du sJ | j        d	k    sJ |                     dd
          }|t          d
ddddk    sJ d S )Ndummyunit_fixturez#https://example.invalid/leaderboardz dummy public leaderboard fixturez2026-06-14T00:00:00+00:00)addresslabelsource
source_urlreasondiscovered_atTFz?observation_candidate_only; third_party_source_not_ground_truthpublic_observation_1)enabledr   manual_discoveryz.read-only observation only; no copy permission)r   r   r   r   notes)r   DUMMY_Ar   enabled_default	risk_noteto_watchlist_entry)	candidateentrys     *tests/test_ctb_copy_candidate_discovery.pyAtest_candidate_validates_address_and_defaults_to_observation_onlyr!      s    *811  I &g..$6666$----"ccccc((=S(TTE'$A           c                     t          d          du sJ t          j        t                    5  t	          dddd           d d d            d S # 1 swxY w Y   d S )Nznot-an-addressFbadfixtureinvalidr   r   r   r   )r   pytestraises
ValueErrorr    r"   r     test_invalid_address_is_rejectedr,   *   s    %&6775@@@@	z	"	" n n"+;5QZclmmmmn n n n n n n n n n n n n n n n n ns   AAAc                    t          t          ddd          } t          t                                                              ddd          ddd	          }t          t          d
dd          }t          | ||g          }t          |dd          }d |D             t          t          gk    sJ t          |          dk    sJ |d         d         dk    sJ |d         d         du sJ d S )Nar%   firstr'   Xx   dupdupebsecondT)limitr   c                    g | ]	}|j         
S r+   )r   ).0r   s     r    
<listcomp>zKtest_dedupe_preserves_order_and_watchlist_entries_limit.<locals>.<listcomp>8   s    777)I777r"   r   r   r   r   )r   r   upperreplaceDUMMY_Br   r   len)r/   	duplicater6   dedupedentriess        r    7test_dedupe_preserves_order_and_watchlist_entries_limitrB   0   s   &wc)\cdddE*7==??3J3J3PSUV3W3W_dmv  @F  G  G  GI's9]efffF	6 :;;G-gQMMMG77w777GW;MMMMMw<<11:g"888881:i D((((((r"   c                "   t          t          ddd          }t          |g| dz  dz            }t          j        |                                          }|d         dk    sJ |d	         d
         d         t          k    sJ d|d         v sJ d S )Nr.   r%   r/   r'   runtimezcandidate_discovery.jsoncandidate_countr2   
candidatesr   r   zHyperliquid Info APIground_truth_note)r   r   r   jsonloads	read_text)tmp_pathr   targetpayloads       r    <test_discovery_report_writes_structured_payload_outside_reporN   >   s    *7#i`ghhhI#YKI1EHb1bccFj))++,,G$%****< #I.'9999!W-@%AAAAAAAr"   )r   r   )
__future__r   rH   r(   *src.ctb_copy.discovery.candidate_discoveryr   r   r   r   r   r   r=   r!   r,   rB   rN   r+   r"   r    <module>rQ      s    " " " " " "                
   .n n n n) ) ) )B B B B B Br"   