U
    w	dy,                     @   s<  d Z ddlmZmZ dZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZe dkrrddlmZ nBzddlmZ W n0 ek
r   eed ddlmZ Y nX dd	lmZ ejejejed
ZG dd de
jZG dd de
jZG dd de
jZG dd de
jZ edkr8e
!  dS )zUser Agent Parser Unit Tests.
Run:
# python -m user_agent_parser_test  (runs all the tests, takes awhile)
or like:
# python -m user_agent_parser_test ParseTest.testBrowserscopeStrings
    )unicode_literalsabsolute_importzslamm@google.com (Stephen Lamm)NPyPy)
SafeLoader)CSafeLoaderz[PyYaml C extension not available to run tests, this will result in dramatic tests slowdown.)user_agent_parserz../uap-corec                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )	ParseTestc                 C   s   |  tjtd d S )Nztests/test_ua.yamlrunUserAgentTestsFromYAMLospathjoinTEST_RESOURCES_DIRself r   D/tmp/pip-unpacked-wheel-zwpncm2w/ua_parser/user_agent_parser_test.pytestBrowserscopeStrings:   s    z!ParseTest.testBrowserscopeStringsc                 C   s   |  tjtd d S )Nztests/test_os.yamlrunOSTestsFromYAMLr   r   r   r   r   r   r   r   testBrowserscopeStringsOS?   s    z#ParseTest.testBrowserscopeStringsOSc                 C   s   |  tjtd d S )Nz'test_resources/additional_os_tests.yamlr   r   r   r   r   testStringsOSB   s    zParseTest.testStringsOSc                 C   s   |  tjtd d S )Nztests/test_device.yaml)runDeviceTestsFromYAMLr   r   r   r   r   r   r   r   testStringsDeviceG   s    zParseTest.testStringsDevicec                 C   s   |  tjtd d S )Nz.test_resources/firefox_user_agent_strings.yamlr	   r   r   r   r   testMozillaStringsL   s     zParseTest.testMozillaStringsc                 C   s   |  tjtd d S )Nz%test_resources/pgts_browser_list.yamlr	   r   r   r   r   testPGTSStringsY   s    zParseTest.testPGTSStringsc              	   C   sV   d}dddddddd d dd	d
ddd|d}t |}| ||d||| d S )NzpMozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; fr; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5,gzip(gfe),gzip(gfe)ZMacZApplefamilybrandmodelzMac OS X104r   majorminorpatchpatch_minorZFirefox35r   r#   r$   r%   )Zdevicer   
user_agentstringz%UA: {0}
 expected<{1}> != actual<{2}>)r   ParseassertEqualformat)r   user_agent_stringexpectedresultr   r   r   testParseAll^   s2    

  zParseTest.testParseAllc                 C   s   t tjt|}tj|td}|  |d D ]}|d }|d |d |d |d d}i }t	
|}| ||d	||d |d |d |d |d |d |d |d 	 | tt	jt	jd
 q0d S )NLoader
test_casesr/   r   r#   r$   r%   r)   zCUA: {0}
 expected<{1}, {2}, {3}, {4}> != actual<{5}, {6}, {7}, {8}>z?verify that the cache size never exceeds the configured setting)openr   r   r   r   yamlloadr   closer   ParseUserAgentr-   r.   ZassertLessEquallen_PARSE_CACHEMAX_CACHE_SIZEr   	file_nameZyamlFileZyamlContentsZ	test_caser/   r0   r1   r   r   r   r
   |   s@    
z#ParseTest.runUserAgentTestsFromYAMLc                 C   s   t tjt|}tj|td}|  |d D ]}|d }|d |d |d |d |d d	}t	
|}| ||d
||d |d |d |d |d |d |d |d |d |d  q0d S )Nr3   r5   r/   r   r#   r$   r%   r&   r"   zFUA: {0}
 expected<{1} {2} {3} {4} {5}> != actual<{6} {7} {8} {9} {10}>)r6   r   r   r   r   r7   r8   r   r9   r   ParseOSr-   r.   r>   r   r   r   r      s:    
zParseTest.runOSTestsFromYAMLc                 C   s   t tjt|}tj|td}|  |d D ]f}|d }|d |d |d d}t	
|}| ||d||d |d |d |d |d |d  q0d S )	Nr3   r5   r/   r   r   r   r   z5UA: {0}
 expected<{1} {2} {3}> != actual<{4} {5} {6}>)r6   r   r   r   r   r7   r8   r   r9   r   ParseDevicer-   r.   r>   r   r   r   r      s.    
