
    OwgM                     \   d Z ddlm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	m
Z
mZmZmZmZ ddlmZmZmZ ddlmZmZmZmZmZ ddlmZmZmZ ddlZ G d	 d
e      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z%y)z#Tests of Beautiful Soup as a whole.    )	set_traceN)BeautifulSoupBeautifulStoneSoupGuessedAtParserWarningMarkupResemblesLocatorWarningdammit)builder_registryTreeBuilderParserRejectedMarkup)CommentSoupStrainerPYTHON_SPECIFIC_ENCODINGSTagNavigableString   )default_builderLXML_PRESENTSoupTestc                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestConstructorc                 `    d}| j                  |      }d|j                  j                  k(  sJ y )Nu   <h1>éé</h1>u   éésouph1stringselfdatar   s      J/var/www/horilla/myenv/lib/python3.12/site-packages/bs4/tests/test_soup.pytest_short_unicode_inputz(TestConstructor.test_short_unicode_input)   s*    yy'''    c                 `    d}| j                  |      }d|j                  j                  k(  sJ y )Nz<h1>foo bar</h1>zfoo barr   r   s      r   test_embedded_nullz"TestConstructor.test_embedded_null.   s*    "yyTWW^^+++r!   c                 p    dj                  d      }| j                  |dg      }d|j                  k(  sJ y )Nu   Räksmörgåsutf-8)exclude_encodingszwindows-1252)encoder   original_encoding)r   	utf8_datar   s      r   test_exclude_encodingsz&TestConstructor.test_exclude_encodings3   s:    #**73	yywiy@!7!7777r!   c                 x    G d dt               }t        dd      }t        j                  d      5  t	        dd|i|}d d d        t        j                  |      sJ t        d	      |j                  j                  k(  sJ d
|j                  j                  k(  sJ  |di |}t        j                  d      5 }t	        d|d      }d d d        t        d   j                        }|j                  d      sJ ||j                  k(  sJ ||j                  k(  sJ y # 1 sw Y   xY w# 1 sw Y   cxY w)Nc                   8    e Zd Zd Zd Zd Zd Zd ZexZZ	d Z
y)7TestConstructor.test_custom_builder_class.<locals>.Mockc                 X    || _         d| _        d| _        g | _        g | _        i | _        y )NTF)called_withis_xmlstore_line_numberscdata_list_attributespreserve_whitespace_tagsstring_containers)r   kwargss     r   __init__z@TestConstructor.test_custom_builder_class.<locals>.Mock.__init__<   s1    #) "*/'-/*02-)+&r!   c                      y N r   r   s     r   initialize_soupzGTestConstructor.test_custom_builder_class.<locals>.Mock.initialize_soupC       r!   c                     || _         y r8   )fed)r   markups     r   feedz<TestConstructor.test_custom_builder_class.<locals>.Mock.feedE   s	    !r!   c                      y r8   r9   r   s    r   resetz=TestConstructor.test_custom_builder_class.<locals>.Mock.resetG   r<   r!   c                      y r8   r9   )r   ignores     r   rE   z>TestConstructor.test_custom_builder_class.<locals>.Mock.ignoreI   r<   r!   c              ?      K   d y w)N)prepared markupzoriginal encodingzdeclared encodingzcontains replacement charactersr9   r   argsr5   s      r   prepare_markupzFTestConstructor.test_custom_builder_class.<locals>.Mock.prepare_markupL   s     tts   N)__name__
__module____qualname__r6   r;   r@   rC   rE   set_up_substitutionscan_be_empty_elementrJ   r9   r!   r   Mockr-   ;   s-    ,":@@ #7ur!   rP   valueT)varconvertEntitiesrecord builder)rR   rG   )rW   ignored_valuer   zCKeyword arguments to the BeautifulSoup constructor will be ignored.)rV   r9   )objectdictwarningscatch_warningsr   
isinstancerW   r/   r>   strmessage
startswith)r   rP   r5   r   rW   wmsgs          r   test_custom_builder_classz)TestConstructor.test_custom_builder_class8   s4   	u6 	u(  !	
 $$D1 	= <T<V<D	=$,,--- DLL$<$<<<< DLL$4$4444
 ..$$D1 	Q G4D	 !A$,,~~cddd$,,&&&,,,,,#	= 	=	 	s   D$?D0$D-0D9c                      G d dt               }d }dd l}t        j                  t              5 }t        d|       d d d        dt        j                        v sJ y # 1 sw Y   #xY w)Nc                       e Zd Zd Zy):TestConstructor.test_parser_markup_rejection.<locals>.Mockc                     t        d      )NzNope.)r   rH   s      r   r@   z?TestConstructor.test_parser_markup_rejection.<locals>.Mock.feedl   s    *733r!   N)rK   rL   rM   r@   r9   r!   r   rP   rf   k   s    4r!   rP   c              ?   <   K   t         d d df t         d d df y w)NF)r?   rH   s      r   rJ   zDTestConstructor.test_parser_markup_rejection.<locals>.prepare_markupo   s&      $e++$e++s   r   rV   )rW   zoThe markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.)r
   repytestraisesr   r   r^   rQ   )r   rP   rJ   ri   exc_infos        r   test_parser_markup_rejectionz,TestConstructor.test_parser_markup_rejectionh   s    	4; 	4	, 	]]/0 	,H"d+	, A  EH  IQ  IW  IW  EX  X  	X  X	, 	,s   A  A)c                    d}| j                  |      }|j                  }d|d   k(  sJ ddg|d   k(  sJ | j                  |t        d       }d|j                  d   k(  sJ ddiddifD ]W  }t        j                  d	
      5 }| j                  |d |      }d d d        |j                  }ddg|d   k(  sJ d|d   k(  rWJ  y # 1 sw Y   .xY w)Nz&<a id=" an id " class=" a class "></a>z an id idaclass)rW   multi_valued_attributesz	 a class *TrT   an)r   rp   r   r[   r\   )r   r?   r   rp   
switcheroora   s         r   test_cdata_list_attributesz*TestConstructor.test_cdata_list_attributes{   s    :yy  FFAdG###W~7+++
 yyRVyWdffWo---  ;d4 	-J((5 [ yyzyZ[ A$<1T7***!G*,,,	-[ [s   CC	c           	           G d dt                G d dt               G d dt              | j                  dt         t        t        i      }t	        fd	|j                         D              sJ y )
Nc                       e Zd Zy)9TestConstructor.test_replacement_classes.<locals>.TagPlusNrK   rL   rM   r9   r!   r   TagPlusry          r!   r{   c                       e Zd Zy)<TestConstructor.test_replacement_classes.<locals>.StringPlusNrz   r9   r!   r   
StringPlusr~      r|   r!   r   c                       e Zd Zy)=TestConstructor.test_replacement_classes.<locals>.CommentPlusNrz   r9   r!   r   CommentPlusr      r|   r!   r   z<a><b>foo</b>bar</a><!--whee-->)element_classesc              3   <   K   | ]  }t        |f        y wr8   )r]   ).0xr   r   r{   s     r   	<genexpr>z;TestConstructor.test_replacement_classes.<locals>.<genexpr>   s'      
 q7J<=
s   )r   r   r   r   allrecursiveChildGenerator)r   r   r   r   r{   s     @@@r   test_replacement_classesz(TestConstructor.test_replacement_classes   s}    	c 		 		' 	 yy-W  
  
113
 
 	
 
r!   c                 |    G d dt               } G d dt               }| j                  d||d      }t        |j                  j                  d   t               sJ t        |j
                  j                  d   |      sJ |j                  j                  D ]  }t        ||      rJ  g |j                  k(  sJ y )	Nc                       e Zd Zy)ATestConstructor.test_alternate_string_containers.<locals>.PStringNrz   r9   r!   r   PStringr      r|   r!   r   c                       e Zd Zy)ATestConstructor.test_alternate_string_containers.<locals>.BStringNrz   r9   r!   r   BStringr      r|   r!   r   z4<div>Hello.<p>Here is <b>some <i>bolded</i></b> text)bp)r4   r   )	r   r   r]   divcontentsr   r   stringsstring_container_stack)r   r   r   r   ss        r    test_alternate_string_containersz0TestConstructor.test_alternate_string_containers   s    	o 		o 	 yyB!  
 $((++A.@@@ $&&//!,g666  	*Aa)))	*
 T00000r!   N)rK   rL   rM   r    r#   r*   rc   rm   rv   r   r   r9   r!   r   r   r   '   s,    (
,
8
.-`X&-:
81r!   r   c                       e Zd Zej                  j                  dddg      d        Zej                  j                  deD  cg c]  }| c}} dgz         d        Zd Z	yc c}} w )	
TestOutputz!eventual_encoding,actual_encoding)r%   r%   )utf-16r   c                 j    | j                  d      }d|_        d| d|j                  |      k(  sJ y )N<tag></tag>Tz<?xml version="1.0" encoding="z"?>
<tag></tag>eventual_encoding)r   r0   decode)r   r   actual_encodingr   s       r   test_decode_xml_declarationz&TestOutput.test_decode_xml_declaration   sH     yy'00AAQR;;1B;CD 	E Dr!   r   Nc                 X    t        dd      }d|_        d|j                  |      k(  sJ y )Nr   html.parserTz!<?xml version="1.0"?>
<tag></tag>r   )r   r0   r   )r   r   r   s      r   Mtest_decode_xml_declaration_with_missing_or_python_internal_eventual_encodingzXTestOutput.test_decode_xml_declaration_with_missing_or_python_internal_eventual_encoding   s;     ]M:4;;1B;CD 	E Dr!   c                     | j                  d      }d|j                  d      k(  sJ d|j                  d      k(  sJ d|j                         k(  sJ d|j	                         k(  sJ y )Nr   s   <tag></tag>r%   )encodingz<tag>
</tag>
)r   r'   encode_contentsdecode_contentsprettifyr:   s     r   testzTestOutput.test   sr     yy'g!>>>>!5!5w!5!GGGG 4 4 6666 DMMO333r!   )
rK   rL   rM   rj   markparametrizer   r   r   r   )r   r   s   00r   r   r      s{    [[+ .
EE [[)BCAaCtfLEE4 Ds   	A#r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ej                  j                  d	g d
      d        Zej                  j                  d	g d      d        Zd Zd Zd Zd Zy)TestWarningsc                     |D ]1  }t        |j                  |      s|j                  t        k(  sJ |c S  t	        |d|      )Nz warning not found in )r]   r_   filename__file__	Exception)r   r[   clsra   s       r   _assert_warningzTestWarnings._assert_warning  sH     	A!))S)zzX---	 XFGGr!   c                     | j                  |t              }t        |j                        }|j	                  t
        j                  d d       sJ y )N<   )r   r   r^   r_   r`   r   NO_PARSER_SPECIFIED_WARNING)r   ra   warningr_   s       r   _assert_no_parser_specifiedz(TestWarnings._assert_no_parser_specified  sD    &&q*@Agoo&!!-"K"KCR"PQQQr!   c                     t        j                  d      5 }t        d      }d d d        | j                         y # 1 sw Y   xY wNTrT   <a><b></b></a>r[   r\   r   r   r   ra   r   s      r   #test_warning_if_no_parser_specifiedz0TestWarnings.test_warning_if_no_parser_specified  s@    $$D1 	3Q !12D	3((+	3 	3s	   =Ac                     t        j                  d      5 }t        dd      }d d d        | j                         y # 1 sw Y   xY w)NTrT   r   htmlr   r   s      r   *test_warning_if_parser_specified_too_vaguez7TestWarnings.test_warning_if_parser_specified_too_vague  sB    $$D1 	;Q !16:D	;((+	; 	;s	   >Ac                     t        j                  d      5 }| j                  d      }d d d        g k(  sJ y # 1 sw Y   xY wr   r[   r\   r   r   s      r   ,test_no_warning_if_explicit_parser_specifiedz9TestWarnings.test_no_warning_if_explicit_parser_specified  sA    $$D1 	/Q99-.D	/Qww	/ 	/s	   9Ac                     t        j                  d      5 }t        ddt        d            }d d d        | j	                  t
              }t        |j                        }d|v sJ d|v sJ d	j                         k(  sJ y # 1 sw Y   VxY w)
NTrT   r   r   r   )parseOnlyTheser   
parse_onlys   <b></b>)	r[   r\   r   r   r   DeprecationWarningr^   r_   r'   )r   ra   r   r   rb   s        r   )test_parseOnlyThese_renamed_to_parse_onlyz6TestWarnings.test_parseOnlyThese_renamed_to_parse_only"  s    $$D1 	Q  -+C0D	
 &&q*<='//"3&&&s"""T[[]***	 	s   BBc                 
   t        j                  d      5 }d}t        |dd      }d d d        | j                  t              }t        |j                        }d|v sJ d|v sJ dj                  k(  sJ y # 1 sw Y   RxY w)	NTrT   s   ér   utf8)fromEncodingr   from_encoding)r[   r\   r   r   r   r^   r_   r(   )r   ra   r   r   r   rb   s         r   *test_fromEncoding_renamed_to_from_encodingz7TestWarnings.test_fromEncoding_renamed_to_from_encoding.  s    $$D1 	QD m&D	
 &&q*<='//"$$$#%%%/////	 	s   A99Bc                     t        j                  t              5  | j                  dd       d d d        y # 1 sw Y   y xY w)Nz<a>T)no_such_argument)rj   rk   	TypeErrorr   rB   s    r   "test_unrecognized_keyword_argumentz/TestWarnings.test_unrecognized_keyword_argument:  s3    ]]9% 	4IIedI3	4 	4 	4s	   7A 	extension)zmarkup.htmlz
markup.htmzmarkup.HTMLz
markup.txtzmarkup.xhtmlz
markup.xmlz/home/user/filezc:\userilec                     t        j                  d      5 }t        d|z   d      }| j                  |t              }dt        |j                        v sJ 	 d d d        y # 1 sw Y   y xY w)NTrT   r?   r   zlooks more like a filenamer[   r\   r   r   r   r^   r_   )r   r   ra   r   r   s        r   test_resembles_filename_warningz,TestWarnings.test_resembles_filename_warning>  sh     $$D1 	HQ I!5}ED**1.KLG/3w3GGGG	H 	H 	Hs   ?A  A))
markuphtmlz
markup.comrV   z	markup.jsc                     t        j                  d      5 }| j                  d|z         }d d d        g k(  sJ y # 1 sw Y   xY w)NTrT   r?   r   )r   r   ra   r   s       r   "test_resembles_filename_no_warningz/TestWarnings.test_resembles_filename_no_warningK  sG     $$D1 	3Q99X	12D	3Qww	3 	3s	   <Ac                 $   d}t        j                  d      5 }t        |d      }d d d        | j                  t              }dt        |j                        v sJ |t        |j                        j                  d      vsJ y # 1 sw Y   axY w)Ns   http://www.crummybytes.com/TrT   r   looks more like a URLr   )r[   r\   r   r   r   r^   r_   r'   r   urlwarning_listr   r   s        r   test_url_warning_with_bytes_urlz,TestWarnings.test_url_warning_with_bytes_urlW  s    ,$$D1 	5\ m4D	5&&7
 '#goo*>>>>#goo.55f====	5 	5s   BBc                    d}t        j                  d      5 }t        |d      }d d d        | j                  t              }dt        |j                        v sJ |t        |j                        vsJ y # 1 sw Y   RxY w)Nzhttp://www.crummyunicode.com/TrT   r   r   r   r   s        r   !test_url_warning_with_unicode_urlz.TestWarnings.test_url_warning_with_unicode_urla  s    -$$D1 	5\ !m4D	5 &&7
 '#goo*>>>>#goo....	5 	5s   A77B c                     t        j                  d      5 }| j                  d      }d d d        t        d D              rJ y # 1 sw Y   xY w)NTrT   s$   http://www.crummybytes.com/ is greatc              3   J   K   | ]  }d t        |j                        v   ywr   Nr^   r_   r   ra   s     r   r   zETestWarnings.test_url_warning_with_bytes_and_space.<locals>.<genexpr>r  %      . /#aii.@ .   !#r[   r\   r   anyr   r   r   s      r   %test_url_warning_with_bytes_and_spacez2TestWarnings.test_url_warning_with_bytes_and_spacem  s`     $$D1 	F\99DED	F . ,. . 	. . .	F 	F   AAc                     t        j                  d      5 }| j                  d      }d d d        t        d D              rJ y # 1 sw Y   xY w)NTrT   z&http://www.crummyunicode.com/ is greatc              3   J   K   | ]  }d t        |j                        v   ywr   r   r   s     r   r   zGTestWarnings.test_url_warning_with_unicode_and_space.<locals>.<genexpr>x  r   r   r   r   s      r   'test_url_warning_with_unicode_and_spacez4TestWarnings.test_url_warning_with_unicode_and_spaceu  s^    $$D1 	G\99EFD	G . ,. . 	. . .	G 	Gr   N)rK   rL   rM   r   r   r   r   r   r   r   r   rj   r   r   r   r   r   r   r   r   r9   r!   r   r   r      s    HR
