
    ,hiN                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZ ddlmZ d	Z G d
 dej&                        Z G d dej&                        Z G d dej&                        Zd Zy)z;
Unit tests for the FetchTokeniser and FetchParser classes
    )unicode_literals)datetime)datetime_to_native)FixedOffset)parse_responseparse_message_listparse_fetch_response
ParseError)EnvelopeAddress)unittests   
c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd Zy)TestParseResponsec                 p    | j                  dd       | j                  dd       | j                  dd       y )N   FOOs	   F.O:-O_0;   \Seen_testselfs    f/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/imapclient/test/test_response_parser.pytest_unquotedzTestParseResponse.test_unquoted    s,    

66"

<.

9i(    c                 (    | j                  dd       y )Ns   "TEST"s   TESTr   r   s    r   test_stringzTestParseResponse.test_string%   s    

9g&r   c                 (    | j                  dd       y )Ns   45-   r   r   s    r   test_intzTestParseResponse.test_int(       

5"r   c                 (    | j                  dd        y )Ns   NILr   r   s    r   test_nilzTestParseResponse.test_nil+   s    

64 r   c                 (    | j                  dd       y )Ns   () r   r   s    r   test_empty_tuplez"TestParseResponse.test_empty_tuple.   r   r   c                 (    | j                  dd       y )Ns   (123 "foo" GeE)){      foos   GeEr   r   s    r   
test_tuplezTestParseResponse.test_tuple1   s    

%'<=r   c                 ,    | j                  ddd       y )Ns   1 (123 "foo"))   )r&   r'   F)wrapr   r   s    r   test_int_and_tuplez$TestParseResponse.test_int_and_tuple4   s    

#%7e
Dr   c                 (    | j                  dd       y )Ns   (123 "foo" ("more" NIL) 66))r&   r'   )   moreNB   r   r   s    r   test_nested_tuplez#TestParseResponse.test_nested_tuple7   s    

15	7r   c                 (    | j                  dd       y )Ns#   (123 "foo" ((0 1 2) "more" NIL) 66))r&   r'   ))r   r*      r.   Nr/   r   r   s    r   test_deeper_nest_tuplez(TestParseResponse.test_deeper_nest_tuple;   s    

9@	Br   c                 (    | j                  dd       y )Ns   ((FOO "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 23) ("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") "<hi.there>" "foo" "BASE64" 4554 73) "MIXED")))r      PLAIN)   CHARSET   US-ASCIINN   7BITi     )   TEXTr5   )r6   r7   s   NAMEs   cc.diffs
   <hi.there>r'   s   BASE64i  I      MIXEDr   r   s    r   test_complex_mixedz$TestParseResponse.test_complex_mixed?   s    

 DL	Mr   c                 (    | j                  dd       y )Ns   (UID 5 ENVELOPE ("internal_date" "subject" (("name" NIL "address1" "domain1.com")) ((NIL NIL "address2" "domain2.com")) (("name" NIL "address3" "domain3.com")) ((NIL NIL "address4" "domain4.com")) NIL NIL "<reply-to-id>" "<msg_id>")))   UID      ENVELOPE)
   internal_date   subject)   nameN   address1   domain1.com)NN   address2   domain2.com)rE   N   address3   domain3.com)NN   address4   domain4.comNN   <reply-to-id>   <msg_id>r   r   s    r   test_envelopeyz TestParseResponse.test_envelopeyG       

 ;#	$r   c                 (    | j                  dd       y )Ns   (UID 5 ENVELOPE ("internal_date" "subject with \"quotes\"" (("name" NIL "address1" "domain1.com")) ((NIL NIL "address2" "domain2.com")) (("name" NIL "address3" "domain3.com")) ((NIL NIL "address4" "domain4.com")) NIL NIL "<reply-to-id>" "<msg_id>")))r?   r@   rA   )
rB   s   subject with "quotes"rD   rH   rK   rN   NNrQ   rR   r   r   s    r   test_envelopey_quotedz'TestParseResponse.test_envelopey_quoted\   rT   r   c                 D    t        d      }| j                  d|fg|       y )N   012
abc def XYZ
s   {18}add_crlfr   )r   literal_texts     r   test_literalzTestParseResponse.test_literalq   s)    
 	

Wl+,l;r   c                 P    t        d      }d|fdg}| j                  |dd|f       y )NrX   s   (12 "foo" {18}   )   r'   rY   )r   r[   responses      r   test_literal_with_morez(TestParseResponse.test_literal_with_morex   s7    
 '5t<

