
    *j                       d Z ddlmZ ddlZddlmc mZ ddl	m
Z
 ddlZddlZddlmZmZmZ  e
e          j        j        dz  dz  dz  ZddZ G d dej                  ZddZej        j        d             Zej        j        d             Zej        j        d             Zej        j        d             Zej        j        d             Zej        j        d             Zej        j        d             Z ej        j        d             Z!ej        j        d             Z"ej        j        d             Z#d Z$d Z%dS ) u   Tests for compiler/sources/discover.py.

All offline — HTTP calls are intercepted with httpx.MockTransport using
canned fixture responses from tests/fixtures/http/discover/.
    )annotationsN)Path)SourceCandidatecandidates_to_yamldiscoverfixtureshttpr   namestrreturnbytesc                :    t           | z                                  S N)FIXTURE_DIR
read_bytes)r
   s    E/Users/jameslopez/projects/MentorCore/tests/compiler/test_discover.py_loadr      s    $**,,,    c                      e Zd ZdZddZdS )	_DiscoverTransportz,Routes requests to canned fixture responses.requesthttpx.Requestr   httpx.Responsec                  K   t          |j                  }d|v r'd|v r#t          j        dt	          d                    S d|v rd}t          j        d|          S d|v r#t          j        dt	          d	                    S d
|v r#t          j        dt	          d                    S d|v r#t          j        dt	          d                    S t          j        dd          S )Nzwikipedia.org/w/api.phpzlist=search   zwikipedia_search.json)contentzen.wikiquote.orgsA   <html><head></head><body>wgPageName Marcus Aurelius</body></html>zgutendex.comzgutendex_search.jsonzopenlibrary.org/searchzopen_library_search.jsonzitunes.apple.comzitunes_search.jsoni  s   {})r   urlhttpxResponser   )selfr   r   htmls       r   handle_async_requestz'_DiscoverTransport.handle_async_request    s      '+$++0D0D>#u5L/M/MNNNN$$WD>#t4444S  >#u5K/L/LMMMM#s**>#u5O/P/PQQQQ$$>#u5I/J/JKKKK~c51111r   N)r   r   r   r   )__name__
__module____qualname____doc__r"    r   r   r   r      s.        662 2 2 2 2 2r   r   httpx.AsyncClientc                 D    t          j        t                                S )N)	transport)r   AsyncClientr   r'   r   r   _mock_clientr,   2   s    '9';';<<<<r   c                 4  K   t                      4 d{V } t          d|            d{V }ddd          d{V  n# 1 d{V swxY w Y   t          |          }d}||k    }|st          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             }t          |          }|sd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}}dS )z8discover() returns a non-empty list of SourceCandidates.NMarcus Aureliusr   >z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenresultspy0py1py3py6assert %(py8)spy8c              3  @   K   | ]}t          |t                    V  d S r   )
isinstancer   .0cs     r   	<genexpr>z3test_discover_returns_candidates.<locals>.<genexpr>?   s,      ??!z!_--??????r   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr5   py2py4)r,   r   r2   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationrB   )
clientr3   @py_assert2@py_assert5@py_assert4@py_format7@py_format9@py_assert1@py_assert3@py_format5s
             r    test_discover_returns_candidatesrW   9   s      ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < <w<<!<!<!33ww<!??w????3????????????????3?????3?????????????????????????????????   A  