,
,


+
04 [[	K
H
H [[5	>
/..r!   r   c                       e Zd Zd Zy)TestSelectiveParsingc                 n    d}t        d      }| j                  ||      }|j                         dk(  sJ y )Nz&No<b>Yes</b><a>No<b>Yes <c>Yes</c></b>r   )r   s   <b>Yes</b><b>Yes <c>Yes</c></b>)r   r   r'   )r   r?   strainerr   s       r   test_parse_with_soupstrainerz1TestSelectiveParsing.test_parse_with_soupstrainer~  s8    9$yyHy5{{} BBBBr!   N)rK   rL   rM   r   r9   r!   r   r   r   |  s    Cr!   r   c                   d    e Zd ZdZd Zej                  j                  e d      d        Z	d Z
y)
TestNewTagz(Test the BeautifulSoup.new_tag() method.c                     | j                  d      }|j                  ddddi      }t        |t              sJ d|j                  k(  sJ t        dd      |j                  k(  sJ d |j                  k(  sJ y )NrV   foobaznameza name)barattrs)r   r   )r   new_tagr]   r   r   rZ   r   parent)r   r   r  s      r   test_new_tagzTestNewTag.test_new_tag  su    yy},,u%7I,J'3'''$$$H->>>w~~%%%r!   z-lxml not installed, cannot parse XML document)reasonc                     t        dd      }|j                  d      }|j                  d      }d|j                         k(  sJ d|j                         k(  sJ y )NrV   xmlbrr      <br/>s   <p/>r   r  r'   )r   xml_soupxml_brxml_ps       r   5test_xml_tag_inherits_self_closing_rules_from_builderz@TestNewTag.test_xml_tag_inherits_self_closing_rules_from_builder  sZ    
 !U+!!$'  % 6==?***%,,.(((r!   c                     t        dd      }|j                  d      }|j                  d      }d|j                         k(  sJ d|j                         k(  sJ y )NrV   r   r  r   r  s   <p></p>r	  )r   	html_souphtml_brhtml_ps       r   1test_tag_inherits_self_closing_rules_from_builderz<TestNewTag.test_tag_inherits_self_closing_rules_from_builder  sY    !"m4	##D)""3' 7>>++++V]]_,,,r!   N)rK   rL   rM   __doc__r  rj   r   skipifr   r  r  r9   r!   r   r   r     s@    2& [[>  )	)-r!   r   c                       e Zd ZdZd Zd Zy)TestNewStringz+Test the BeautifulSoup.new_string() method.c                 z    | j                  d      }|j                  d      }d|k(  sJ t        |t              sJ y NrV   r   )r   