8b&,78r   c                 p    | j                  dd       | j                  dd       | j                  dd       y )Ns   "\"foo bar\""s	   "foo bar"s   "foo \"bar\""s	   foo "bar"s
   "foo\\bar"s   foo\barr   r   s    r   test_quoted_specialsz&TestParseResponse.test_quoted_specials   s.    

$l3

$l3

>;/r   c                     | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       y )N   foo[bar rrr]s   "foo[bar rrr]"s   [foo bar]defs   (foo [bar rrr]))r'   s	   [bar rrr]s   (foo foo[bar rrr]))r'   re   r   r   s    r   test_square_bracketsz&TestParseResponse.test_square_brackets   sM    

?O4

$o6

?O4

%'=>

(*CDr   c                 (    | j                  dd       y )Ns   abc (1 2zTuple incomplete before "\(1 2"_test_parse_errorr   s    r   test_incomplete_tuplez'TestParseResponse.test_incomplete_tuple   s    {,MNr   c                 *    | j                  dgd       y )N)s   {99}s   abcz#Expecting literal of size 99, got 3rh   r   s    r   test_bad_literalz"TestParseResponse.test_bad_literal   s     12D	Fr   c                 (    | j                  dd       y )Ns	   "abc nextzNo closing '"'rh   r   s    r   test_bad_quotingz"TestParseResponse.test_bad_quoting   s    |-ABr   c                 n    |r|f}t        |t              s|g}t        |      }| j                  ||       y N)
isinstancelistr   assertSequenceEqual)r   to_parseexpectedr+   outputs        r   r   zTestParseResponse._test   s7     {H(D) zH)  2r   c                 b    t        |t              s|g}| j                  t        |t        |       y rp   )rq   rr   assertRaisesRegexr
   r   )r   rt   expected_msgs      r   ri   z#TestParseResponse._test_parse_error   s*    (D) zHz<-x	9r   N)T)__name__
__module____qualname__r   r   r   r!   r$   r(   r,   r0   r3   r=   rS   rV   r\   ra   rc   rf   rj   rl   rn   r   ri   r#   r   r   r   r      sr    )
'!>E7BM$*$*<90
EOFC39r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestParseMessageListc                 |    t        dg      }| j                  |g d       | j                  |j                  d        y )Ns   1 2 3r*   r2      r   rs   assertEqualmodseqr   outs     r   
test_basiczTestParseMessageList.test_basic   s2     (,  i0T*r   c                 >    | j                  t        dg      dg       y )N   4   )rs   r   r   s    r   test_one_idz TestParseMessageList.test_one_id   s      !3TF!;aSAr   c                 |    t        dg      }| j                  |g d       | j                  |j                  d       y )Ns   1 2 3 (modseq 999)r     r   r   s     r   test_modseqz TestParseMessageList.test_modseq   s4     "7!89  i0S)r   c                 |    t        dg      }| j                  |g d       | j                  |j                  d       y )Ns   1 2 3(modseq 999)r   r   r   r   s     r   test_modseq_no_spacez)TestParseMessageList.test_modseq_no_space   s4     "6!78  i0S)r   c                 |    t        dg      }| j                  |g d       | j                  |j                  d       y )Ns   1 2 (modseq 9) 3 4)r*   r2   r   r   	   r   r   s     r   test_modseq_interleavedz,TestParseMessageList.test_modseq_interleaved   s4     "7!89  l3Q'r   N)rz   r{   r|   r   r   r   r   r   r#   r   r   r~   r~      s    +
B*
*
(r   r~   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z y) TestParseFetchResponsec                 D    | j                  t        dg      dddii       y )Ns   4 ()r      SEQr   r	   r   s    r   r   z!TestParseFetchResponse.test_basic   s#    -wi81vqk:JKr   c                 <    | j                  t        d g      i        y rp   r   r   s    r   test_none_special_casez-TestParseFetchResponse.test_none_special_case   s    -tf5r:r   c                 <    | j                  t        t        dg       y )Ns   abc ()assertRaisesr
   r	   r   s    r   test_bad_msgidz%TestParseFetchResponse.test_bad_msgid       *&:YKHr   c                 <    | j                  t        t        dg       y )Ns   2 WHATr   r   s    r   test_bad_dataz$TestParseFetchResponse.test_bad_data   r   r   c                 <    | j                  t        t        dg       y )N   2r   r   s    r   test_missing_dataz(TestParseFetchResponse.test_missing_data   s    *&:TFCr   c                 H    | j                  t        dg      dddddi       y )Ns   23 (ABC 123 StUfF "hello")r9   r&   s   hello)s   ABCs   STUFFr   r   r   s    r   test_simple_pairsz(TestParseFetchResponse.test_simple_pairs   s1    -/L.MNs)1')+ ,	-r   c                 t    | j                  t        t        dg       | j                  t        t        dg       y )Ns   (ONE)s   (ONE TWO THREE)r   r   s    r   test_odd_pairsz%TestParseFetchResponse.test_odd_pairs   s.    *&:XJG*&:=O<PQr   c                     | j                  t        dg      dddii       | j                  t        dg      dddii       y )N   23 (UID 76)L   r   r9   s   23 (uiD 76)r   r   s    r   test_UIDzTestParseFetchResponse.test_UID   sL    -~.>?vrl+	--~.>?vrl+	-r   c                 J    | j                  t        dgd      ddddi       y )Nr   F)