A
A
c                 *  K   t                      4 d {V } t          d|            d {V }d d d           d {V  n# 1 d {V swxY w Y   d |D             }d |D             }t          |          }|sd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}}d S )Nr.   c                    g | ]	}|j         
S r'   
origin_urlr=   s     r   
<listcomp>z1test_discover_finds_wikipedia.<locals>.<listcomp>F       ***QAL***r   c              3     K   | ]}d |v V  	dS )zwikipedia.orgNr'   r>   us     r   r@   z0test_discover_finds_wikipedia.<locals>.<genexpr>G   '      22!#222222r   rA   anyrC   
r,   r   rc   rH   rI   rF   rJ   rK   rL   rM   rN   r3   urlsrT   rU   rV   s         r   test_discover_finds_wikipediarg   B        ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < <**'***D22T2222322222222222222223222223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22222rX   c                   K   t                      4 d {V } t          d|            d {V }d d d           d {V  n# 1 d {V swxY w Y   d |D             }t          |          }d}||k    }|st          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 S )Nr.   c                (    g | ]}|j         d k    |S public-domainrightsr=   s     r   r]   z1test_discover_finds_gutenberg.<locals>.<listcomp>N   s$    GGG118+F+FQ+F+F+Fr   r   r/   r1   r2   public_domainr4   r9   r:   )r,   r   r2   rF   rG   rH   rI   rJ   rK   rL   rM   )rN   r3   ro   rO   rP   rQ   rR   rS   s           r   test_discover_finds_gutenbergrp   J   s     ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < <GGGGGM}!!!!!!!!!!!!!!!!!!!!!!!!3!!!!!3!!!!!!!!!!!!!}!!!!!}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rX   c                 *  K   t                      4 d {V } t          d|            d {V }d d d           d {V  n# 1 d {V swxY w Y   d |D             }d |D             }t          |          }|sd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}}d S )Nr.   c                    g | ]	}|j         
S r'   r[   r=   s     r   r]   z1test_discover_finds_wikiquote.<locals>.<listcomp>V   r^   r   c              3     K   | ]}d |v V  	dS )zwikiquote.orgNr'   r`   s     r   r@   z0test_discover_finds_wikiquote.<locals>.<genexpr>W   rb   r   rA   rc   rC   rd   re   s         r   test_discover_finds_wikiquotert   R   rh   rX   c            	       K   t                      4 d{V } t          d|            d{V }ddd          d{V  n# 1 d{V swxY w Y   d |D             }d t          |          D             }d t          |          D             }|r|rt          |          }t	          |          }||k     }|sxt          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
        |          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
        |          dz  }dd|iz  }	t          t          j        |	                    dx}x}}dS dS dS )z<public-domain sources should appear before fair-use-excerpt.Nr.   c                    g | ]	}|j         
S r'   rm   r=   s     r   r]   z<test_discover_public_domain_sorted_first.<locals>.<listcomp>_   s    ...AH...r   c                $    g | ]\  }}|d k    |S rk   r'   r>   irs      r   r]   z<test_discover_public_domain_sorted_first.<locals>.<listcomp>a   s&    PPP11;O;O!;O;O;Or   c                $    g | ]\  }}|d k    |S )fair-use-excerptr'   rx   s      r   r]   z<test_discover_public_domain_sorted_first.<locals>.<listcomp>b   s'    SSS11@R;R;R!;R;R;Rr   )<)zM%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} < %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}min
pd_indicesmax
fu_indices)r5   r6   r7   py5r8   r:   zassert %(py10)spy10)r,   r   	enumerater~   r   rF   rG   rH   rI   rJ   rK   rL   rM   )
rN   r3   rights_orderr   r   rO   @py_assert7rQ   rS   @py_format11s
             r   (test_discover_public_domain_sorted_firstr   Z   s      ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < <..g...LPP	, 7 7PPPJSS	, 7 7SSSJ 1j 1:0Z00000000000000000000000s00000s0000000000000:00000:00000000000000000000000000000000000Z00000Z000000000000000000000000000000000001 1 1 1rX   c                   K   t                      4 d{V } t          d|            d{V }ddd          d{V  n# 1 d{V swxY w Y   d |D             }t          |          }t          |          }t          |          }||k    }|st	          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	        |          dt          j                    v st	          j        t                    rt	          j	        t                    nd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}x}}dS )zNo duplicate URLs in results.Nr.   c                    g | ]	}|j         
S r'   r[   r=   s     r   r]   z3test_discover_deduplicates_urls.<locals>.<listcomp>l   r^   r   ==)zn%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py11)s
{%(py11)s = %(py5)s(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
})
}r2   rf   set)r5   r6   r7   r   r8   py7py9py11zassert %(py13)spy13)r,   r   r2   r   rF   rG   rH   rI   rJ   rK   rL   rM   )	rN   r3   rf   rO   @py_assert8@py_assert10rQ   @py_format12@py_format14s	            r   test_discover_deduplicates_urlsr   g   s      ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < <**'***Dt99&CII&I&9&&&&&&&&&&9&&&&&&&&&&&&3&&&&&3&&&&&&&&&&&&&t&&&&&t&&&&&&9&&&&&&&&&&&&&&&&&&&&&&&&&&&&&C&&&&&C&&&&&&&&&&&&&&&&&&&&&&&&I&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&rX   c            	     8  K   t                      4 d {V } t          d|            d {V }d d d           d {V  n# 1 d {V swxY w Y   |D ]}|j        }d}||v }|st          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        }|sxd	dt          j                    v st          j        |          rt          j        |          ndt          j        |          d
z  }t          t          j
        |                    d }|j        }|sxddt          j                    v st          j        |          rt          j        |          ndt          j        |          d
z  }t          t          j
        |                    d }|j        }d}||v }|st          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        }	t          |	t                     }
|
sd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        |	          dt          j                    v st          j        t                     rt          j        t                     ndt          j        |
          dz  }t          t          j
        |                    d x}	}
d S )Nr.   )book	interviewpodcastarticleletters)in)z3%(py2)s
{%(py2)s = %(py0)s.source_type
} in %(py5)sr?   )r5   rD   r   zassert %(py7)sr   z)assert %(py2)s
{%(py2)s = %(py0)s.title
})r5   rD   z.assert %(py2)s
{%(py2)s = %(py0)s.origin_url
})rl   r|   zpersonal-use)z.%(py2)s
{%(py2)s = %(py0)s.rights
} in %(py5)szSassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.approved
}, %(py4)s)
}r<   bool)r5   r6   r7   rE   r8   )r,   r   source_typerF   rG   rH   rI   rJ   rK   rL   rM   titler\   rn   approvedr<   r   )rN   r3   r?   rT   rQ   rU   @py_format6@py_format8@py_format3rO   rP   rR   s               r   1test_discover_all_candidates_have_required_fieldsr   p   s     ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < < , ,}V VV} VVVVVVVVVVV} VVVVVVVVVVVVVqVVVVVqVVVVVV}VVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVwwqqw||qq|xPPPxPPPPPPPPPPPxPPPPPPPPPPPPPqPPPPPqPPPPPPxPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP*+z*d+++++++++++++++z+++++z+++++++++++++!+++++!++++++*+++++++++++d+++++d+++++++++++++++++++++++++++, ,rX   c                   K   t                      4 d {V } t          d|            d {V }d d d           d {V  n# 1 d {V swxY w Y   d |D             }t          |          }|sd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}}d S )Nr.   c              3  &   K   | ]}|j          V  d S r   )r   r=   s     r   r@   zCtest_discover_candidates_not_approved_by_default.<locals>.<genexpr>   s&      //!1:~//////r   rA   rB   rC   )
r,   r   rB   rH   rI   rF   rJ   rK   rL   rM   )rN   r3   rT   rU   rV   s        r   0test_discover_candidates_not_approved_by_defaultr   |   s     ~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < <//w////3////////////////3/////3/////////////////////////////////rX   c            	       K   ddl } t                      4 d{V }t          d|           d{V }ddd          d{V  n# 1 d{V swxY w Y   t          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         }
t          |
t                    }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |
          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }t          t          j	        |                    dx}
}|d         }
t          |
          }t          |          }||k    }|sMt          j        d|fd||f          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |
          t          j        |          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        |          dz  }dd|iz  }t          t          j	        |                    dx}
x}x}}dS )z6Serialized YAML is valid and contains expected fields.r   Nr.   r
   r   z%(py1)s == %(py4)sr6   rE   assert %(py6)sr8   slugzmarcus-aureliussourcesz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r<   list)r5   rD   r7   r   )zN%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}r2   r3   )r5   rD   rE   r8   r   r   zassert %(py11)sr   )yamlr,   r   r   	safe_loadrF   rG   rK   rL   rM   r<   r   rH   rI   rJ   r2   )r   rN   r3   ymldata@py_assert0rU   rO   rV   rR   rT   rQ   r   r   rP   @py_format10r   s                    r   "test_candidates_to_yaml_roundtripsr      s      KKK~~ < < < < < < < !2F;;;;;;;;< < < < < < < < < < < < < < < < < < < < < < < < < < < .
8
8C>>#D<,,,<,,,,,,,,,,,<,,,,,,<,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,,,<,,,,,,,,,,,<,,,,,,<,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9o,:ot,,,,,,,,,,,,,,,:,,,,,:,,,,,,o,,,,,,,,,,,t,,,,,t,,,,,,,,,,,,,,,,,,,,,,,,,,I/3/3w<</<//////////<////////////3/////3/////////////////////3/////3/////////////w/////w//////<///////////////////////////////s   A
AAc                   K   ddl } t                      4 d{V }t          d|d           d{V }ddd          d{V  n# 1 d{V swxY w Y   t          d|          }|                     |          }t          d |d         D                       }|d         }|s:d	d
t          j        |          iz  }t          t          j	        |                    d}|d         }|s:d	d
t          j        |          iz  }t          t          j	        |                    d}t          d |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}
}	|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             }|sedddt          j                    v st          j        |          rt          j        |          ndiz  }t          t          j	        |                    d |D             }t          |          }	|	sd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}}	dS )zGApproved discovered sources should have the fields acquire_all expects.r   Nr.   F)include_podcastsc              3  2   K   | ]}|d          dk    |V  dS )
fetch_type	gutenbergNr'   r>   ss     r   r@   zDtest_candidates_to_yaml_sources_are_acquire_ready.<locals>.<genexpr>   0      RR11\?k3Q3QQ3Q3Q3Q3QRRr   r   idassert %(py1)sr6   gutenberg_idc              3  2   K   | ]}|d          dk    |V  dS )r   	wikipediaNr'   r   s     r   r@   zDtest_candidates_to_yaml_sources_are_acquire_ready.<locals>.<genexpr>   r   r   zwikipedia-marcus-aureliusr   r   r   r   r8   wikipedia_titlec                *    g | ]}|d          dk    |S )r   r   r'   r   s     r   r]   zEtest_candidates_to_yaml_sources_are_acquire_ready.<locals>.<listcomp>   s&    CCC!!L/U*B*BA*B*B*Br   zassert %(py0)sr5   rf   c              3  L   K   | ]}|d                               d          V   dS )r   zhttps://N)
startswithr   s     r   r@   zDtest_candidates_to_yaml_sources_are_acquire_ready.<locals>.<genexpr>   s4      ==1qx"":..======r   rA   rB   rC   )r   r,   r   r   r   nextrF   rK   rL   rM   rG   rH   rI   rJ   rB   )r   rN   r3   r   r   r   r   @py_format2r   rU   rO   rV   rR   rf   @py_format1rT   s                   r   1test_candidates_to_yaml_sources_are_acquire_readyr      s      KKK~~ T T T T T T T !2FUSSSSSSSSST T T T T T T T T T T T T T T T T T T T T T T T T T T .
8
8C>>#DRRYRRRRRIT???^$$$$$$$$$$$$$$$$$$$$$$$$$RRYRRRRRIT?999?99999999999?999999?99999999999999999999999999999999&'<+<<'+<<<<<<<<<<<'+<<<<<<'<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<CCtICCCDKKKKKKKKKKKK4KKKKK4KKKKKKKKKKKKKKKK======3================3=====3=================================s   A
AAc                 `   t          dg           } ddl}|                    |           }|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S )z1Slug is lowercase with hyphens, no special chars.zAyrton Sennar   Nr   zayrton-sennar   r   r   r   r8   )r   r   r   rF   rG   rK   rL   rM   )r   r   r   r   rU   rO   rV   rR   s           r   #test_candidates_to_yaml_slug_formatr      s    
^R
0
0CKKK>>#D<)>)<>))))))))))<>)))))<))))>)))))))))))))))))))))))))))))r   c                    t          ddddd          } |                                 }|d         }|s:dd	t          j        |          iz  }t	          t          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}}|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 S )Nr   Meditationszhttps://example.comrl   test)r   r   r\   rn   notesr   r   r6   r   r   r   r   r   r   r8   typern   r   F)is)z%(py1)s is %(py4)s)r   as_yaml_dictrF   rK   rL   rM   rG   )r?   dr   r   rU   rO   rV   rR   s           r   "test_source_candidate_as_yaml_dictr      s   (	 	 	A 	
AT7N7NNNNN7NNNNNNNNNNNNNNNN\?#e#?e##########?e#####?####e###########################U8,,,8,,,,,,,,,,,8,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,V9999X;)/);/))))))))));/)))));))))/)))))))))))))))))))))))))))Z=!E!=E!!!!!!!!!!=E!!!!!=!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r   )r
   r   r   r   )r   r(   )&r&   
__future__r   builtinsrH   _pytest.assertion.rewrite	assertionrewriterF   pathlibr   r   pytestcompiler.sources.discoverr   r   r   __file__parentr   r   AsyncBaseTransportr   r,   markasynciorW   rg   rp   rt   r   r   r   r   r   r   r   r   r'   r   r   <module>r      s    # " " " " "                                d8nn#*Z7&@:M- - - -2 2 2 2 21 2 2 2*= = = = @ @ @ 3 3 3 " " " 3 3 3 	1 	1 	1 ' ' ' , , , 0 0 0 0 0 0 > > >.* * *" " " " "r   