new_stringr]   r   r   r   r   s      r   'test_new_string_creates_navigablestringz5TestNewString.test_new_string_creates_navigablestring  s9    yy}OOE"zz!_---r!   c                     | j                  d      }|j                  dt              }d|k(  sJ t        |t              sJ y r  )r   r  r   r]   r  s      r   3test_new_string_can_create_navigablestring_subclasszATestNewString.test_new_string_can_create_navigablestring_subclass  s;    yy}OOE7+zz!W%%%r!   N)rK   rL   rM   r  r  r  r9   r!   r   r  r    s    5.&r!   r  c                       e Zd Zd Zd Zy)
TestPicklec                     | j                  d      }t        j                  |      }t        j                  |      }d|j                  j
                  k(  sJ y )Nz<a>some markup</a>some markup)r   pickledumpsloadsrp   r   r   r   pickled	unpickleds       r   test_normal_picklezTestPickle.test_normal_pickle  sE    yy-.,,t$LL)		 2 2222r!   c                     | j                  d      }d |_        t        j                  |      }t        j                  |      }d|j
                  k(  sJ y )Nr!  )r   rW   r"  r#  r$  r   r%  s       r   test_pickle_with_no_builderz&TestPickle.test_pickle_with_no_builder  sI     yy',,t$LL)		 0 0000r!   N)rK   rL   rM   r(  r*  r9   r!   r   r  r    s    31r!   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestEncodingConversionc                 t    d| _         | j                   j                  d      | _        | j                  dk(  sJ y )NuU   <html><head><meta charset="utf-8"/></head><body><foo>Sacré bleu!</foo></body></html>r%   sU   <html><head><meta charset="utf-8"/></head><body><foo>Sacré bleu!</foo></body></html>)unicode_datar'   r)   rB   s    r   setup_methodz#TestEncodingConversion.setup_method  s8     U**11':~~!r!   c                 <   t         j                  }t        j                  t        j                         	 d }|t         _        d}| j                  |      }|j                         }t        |t              sJ || j                  |j                               k(  sJ |j                  j                         dk(  sJ 	 t        j                  t        j                         |t         _        y # t        j                  t        j                         |t         _        w xY w)Nc                      y r8   r9   )r^   s    r   noopz>TestEncodingConversion.test_ascii_in_unicode_out.<locals>.noop  s    r!   s   <foo>a</foo>r%   )r   chardet_dammitloggingdisableWARNINGr   r   r]   r^   document_forr(   lowerNOTSET)r   chardetr2  asciisoup_from_asciiunicode_outputs         r   test_ascii_in_unicode_outz0TestEncodingConversion.test_ascii_in_unicode_out  s     ''(	, %)F!#E"ii.O,335Nnc222!T%6%6u||~%FFFF"44::<GGGOOGNN+$+F! OOGNN+$+F!s   BC+ +0Dc                     | j                  | j                        }|j                         | j                  k(  sJ |j                  j                  dk(  sJ |j
                  d k(  sJ y Nu   Sacré bleu!)r   r.  r   r   r   r(   r   soup_from_unicodes     r   test_unicode_in_unicode_outz2TestEncodingConversion.test_unicode_in_unicode_out  se     !IId&7&78 '')T->->>>> $$++/???? 22d:::r!   c                     | j                  | j                        }|j                         | j                  k(  sJ |j                  j
                  dk(  sJ y r@  )r   r)   r   r.  r   r   )r   soup_from_utf8s     r   test_utf8_in_unicode_outz/TestEncodingConversion.test_utf8_in_unicode_out  sN     4>>2$$&$*;*;;;;!!((,<<<<r!   c                 z    | j                  | j                        }|j                  d      | j                  k(  sJ y )Nr%   )r   r.  r'   r)   rA  s     r   test_utf8_outz$TestEncodingConversion.test_utf8_out  s4     IId&7&78 ''0DNNBBBr!   N)rK   rL   rM   r/  r>  rC  rF  rH  r9   r!   r   r,  r,    s    @,(;=Cr!   r,  )&r  pdbr   r4  osr"  rj   systempfilebs4r   r   r   r   r   bs4.builderr	   r
   r   bs4.elementr   r   r   r   r   rV   r   r   r   r[   r   r   r   r   r   r  r  r,  r9   r!   r   <module>rP     s    )   	   
   
  
 l1h l1^&4 &4Rz.8 z.zC8 C -  -D&H &1 1$0CX 0Cr!   