uid_is_keyr9   r   )r?   r   r   r   s    r   test_not_uid_is_keyz*TestParseFetchResponse.test_not_uid_is_key   s/    -~.>5Qr')+ ,	-r   c                 <    | j                  t        t        dg       y )Ns   (UID X)r   r   s    r   test_bad_UIDz#TestParseFetchResponse.test_bad_UID   s    *&:ZLIr   c                 F    | j                  t        dg      ddddi       y )Ns   23 (FLAGS (\Seen Stuff))r9   )r   s   Stuff)r      FLAGSr   r   s    r   
test_FLAGSz!TestParseFetchResponse.test_FLAGS   s+    -/J.KLr5JKL	Nr   c                 P    | j                  t        ddg      ddddddd       y )	N   2 (FLAGS (Foo Bar)) s   7 (FLAGS (Baz Sneeve))s   Foos   Barr2   )r   r   )s   Bazs   Sneeve   )r2   r   r   r   s    r   test_multiple_messagesz-TestParseFetchResponse.test_multiple_messages   s:    -$&() +A6-q9
	r   c                 J    | j                  t        ddg      dddddi       y )Nr   s   2 (MODSEQ 4)r2   r   r   )r   r   s   MODSEQr   r   s    r   *test_same_message_appearing_multiple_timeszATestParseFetchResponse.test_same_message_appearing_multiple_times   s8     	-$ +Q1EF	Hr   c                 J    | j                  t        g d      dddddi       y )N))s   1 (RFC822.TEXT {4}   body)s    RFC822 {21}   Subject: test