z ParseTest.runDeviceTestsFromYAMLN)__name__
__module____qualname__r   r   r   r   r   r   r2   r
   r   r   r   r   r   r   r   9   s   (%r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )GetFiltersTestc                 C   s"   d}t j|d d}| i | d S )Nfoojs_user_agent_stringr   Z
GetFiltersr-   r   r/   filtersr   r   r   $testGetFiltersNoMatchesGiveEmptyDict   s     z3GetFiltersTest.testGetFiltersNoMatchesGiveEmptyDictc                 C   s&   d}t j|dd}| ddi| d S )NrF   barrG   rH   rI   rJ   r   r   r   testGetFiltersJsUaPassedThrough   s     z.GetFiltersTest.testGetFiltersJsUaPassedThroughc                 C   s*   d}t j|ddd}| ddd| d S )NzMozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)rM   rF   )rH   Zjs_user_agent_familyrI   rJ   r   r   r   *testGetFiltersJsUserAgentFamilyAndVersions   s       z9GetFiltersTest.testGetFiltersJsUserAgentFamilyAndVersionsN)rB   rC   rD   rL   rN   rO   r   r   r   r   rE      s   rE   c                       s@   e Zd Z fddZ fddZdd Zdd Zd	d
 Z  ZS )TestDeprecationWarningsc                    s   t t|   tdt dS )zIn Python 2.7, catch_warnings apparently does not do anything if
        the warning category is not active, whereas in 3(.6 and up) it
        seems to work out of the box.
        alwaysN)superrP   setUpwarningssimplefilterDeprecationWarningr   	__class__r   r   rS     s    zTestDeprecationWarnings.setUpc                    s   t   tt|   d S N)rT   resetwarningsrR   rP   tearDownr   rW   r   r   r[     s    z TestDeprecationWarnings.tearDownc              	   C   sH   t jdd}td W 5 Q R X | t|d | |d jt d S NTrecord    r   )rT   catch_warningsr   ZParseWithJSOverridesr-   r;   categoryrV   r   wsr   r   r   test_parser_deprecation  s    z/TestDeprecationWarnings.test_parser_deprecationc              	   C   sH   t jdd}td W 5 Q R X | t|d | |d jt d S r\   )rT   ra   r   ZPrettyr-   r;   rb   rV   rc   r   r   r   test_printer_deprecation  s    z0TestDeprecationWarnings.test_printer_deprecationc              
   C   s   t jdft jdft jdft jdffD ]^\}}t j  tjdd}|ddd W 5 Q R X | 	t
|| |D ]}| 	|jt qnq$d S )N   r`   Tr]   zsome random thing)Zjs_attribute)r   r,   r:   r@   rA   r<   clearrT   ra   r-   r;   rb   rV   )r   parsercountrd   wr   r   r   test_js_bits_deprecation"  s    
z0TestDeprecationWarnings.test_js_bits_deprecation)	rB   rC   rD   rS   r[   re   rf   rl   __classcell__r   r   rW   r   rP     s
   rP   c                   @   s>   e Zd Zeejdk ddd Zdd Zdd Z	d	d
 Z
dS )ErrTest)rg   z*bytes and str are not differentiated in P2c              	   C   s$   |  t td W 5 Q R X d S )N    assertRaises	TypeErrorr   r,   r   r   r   r   
test_bytes2  s    zErrTest.test_bytesc              	   C   s$   |  t td W 5 Q R X d S )Nr   rp   r   r   r   r   test_int9  s    zErrTest.test_intc              	   C   s$   |  t tg  W 5 Q R X d S rY   rp   r   r   r   r   	test_list=  s    zErrTest.test_listc              	   C   s$   |  t td W 5 Q R X d S )Nr   rp   r   r   r   r   
test_tupleA  s    zErrTest.test_tupleN)rB   rC   rD   unittestZskipIfsysversion_infors   rt   ru   rv   r   r   r   r   rn   1  s    
rn   __main__)"__doc__
__future__r   r   
__author__loggingr   platformrerx   rw   rT   r7   python_implementationr   r   ImportError	getLoggerrB   warningZ	ua_parserr   r   r   abspathdirname__file__r   ZTestCaser   rE   rP   rn   mainr   r   r   r   <module>   s>   
  1+