bodyr^   r*   r   r   )s   RFC822.TEXT   RFC822r   r   r   s    r   test_literalsz$TestParseFetchResponse.test_literals   s4    - /5 6 g)E&') *	+r   c                 H    | j                  t        ddg      ddddi       y )N)s   1 (BODY[TEXT] {11}   Hi there.
r^   r*   r   )s
   BODY[TEXT]r   r   r   s    r   +test_literals_and_keys_with_square_bracketszBTestParseFetchResponse.test_literals_and_keys_with_square_brackets  s2    -/XZ^._`-=&') *	+r   c                 P    d}| j                  t        d|fdg      d|ddi       y )Ns9   Subject: A subject
From: Some one <someone@mail.com>

s6   123 (UID 31710 BODY[HEADER.FIELDS (from subject)] {57}r^   i{  r&   )s"   BODY[HEADER.FIELDS (FROM SUBJECT)]r   r   )r   header_texts     r   test_BODY_HEADER_FIELDSz.TestParseFetchResponse.test_BODY_HEADER_FIELDS  s>    X-GUW[\^K " #	$r   c                 j    | j                  d       | j                  d       | j                  d       y )Ns   BODY)check_BODYish_single_partcheck_BODYish_multipartcheck_BODYish_nested_multipartr   s    r   	test_BODYz TestParseFetchResponse.test_BODY  s,    &&w/$$W-++G4r   c                 H    | j                  d       | j                  d       y )Ns   BODYSTRUCTURE)r   r   r   s    r   test_BODYSTRUCTUREz)TestParseFetchResponse.test_BODYSTRUCTURE  s     &&'78++,<=r   c                     d|z   dz   }t        |g      }| j                  |d|dddii       | j                  |d   |   j                         y )Ns   123 (UID 317 s<   ("TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "7BIT" 16 1))i=  )r:   r5   r6   s   us-asciiNNr8      r*   r   r&   )r	   r   assertFalseis_multipartr   respTypetextparseds       r   r   z0TestParseFetchResponse.check_BODYish_single_part  sh    (*KL%tf-d"
 	 	X.;;<r   c                     d|z   dz   }t        |g      }| j                  |d|ddgdfddii       | j                  |d   |   j                         y )	Ns   123 (UID 269 s    (("TEXT" "HTML" ("CHARSET" "us-ascii") NIL NIL "QUOTED-PRINTABLE" 55 3)("TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "7BIT" 26 1) "MIXED"))i  )r:   s   HTMLr   NNs   QUOTED-PRINTABLE7   r   )r:   r5   r   NNr8      r*   r<   r   r&   )r	   r   
assertTruer   r   s       r   r   z.TestParseFetchResponse.check_BODYish_multipart(  s~    (* .X X &tf-qfh#% 	"
 	 	sH-::;r   c                 f   d|z   dz   }t        |g      }| j                  |d|ddgddd d d fdgd	d
d d d fddii       | j                  |d   |   j                         | j                  |d   |   d   d   j                         | j	                  |d   |   d   d   d   d   j                         y )Ns   1 (s  ((("text" "html" ("charset" "utf-8") NIL NIL "7bit" 97 3 NIL NIL NIL NIL)("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 62 3 NIL NIL NIL NIL)"alternative" ("boundary" "===============8211050864078048428==") NIL NIL NIL)("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 16 1 NIL ("attachment" ("filename" "attachment.txt")) NIL NIL) "mixed" ("boundary" "===============0373402508605428821==") NIL NIL NIL))r*   )   texts   htmls   charsets   utf-8NN   7bita   r   NNNN)r      plainr   NNr   >   r   NNNNs   alternative)   boundarys$   ===============8211050864078048428==)r   r   r   NNr   r   r*   N)s
   attachment)s   filenames   attachment.txtNNs   mixed)r   s$   ===============0373402508605428821==r   r   )r	   r   r   r   r   r   s       r   r   z5TestParseFetchResponse.check_BODYish_nested_multipart6  s     $\ \ &tf-!KK
 *+acgimosZ SUY[_ae A&
 " 	" 	q	(+889q	(+A.q1>>?8,Q/215a8EEFr   c                 P    d}| j                  t        d|fdg      d|ddi       y )Ns   01234567890123456789s   123 (UID 367 BODY[]<0> {20}r^   io  r&   )s	   BODY[]<0>r   r   )r   bodys     r   test_partial_fetchz)TestParseFetchResponse.test_partial_fetchV  s<    &-,d3T:<  !	"r   c                 ,   d}t        |gd      }| j                  |d   d   t        t        dddd	d
dt	        d            dt        dd dd      ft        d d dd      ft        dd dd      fd t        d d dd      t        dd dd      fd dd
             y )Ns%  1 (ENVELOPE ( "Sun, 24 Mar 2013 22:06:10 +0200" "subject" (("name" NIL "address1" "domain1.com")) ((NIL NIL "address2" "domain2.com")) (("name" NIL "address3" "domain3.com") NIL) NIL((NIL NIL "address4" "domain4.com") ("person" NIL "address4b" "domain4b.com")) NIL "<reply-to-id>" "<msg_id>"))Fnormalise_timesr*   rA   i  r            
   x   )tzinforC   rE   rF   rG   rI   rJ   rL   rM   rO   rP      person	   address4b   domain4b.comrQ   rR   )r	   rs   r   r   r   r   r   envelope_strrv   s      r   test_ENVELOPEz$TestParseFetchResponse.test_ENVELOPE]  s    ( &|neL  ;!7!)T1b"aK4DEWdK@BT4n=?WdK@BT4n=YlODF"K
"
	
r   c                 x    d}t        |gd      }| j                  |d   d   t        d dd d d d d d dd
             y )	NsP   1 (ENVELOPE ( NIL "subject" NIL NIL NIL NIL NIL NIL "<reply-to-id>" "<msg_id>"))Fr   r*   rA   rC   rQ   rR   r	   rs   r   r   s      r   test_ENVELOPE_with_no_datez1TestParseFetchResponse.test_ENVELOPE_with_no_date{  sZ    
 	 &|neL  ;!7!)k
"
	
r   c                 x    d}t        |gd      }| j                  |d   d   t        d dd d d d d d dd
             y )	NsR   1 (ENVELOPE ( "wtf" "subject" NIL NIL NIL NIL NIL NIL "<reply-to-id>" "<msg_id>"))Fr   r*   rA   rC   rQ   rR   r   r   s      r   test_ENVELOPE_with_invalid_datez6TestParseFetchResponse.test_ENVELOPE_with_invalid_date  sR    8 &|neL  ;!7!)$dD$k	"
	
r   c                    d}t        |gd      }| j                  |d   d   t        d dt        dd dd	      ft        d d d
d      ft        dd dd      t        dd dd      fd t        d d dd      t        dd dd      fd dd
             y )Ns7  1 (ENVELOPE ( NIL "subject" (("name" NIL "address1" "domain1.com") NIL) (NIL (NIL NIL "address2" "domain2.com")) (("name" NIL "address3" "domain3.com") NIL ("name" NIL "address3b" "domain3b.com")) NIL((NIL NIL "address4" "domain4.com") ("person" NIL "address4b" "domain4b.com")) NIL "<reply-to-id>" "<msg_id>"))Fr   r*   rA   rC   rE   rF   rG   rI   rJ   rL   rM   s	   address3bs   domain3b.comrO   rP   r   r   r   rQ   rR   )r	   rs   r   r   r   s      r   "test_ENVELOPE_with_empty_addressesz9TestParseFetchResponse.test_ENVELOPE_with_empty_addresses  s    	< &|neL  ;!7!)WdK@BT4n=?WdK@WdL/BDT4n=YlODF"K"
	
r   c                     t        dgd      }| j                  |d   d   t        dddd	d
d
dt        d                   y )Ns-   1 (INTERNALDATE " 9-Feb-2007 17:08:08 -0430")Fr   r*      INTERNALDATE  r2   r         r   )r	   r   r   r   r   s     r   test_INTERNALDATEz(TestParseFetchResponse.test_INTERNALDATE  sL    "=>!
 	F?#T1aQ1k,.GH	
r   c                     t        dg      }|d   d   }| j                  |j                  d u        t        t	        ddddddd	t        d
                  }| j                  ||       y )Ns-   3 (INTERNALDATE " 9-Feb-2007 17:08:08 -0430")r   r   r   r2   r   r   r   r   r  )r	   r   r   r   r   r   r   )r   rv   dtexpected_dts       r   test_INTERNALDATE_normalisedz3TestParseFetchResponse.test_INTERNALDATE_normalised  si    %'W&XYAY'		T)*(T1aQ1k,.GHJ[)r   c                     | j                  t        ddg      dt        t        ddddddd	t	        d
                  dddi       y )N)s8   1 (INTERNALDATE " 9-Feb-2007 17:08:08 +0100" RFC822 {21}r   r^   r*   r   r2   r   r   r   r   <   r   )r   r   r   )r   r	   r   r   r   r   s    r   test_mixed_typesz'TestParseFetchResponse.test_mixed_types  s`    - 0
 /  !3HT1aQPQSTVabdVe4f!g7
		r   c           
      <   | j                  t        t        dd dd            d       | j                  t        t        dd dd            d       | j                  t        t        dd d	d             d
       | j                  t        t        d d d d	            d	       y )Ns	   Mary Janes   marys   jane.orgzMary Jane <mary@jane.org>z	Mary Janemaryzjane.org	Anonymouszundisclosed-recipientsz"Anonymous <undisclosed-recipients>)r   strr   r   s    r   test_Address_strz'TestParseFetchResponse.test_Address_str  s    W\4+NO4	6 	W[$
KL4	6 	W[$8PRVWX=	? 	WT47OPQ1	3r   N)!rz   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r#   r   r   r   r      s    L;IID-R--
JNH++
$5
>
=<G@"
<
>
$
:
*
3r   r   c                 V    t         j                  | j                               t         z   S rp   )CRLFjoin
splitlines)r   s    r   rZ   rZ     s    99T__&'$..r   N)__doc__
__future__r   r   imapclient.datetime_utilr   imapclient.fixed_offsetr   imapclient.response_parserr   r   r	   r
   imapclient.response_typesr   r   imapclient.test.utilr   r  TestCaser   r~   r   rZ   r#   r   r   <module>r     sr   
 (  7 /  8 )
 E9)) E9P(8,, (6q3X.. q3j	/r   