
    -HVjN                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ  G d d      Z G d	 d
      Zd ZdkdZdZdZdddddgdddddddddddddgd ed      dd d!d"dd#d$d%gd&dd'ddd(dd)d*ddd+ddd,dd-d.dgdd/d0 ed1      dd2d3d/d4 ed5      id2d6d7d8d9dgd: ee      d;d<d=d>d? ee      d;d2gd@d!gdAZ G dB dC      Z G dD dE      Z  G dF dG      Z! G dH dI      Z" G dJ dK      Z# G dL dM      Z$ edNdOdPdQd e edRS            T      Z%dldUZ&dV Z'dW Z(dX Z)dY Z*dZ Z+d[ Z,d\ Z-d] Z.d^ Z/d_ Z0d` Z1da Z2db Z3dc Z4dd Z5dmdeZ6df Z7dg Z8dh Z9 G di dj      Z:y)nu  Email reader card tests — the thread engine (voice/mail_view.py), the Gmail
thread reader (voice/gmail_control.py), the IMAP one (voice/email_control.py)
and the HUD→engine contract (control/email_action.json, applied by
ControlWatcher._email_action). The JSON payloads here are EXACTLY what the Mac
HUD's EmailPanel writes, so these tests pin the contract between the Swift card
and the Python engine. No network, no HUD, no audio (fakes throughout).

Run:  .venv/bin/python -m pytest test_mail_card.py -q
    )annotationsN)datetime	timedeltatimezone)EmailMessage)email_controlgmail_controlc                      e Zd Zd Zd Zy)	FakeInboxc                    g | _         y N)notesselfs    </Users/ahmed/devFolder/Ultron/claude-voice/test_mail_card.py__init__zFakeInbox.__init__   s	    
    c                :    | j                   j                  |       y r   )r   append)r   notes     r   
put_nowaitzFakeInbox.put_nowait   s    

$r   N)__name__
__module____qualname__r   r    r   r   r   r      s     r   r   c                      e Zd Zd Zy)FakeAppc                "    t               | _        y r   )r   inboxr   s    r   r   zFakeApp.__init__!   s    [
r   N)r   r   r   r   r   r   r   r   r       s    !r   r   c                 ~    t         j                  j                  t         j                        } t               | _        | S )uZ   A ControlWatcher with no __init__ side effects — just enough to drive
    _email_action.)controlControlWatcher__new__r   app)ws    r   make_watcherr&   %   s.     	&&w'='=>AIAEHr   c                    t        | t              r| j                         n| }t        j                  |      j                         j                  d      S )N=)
isinstancestrencodebase64urlsafe_b64encodedecoderstrip)sbs     r   _b64ur2   -   s=     C(
aA##A&--/66s;;r   s   PNG

-fake-s   %PDF-fake-quoteT1M21752400000000SENTz
text/plainFromz+Ahmed <ahmed.alrajeh@alrugaibfurniture.com>)namevalueToElie <elie@example.com>SubjectzRe: Statue quoteDatezSun, 13 Jul 2026 12:00:00 +0300	   
Looks goodsizedata)mimeTypeheadersbody)idthreadIdinternalDatelabelIdspayloadM11752300000000INBOXUNREADzmultipart/mixedzElie Haddad <elie@example.com>#ahmed.alrajeh@alrugaibfurniture.comCcsara@example.comStatue quotezSat, 12 Jul 2026 14:02:11 +0300
Message-IDz<m1@example.com>    zHi Ahmed, see)rC   filenamerE   z	text/htmlrB   z<div onclick="steal()">Hi <b>Ahmed</b><script>alert(1)</script><img src="cid:logo1"><img src="https://track.me/p.gif"><a href="javascript:evil()">x</a><a href="https://reval.studio">site</a></div>	image/pngzlogo.pngz
Content-IDz<logo1>ALOGO)attachmentIdrA   )rC   rV   rD   rE   application/pdfquote_v2.pdfAPDF)rC   rD   parts)rF   messagesc                      e Zd Zd Zd Zy)_Execc                    || _         y r   _d)r   rB   s     r   r   z_Exec.__init__n   s	    r   c                    | j                   S r   rb   r   s    r   executez_Exec.executeq   s    wwr   N)r   r   r   r   re   r   r   r   r`   r`   m   s    r   r`   c                      e Zd ZddZy)_AttsNc                b    t         t        d|   }t        t        |      t	        |      d      S )N)rX   r\   r@   )PNGPDFr`   lenr2   )r   userId	messageIdrF   blobs        r   getz	_Atts.getv   s)    c*2.c$it=>>r   NNNr   r   r   ro   r   r   r   rg   rg   u   s    ?r   rg   c                  0    e Zd Zd ZddZddZd Zd	dZy)
	_Messagesc                    || _         y r   svcr   rv   s     r   r   z_Messages.__init__|   	    r   Nc                n    | j                   j                  j                  |       t        ddddgi      S )Nr^   r4   r3   )rF   rG   )rv   queriesr   r`   )r   rl   q
maxResultss       r   listz_Messages.list   s2    "j$D#A"BCDDr   c                d    t         d   D ]  }|d   |k(  st        |      c S  t        d|       )Nr^   rF   zno message )THREADr`   RuntimeError)r   rl   rF   formatmetadataHeadersms         r   ro   z_Messages.get   s9    
#Aw"}Qx $ [-..r   c                    t               S r   )rg   r   s    r   attachmentsz_Messages.attachments   s	    wr   c                f    | j                   j                  j                  |       t        ddi      S )NrF   SENT1)rv   sentr   r`   )r   rl   rE   s      r   sendz_Messages.send   s'    T"dG_%%r   rp   )NNNN)NN)r   r   r   r   r}   ro   r   r   r   r   r   rs   rs   {   s    E/&r   rs   c                      e Zd ZddZy)_ThreadsNc                N    |t         d   k7  rt        d      t        t               S )NrF   znot a thread id)r   r   r`   )r   rl   rF   r   s       r   ro   z_Threads.get   s$    011V}r   rp   rq   r   r   r   r   r      s    r   r   c                  &    e Zd Zd Zd Zd ZddZy)_Usersc                    || _         y r   ru   rw   s     r   r   z_Users.__init__   rx   r   c                ,    t        | j                        S r   )rs   rv   r   s    r   r^   z_Users.messages   s    ""r   c                    t               S r   )r   r   s    r   threadsz_Users.threads   s
    zr   Nc                    t        ddi      S )NemailAddressrO   )r`   )r   rl   s     r   
getProfilez_Users.getProfile   s    n&KLMMr   r   )r   r   r   r   r^   r   r   r   r   r   r   r      s    #Nr   r   c                      e Zd Zd Zd Zy)	FakeGmailc                     g | _         g | _        y r   )r   rz   r   s    r   r   zFakeGmail.__init__   s    	r   c                    t        |       S r   )r   r   s    r   userszFakeGmail.users   s    d|r   N)r   r   r   r   r   r   r   r   r   r      s    r   r           
      )hourstzinfoc                   t               }|dft        j                  d<   t        j                  j                          t        j                  j                          g | j                  t        dfd       | j                  t        dd        | j                  dd       | j                  t        d	d
        || j                  t        d|dz         |fS )z>Fake Gmail service in the account cache + captured HUD events.rO   workemitc                *    j                  | |f      S r   r   )etyperB   eventss     r   <lambda>zfresh.<locals>.<lambda>   s    fmmUDM.Jr   _nowc                     t         S r   NOWr   r   r   r   zfresh.<locals>.<lambda>       3r   EMAIL_ADDRESSahmad@revalstudio.com_accountc                     y)Nr   r   )as    r   r   zfresh.<locals>.<lambda>   s    r   ATT_ROOTr   )	r   r	   _SVC	mail_view_THREADSclear_ORDERsetattrsetenv)monkeypatchtmp_pathrv   r   s      @r   freshr      s    
+C"%'L!MMvF	6JL	6;7(?@	:/?@Iz8m3KL;r   c                   t        |       \  }}t        j                  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
   }	g }
|	d   }d}||k(  }|}|r|	d   }d}||k(  }|}|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }|
j                  |       |r_t        j                  dfdf      t        j
                  |      t        j
                  |      dz  }dd|iz  }|
j                  |       t        j                  |
d      i z  }dd|iz  }t        t        j                  |            d x}x}
x}x}x}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   f}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#   }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(   }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,   }|j                  }d-} ||      }|std.t        j
                  |      t        j
                  |      t        j
                  |      t        j
                  |      d/z  }t        t        j                  |            d x}x}x}}|d0   D cg c]  }|d1   |d2   |d3   |d4   f }}d5d6t        t              d7fg}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}|d0   d   d8   }d9}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}|d0   }g }||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}g }
|d:   }d7}||k(  }|}|r|d,   }d;}||k(  }|}|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }|
j                  |       |r_t        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }|
j                  |       t        j                  |
d      i z  }dd|iz  }t        t        j                  |            d x}x}
x}x}x}x}x}}g }
d<}||v }|}|rd=}||v }|}|sXt        j                  d>|fd?||f      t        j
                  |      d@t        j                         v st        j                  |      rt        j
                  |      nd@dAz  }dBdC|iz  }|
j                  |       |rt        j                  d>fdD|f      t        j
                  |      d@t        j                         v st        j                  |      rt        j
                  |      nd@dEz  }dFdG|iz  }|
j                  |       t        j                  |
d      i z  }dHdI|iz  }t        t        j                  |            d x}x}
x}x}x}}y c c}w )JN	from:elier   r   email_thread==z%(py1)s == %(py4)spy1py4assert %(py6)spy6   	thread_idr3   accountz%(py3)s == %(py6)spy3r   %(py8)spy8z%(py11)s == %(py14)spy11py14%(py16)spy16assert %(py19)spy19subjectrR   r^   msg_id)rK   r4   	from_namezElie Haddad	from_addrelie@example.comccrQ   outgoingFis)z%(py1)s is %(py4)sTdatez2026-07-12T14:02:11+03:00
date_human	Sun 14:02	body_textzHi AhmedzLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
}r   r   py5py7r   rV   mimerA   pathr[   rZ   rT   att_idr\   	body_htmlr?   z
2 messagesz1 attachmentinz%(py3)s in %(py5)soutr   r   %(py7)sr   )z%(py10)s in %(py12)spy10py12%(py14)sr   assert %(py17)spy17)r   r   show
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   _format_boolop
startswithrk   rj   @py_builtinslocals_should_repr_global_name)r   _svcr   r   @py_assert0@py_assert3@py_assert2@py_format5@py_format7ev@py_assert1@py_assert5@py_assert4@py_assert10@py_assert13@py_assert12@py_format9@py_format15@py_format17@py_format18@py_format20m1m2@py_assert6@py_format8r   @py_assert9@py_assert11@py_format6@py_format13@py_format16s                                  r   ?test_thread_event_is_oldest_first_with_outgoing_and_attachmentsr!     sm   %LD&
..f
-C!9Q<)>)<>))))<>)))<)))>)))))))	1B>2k?>d>?d">r)}>>}'>>>>?d>>>?>>>d>>>>>>>}>>>}>>>>>>>>>>>>>>>>>i=*N*=N****=N***=***N*******
^FBxL"X,'7<7'<7777'<777'777<7777777k?+m+?m++++?m+++?+++m+++++++k?000?00000?0000?00000000000d8)))8)))))8))))8)))))))))))j>"U">U"""">U""">"""U"""""""j>!T!>T!!!!>T!!!>!!!T!!!!!!!f:444:44444:4444:44444444444l*{*{****{******{*******k?1?%%1j1%j11111?111%111j1111111111 &(& z]AfIqy!F)<&; (	*CHb9,;; (,;; ;):):; (,;; ;1:( ; ;1:,;; ; ; ;':':; ; mQ)3V3)V3333)V333)333V3333333m"""""""""""""""""""D2k?DbD?b DR_DD_%DDDD?bDDD?DDDbDDDDDDD_DDD_DDDDDDDDDDDDDDDDD8<8<38>8>S#88888<3888<888888388838888888>S888>888888S888S88888888888888(s   m%c                f   | j                  t        dd        t        j                  }t        j                  }d}d}d}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t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}x}	x}}
t        j                  }d}d}d}d}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t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}x}	x}x}}t        j                  }d}d}d}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t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}x}	x}}
t        j                  }d}d}d }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t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}x}	x}}
y)"uB   The HUD just prints date_human — every bucket is formatted here.r   c                     t         S r   r   r   r   r   r   z=test_date_human_is_riyadh_and_pre_formatted.<locals>.<lambda>   r   r   r   r   r      r   r   z11:00r   )z%(py18)s
{%(py18)s = %(py2)s
{%(py2)s = %(py0)s._human
}(%(py16)s
{%(py16)s = %(py3)s(%(py5)s, %(py7)s, %(py9)s, %(py11)s, %(py13)s, tzinfo=%(py14)s)
})
} == %(py21)sr   r   utc)py0py2r   r   r   py9r   py13r   r   py18py21zassert %(py23)spy23N         r   )z%(py20)s
{%(py20)s = %(py2)s
{%(py2)s = %(py0)s._human
}(%(py18)s
{%(py18)s = %(py3)s(%(py5)s, %(py7)s, %(py9)s, %(py11)s, %(py13)s, %(py15)s, tzinfo=%(py16)s)
})
} == %(py23)s)r&  r'  r   r   r   r(  r   r)  py15r   r*  py20r,  assert %(py25)spy25r         z03 Feb 09:30i  r   z01 Dec 2024)r   r   r   r%  _humanr   r   r   r  r  r  r   r   r   )r   r%  r  r  r  @py_assert8r  r  @py_assert15@py_assert17@py_assert20@py_assert19@py_format22@py_format24@py_assert14@py_assert22@py_assert21@py_format26s                     r   +test_date_human_is_riyadh_and_pre_formattedrB     s   	6;7
,,COTO1ObO!OQOHT1b!QsCOCDOODOOOODOOOOOO9OOO9OOOOOOOOOHOOOHOOOTOOO1OOObOOO!OOOQOOOOOOsOOOsOOOCOOODOOOOOOOOOOOO EEEE E"#E%'Eq"b!R4E46 E9DE 69DE E E3D3DE 69DE E>DfE E,D,D  E E;D9  E E;D9  E E>DfE E,D,DE E;D9E E;D9E E;D9qE E;D9"E E;D9bE E;D9!E E;D9RE E>DfE E,D,DE E;D9E E;D94E E;D96 E E;D9E E E E1D1DE E E E  CCCCC "Cq!Q3/C/1 C4BC 14BC C C1B1BC 14BC C<BFC C*B*B  C C9B  C C9B  C C<BFC C*B*BC C9BC C9BC C9BqC C9B!C C9BQC C9BC C<BFC C*B*B3C C9B3C C9B/C C9B1 C C9BNC C C C/B/BC C C C  BBBBB!"Br1a3/B/1 B4AB 14AB B B0A0AB 14AB B;A6B B)A)A  B B8A	  B B8A	  B B;A6B B)A)AB B8A	B B8A	B B8A	rB B8A	1B B8A	aB B8A	B B;A6B B)A)A3B B8A	3B B8A	/B B8A	1 B B8A	MB B B B.A.AB B B Br   c                   t        |       \  }}t        j                  d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 	cg c]  }	|	d   	 }}	ddg}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}yc c}	w )u   The brain chains off gmail_search (a MESSAGE id) — threads().get 404s on
    it, so we resolve threadId first and still get the whole thread.r4   r   r   r   r   r3   r   r   r   r   r   Nr^   r   rK   )r   r   show_idr   r   r   r   r   )
r   r  r   r  r  r  r	  r
  r  r   s
             r   0test_show_id_resolves_a_message_id_to_its_threadrE     s     %LD&dF#	1Bk?"d"?d""""?d"""?"""d"""""""!#J0AAhK@0T4L@0L@@@@0L@@@0@@@L@@@@@@@0s   4E c                   t        |       \  }}t        j                  dd       |d   d   d   d   d   }g }d}||v}|}|rd}||v}	|	}|sXt        j                  d	|fd
||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd|
iz  }|j                  |       |rt        j                  d		fd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	d}||v}|st        j                  d	|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }
t        t        j                  |
            d x}}d}||v}|st        j                  d	|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }
t        t        j                  |
            d x}}d}||v}|st        j                  d	|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }
t        t        j                  |
            d x}}|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      t        j
                  |      t        j
                  |      dz  }d d!|iz  }t        t        j                  |            d x}x}x}x}}d"t        j                  t               j#                          }||v }|st        j                  d#|fd$||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }
t        t        j                  |
            d x}}d%}||v }|st        j                  d#|fd$||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }
t        t        j                  |
            d x}}d&}||v }|st        j                  d#|fd$||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }
t        t        j                  |
            d x}}|d   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}}y ),Nr   r   r   r   r^   r   z<scriptalert(1)not inz%(py3)s not in %(py5)shtmlr   r   r   z%(py10)s not in %(py12)sr   r   r   r   r   onclickz%(py1)s not in %(py3)sr   r   assert %(py5)sr   zjavascript:track.mezdata:image/gif;base64,R0lGODr   )zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} == %(py9)sr&  r'  r   r   r(  assert %(py11)sr   zdata:image/png;base64,r   z%(py1)s in %(py3)sz<a href="https://reval.studio">z<b>Ahmed</b>images_blockedr   r   r   r   )r   r   r   r   r   r   r  r  r  r   r  r   r   countr,   	b64encoderi   r.   )r   r  r   rK  r  r	  r  r  r  r  r  r  r  r  r   r  @py_format4r  r  r7  @py_assert7@py_format10@py_format12r
  r  s                            r   >test_sanitizer_strips_script_handlers_and_blocks_remote_imagesr\    s4   %LD&NN;'!9Q<
#A&{3D;9;9D ;Z;Zt%;;;;;9D;;;9;;;;;;D;;;D;;;;;;;Zt;;;Z;;;;;;t;;;t;;;;;;;;;;;;;; 9D    9D   9      D   D       $=$$$$=$$$=$$$$$$$$$$$$$$$$!:T!!!!:T!!!:!!!!!!T!!!T!!!!!!!:::4::45::5::::5::::::4:::4:::::::4:::5::::::::::#F$4$4S$9$@$@$B#CDLDLLLLDLLLDLLLLLLLLLLLLLLLL,4,4444,444,4444444444444444!>T!!!!>T!!!>!!!!!!T!!!T!!!!!!!!9Q<
#A&'78=A=8A====8A===8===A=======r   c                    ddddi} t        j                  d| d      \  }}g }d}||v}|}|rd	}||v}|}|sXt        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }	dd|	iz  }
|j                  |
       |rt        j                  d
fd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            d x}}d}||v}|st        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            d x}}d }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            d x}}d}||k(  }|st        j                  d!|fd"||f      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}}t        j                  d%i d&      \  }}g }d'}||v }|}|r	d}||k(  }|}|sXt        j                  d|fd(||f      t        j                  |      d)t        j                         v st        j                  |      rt        j                  |      nd)dz  }	dd|	iz  }
|j                  |
       |rt        j                  d!fd*||f      d+t        j                         v st        j                  |      rt        j                  |      nd+t        j                  |      d,z  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}y )-Nc1rW   AAA)r   b64z<p style="background:url(https://t.io/x.png)">hi</p><iframe src="https://evil.io"></iframe><img SRC="cid:c1"><img src="java
script:alert(1)"><style>a{color:red} b{background:url(https://t.io/y.png)}</style>T)block_remotez<iframezevil.iorH  rJ  rK  r   r   r   rL  r   r   r   r   r   r   zsrc="data:image/png;base64,AAA"r   rT  rO  rP  r   rG  rN  zurl(about:blank)za{color:red}r   z%(py0)s == %(py3)sblockedr&  r   z"<img src="https://track.me/p.gif">Fsrc="https://track.me/p.gif"r   html2)z%(py9)s == %(py12)sblocked2)r(  r   )r   sanitize_htmlr   r   r   r  r  r  r   r  r   r   )inlinerK  rc  r  r	  r  r  r  r  r  r  r  r  r   r  rX  rf  rg  r  s                      r   test_sanitizer_unitsrj    s   [78F++	L 	T#MD' ;9:9D :Y:Yd%:::::9D:::9::::::D:::D:::::::Yd:::Y::::::d:::d::::::::::::::,4,4444,444,4444444444444444!:T!!!!:T!!!:!!!!!!T!!!T!!!!!!!%%%%%%%%%%%%%%%%%%%%%%%%!>T!!!!>T!!!>!!!!!!T!!!T!!!!!!!7a<7a77a  --,buFOE8D)D)U2D1Dx1}DDDD)UDDD)DDDDDDUDDDUDDDDDDDx1DDDDDDxDDDxDDD1DDDDDDDDDDDDDDr   c           	     &   t        |       \  }}t        j                  dd       d}|d   d   d   d   d   }||v}|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t               }t        j                  |j                  ddddd             |D 	cg c]  }	|	d   dk(  s|	 c}	d   d   }
d}|
d   d   d   }||v }|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   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}y c c}	w )Nr   r   rQ  r   r   r^   r   rH  z%(py1)s not in %(py4)sr   r   r   r3   imagesrK   )r   r   actionr   r   re  r   z%(py1)s in %(py4)srU  r   r   )r   r   r   r   r   r   r   r   r&   asynciorun_email_action)r   r  r   r  r  r	  r
  r  r%   er  s              r   )test_load_images_reemits_with_remote_srcsru  (  s   %LD&NN;'EVAYq\*5a8EE:EEEEE:EEEE:EEEEEEEEEEEAKKdv+3t!E F G	6Vqt~5!V	6r	:1	=B)KR
^A->{-KK)-KKKKK)-KKKK)KKK-KKKKKKKKj>!-.3!3.!3333.!333.333!3333333 
7s   'H5Hc                   t        | |      \  }}t        j                  dd       t               }t	        j
                  |j                  ddddddd             |D cg c]  }|d	   d
k(  s| c}d   d   }g }|d   }d}	||	u }
|
}|
r|d   }d}||k(  }|}|st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }|j                  |       |
r_t        j                  dfdf      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d	      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}
x}	x}x}}g }|d   }d}	||	k(  }
|
}|
r|d   }d}||k(  }|}|st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }|j                  |       |
r_t        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d	      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}
x}	x}x}}|d    }|j                  }d!}
 ||
      }|std"t        j                  |      t        j                  |      t        j                  |
      t        j                  |      d#z  }t        t        j                  |            d x}x}x}
}t        |d    d$      5 }|j                   } |       }|t"        k(  }	|	st        j                  d|	fd%|t"        f      d&t%        j&                         v st        j(                  |      rt        j                  |      nd&t        j                  |      t        j                  |      d't%        j&                         v st        j(                  t"              rt        j                  t"              nd'd(z  }d)d|iz  }t        t        j                  |            d x}x}}	d d d        t        j*                  d       |D cg c]  }|d	   d*k(  s| c}d   d   d+   d	   d,   d	   }|d    }|d    }||k(  }|slt        j                  d|fd-||f      t        j                  |      t        j                  |      d.z  }d/d0|iz  }t        t        j                  |            d x}x}}y c c}w # 1 sw Y   xY wc c}w )1Nr   r   r3   
attachmentrK   r\   r[   )r   r   rn  r   r   rV   r   email_attachmentro  r   okTerrorrT   r   z%(py3)s is %(py6)sr   r   r   r   r   r   r   r   r   r   r   r   r   r   z/T1/quote_v2.pdfzJassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.endswith
}(%(py5)s)
}r   rb)zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read
}()
} == %(py6)sfhrj   )r&  r'  r   r   assert %(py8)sr   r^   r   r   r   r   r   )r   r   r   r&   rq  rr  rs  r   r   r   r   r  r   r   endswithopenreadrj   r  r  r  emit_thread)r   r   r  r   r%   rt  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r}  r  attr
  s                              r   5test_email_action_attachment_downloads_and_emits_pathr  7  s   h/LD&NN;'AKKf&n!F G H 	:Vqt'99!V	:2	>q	AB12d81t18t171r1r 11118t1118111t1111111r111111r11111111111111;2k?;d;?d";r(|;t;|t';;;;?d;;;?;;;d;;;;;;;|t;;;|;;;t;;;;;;;;;;;;;;f:2:212122222:22222212222222222	bj$	2wwwyyCyCrrwyCC 
  $
7f! 61f
7
;A
>$&&')Cv;$"V*$;*$$$$;*$$$;$$$*$$$$$$$ 
; 
 	 8s%   U,-U,DU1U=U=1U:c                
   t        | |      \  }}t        j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}x}x}}t        j                  }d	} ||      }d
}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}x}x}}t        j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}x}x}}t        j                  dd      }g }|j                  }t        j                  }d}||z  }||k(  }|}|r|j                  }d}||k(  }|}|st        j                  d|fd||f      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                  |      t        j                  |      dz  }
dd|
iz  }|j                  |       |rt        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  }|j                  |       t        j                   |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}x}x}}y )Nz../../../etc/passwdpasswdr   )zO%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.safe_name
}(%(py4)s)
} == %(py9)sr   rR  rS  r   za/b/../c.pdfzc.pdfrT   rw  r3   z../../etc/passwd)zY%(py4)s
{%(py4)s = %(py2)s.parent
} == (%(py8)s
{%(py8)s = %(py6)s.ATT_ROOT
} / %(py10)s)p)r'  r   r   r   r   z%(py13)sr)  )z0%(py17)s
{%(py17)s = %(py15)s.name
} == %(py20)s)r0  r   r1  z%(py22)spy22r   r2  r3  )r   r   	safe_namer   r   r  r  r  r   r   r   	dest_pathparentr   r8   r   r  )r   r   r  _eventsr  r  r  r7  rY  rZ  r[  r  r  r  r  @py_assert16r;  @py_assert18@py_format14@py_format21@py_format23r=  rA  s                          r   .test_attachment_filename_cannot_escape_the_dirr  L  s&   +x0MD'A4A45AA5AAAA5AAAAAA9AAA9AAAAAA4AAA5AAAAAAAAAA9~9~.9'9.'9999.'99999999999999999~999.999'99999992r2r"2l2"l2222"l22222292229222222r222"222l2222222D"45AG188Gy))GDG)D0G800GQVVGxGVx5GGGGG80GGGGGG1GGG1GGG8GGGGGGyGGGyGGG)GGGDGGGGGGGVxGGGGGGQGGGQGGGVGGGxGGGGGGGGGGGGGGGr   c           
        t        |       \  }}t        j                  dd       t               }t	        j
                  |j                  dddddd             |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}}t        j                  |d   dz         j                         }
d}||
v }|st        j                  d|fd||
f      t        j                  |      dt!        j"                         v st        j$                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt!        j"                         v st        j$                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt!        j"                         v st        j$                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt!        j"                         v st        j$                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt!        j"                         v st        j$                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d x}}dddddf}||v }|st        j                  d|fd||f      t        j                  |      dt!        j"                         v st        j$                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d |j&                  j(                  j*                  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}}y )#Nr   r   r3   replyrK   zSounds good, sending the PO.r   r   rn  r   rE   ro  rG   r   r   r   r   r   rawr   z"To: Elie Haddad <elie@example.com>r   rT  rO  rP  r   zSubject: Re: Statue quotezIn-Reply-To: <m1@example.com>zReferences: <m1@example.com>email_reply_sentTrT   )r   ry  rz  r   c              3  $   K   | ]  }d |v  
 yw)z[mail] Ahmed sent a replyNr   .0ns     r   	<genexpr>zKtest_email_action_reply_sends_in_thread_and_tells_jarvis.<locals>.<genexpr>g  s     K9JA*a/9J   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr&  r'  r   )r   r   r   r&   rq  rr  rs  r   r   r   r   r   r   r,   urlsafe_b64decoder.   r  r  r  r$   r   r   r  )r   rv   r   r%   rE   r  r  r	  r
  r  r  rX  r  r  s                 r   8test_email_action_reply_sends_in_thread_and_tells_jarvisr  U  s   $KCNN;'AKKf >!@ A B 88B<D
#t#t####t######t#######

"
"4;#5
6
=
=
?C/6/36666/3666/666666366636666666&-&#----&#---&------#---#-------*1*c1111*c111*111111c111c1111111)0)S0000)S000)000000S000S0000000)0)S0000)S000)000000S000S0000000d$*,!. / 9 /289 9'8'89 /289 9/8y/ 9 928&9 9 8 8&9 9/8y&9 9 9 9%8%89 9K9J9JKK3KKKKKKKKK3KKK3KKKKKKKKKKKKKKr   c           
        t        |       \  }}t        j                  dd       t               }t	        j
                  |j                  dddddd             t        j                  |j                  d   d	   d
z         j                         }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                   |      rt        j                  |      nd	dz  }dd|iz  }t#        t        j$                  |            d x}}d}|j'                  d      d   }	||	v}|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t#        t        j$                  |            d x}x}}	y )Nr   r   r3   	reply_allrK   zAll: noted.r  ro  r  r   zCc: sara@example.comr   rT  rO  rP  r   rO   z

r   rH  rl  r   r   r   )r   r   r   r&   rq  rr  rs  r,   r  r   r.   r   r   r   r  r  r  r   r   split)r   rv   r  r%   r  r  r	  rX  r  r  r
  r  s               r   )test_reply_all_keeps_the_other_recipientsr  j  s4   %LCNN;'AKKf!/ 0 1 
"
"388B<#6#=
>
E
E
GC!(!S((((!S(((!((((((S(((S(((((((0L		&8I!8LL08LLLLL08LLLL0LLL8LLLLLLLLr   c           
     (   t        |       \  }}t        j                  dd       d"d}| j                  t        d|       t               }t        j                  |j                  ddddd	d
             |D cg c]  }|d   dk(  s| c}d   d   }g }|d   }d}	||	u }
|
}|
rd}|d   }||v }|}|st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }|j                  |       |
r_t        j                  dfdf      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}
x}	x}x}}d |j                   j"                  j$                  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}}y c c}w )#Nr   r   Fc                    t        d      )N
gmail down)r   )labelmidrE   r  s       r   boomz:test_reply_failure_is_reported_not_swallowed.<locals>.boomz  s    <((r   _replyr3   r  rK   hir  r   r  ro  r   ry  r  rz  r   r{  r   r   r   r   )z%(py11)s in %(py14)sr   r   r   r   r   c              3  $   K   | ]  }d |v  
 yw)FAILEDNr   r  s     r   r  z?test_reply_failure_is_reported_not_swallowed.<locals>.<genexpr>  s     8&7x1}&7r  r  r  r  )F)r   r   r   r   r	   r&   rq  rr  rs  r   r   r   r   r  r   r   r$   r   r   r  r  r  r  )r   r  r   r  r%   rt  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  s                          r   ,test_reply_failure_is_reported_not_swallowedr  v  s   %LD&NN;') x6AKKf!& ' ( 	:Vqt'99!V	:2	>q	AB<2d8<u<8u<<G<!<<<<8u<<<8<<<u<<<<<<<<<<<<<<<<<<<<<<<<<<<8aeekk&7&78838888888883888388888888888888 
;s   8JJc           
     B   t        | |      \  }}g | j                  t        j                  dfd       |dz  }|j	                  t
               t               }t        j                  |j                  ddt        |      d             g }}rt        |      }d   }	||	v }
|
}|sdd	d
t        j                         v st        j                        rt        j                        nd
iz  }|j!                  |       rt        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  }|j!                  |       t        j$                  |d      i z  }dd|iz  }t'        t        j(                  |            d x}x}x}x}
}	j+                          t        j                  |j                  ddt        |dz        d             g }|k(  }|st        j"                  d|fd|f      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}}y )NPopenc                &    j                  |       S r   r   )argvkwopeneds     r   r   zBtest_email_action_open_attachment_opens_the_file.<locals>.<lambda>  s    6==+>r   z	quote.pdfr3   open_attachment)r   rn  r   ro  z%(py2)sr'  r  r   )z1%(py7)s
{%(py7)s = %(py4)s(%(py5)s)
} in %(py10)sr*   f)r   r   r   r   z%(py12)sr   r   zassert %(py15)sr0  zgone.pdfr   rb  rd  rP  r   )r   r   r   
subprocesswrite_bytesrj   r&   rq  rr  rs  r*   r  r  r   r  r   r   r   r  r   r   r   )r   r   r  r  r  r%   r  r  r  r  r7  @py_format3@py_format11r  r  r   r	  rX  r  r  s                      @r   0test_email_action_open_attachment_opens_the_filer    s   +x0MD'F	,,g>@;AMM#AKKd>O),Q!1 2 3*6*6c!f*r
*f
*******6***6****6***f
******c***c******!***!***f***
**************
LLNKKd>O),X
-B)C!E F G6R<6R66Rr   c                   t        |       \  }}t        j                  dd       t               }t	        j
                  |j                  ddd             d}t        j                  }||v}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nd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}	}
|j"                  }	|	j$                  }
|
j&                  }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
x}x}}y)u   Ahmed hit ✕: the HUD already dropped the card, so the engine just forgets
    the thread — no card_close bounced back at it, no speech.r   r   r3   closer   rn  rH  z4%(py1)s not in %(py5)s
{%(py5)s = %(py3)s._THREADS
}r   r   r   r   assert %(py7)sr   Nc              3  ,   K   | ]  }|d    dk7    yw)r   
card_closeNr   )r  rt  s     r   r  z6test_hud_close_drops_state_silently.<locals>.<genexpr>  s     4Vqt|#Vs   r  allr  r   za%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.app
}.inbox
}.notes
} == %(py9)sr%   rR  rS  r   )r   r   r   r&   rq  rr  rs  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  r7  rY  rZ  r[  s                    r   #test_hud_close_drops_state_silentlyr    s    %LD&NN;'AKKdg FGH)y)))4)))))4))))4))))))y)))y)))))))))))4V443444444444344434444444444444455"5;;";""""""""""""1"""1"""5""";""""""""""""""r   c                N   t        |       \  }}t        j                  dd       t        j                  } |       }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}x}}t        j                          dddif}	|	|v }
|
st	        j
                  d|
fd|	|f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            d
x}	}
d}	t        j                  }|	|v}
|
st	        j
                  d|
fd|	|f      t	        j                  |	      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d
x}	x}
}y
)u|   Jarvis closing it on Ahmed's word (the mail_close MCP tool) DOES emit
    card_close — the HUD hasn't closed anything yet.r   r   r3   r   )zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.latest_id
}()
} == %(py7)sr   )r&  r'  r   r   zassert %(py9)sr(  Nr  draft_idr   rT  r   rO  rP  r   rH  r  r  r  r   )r   r   r   	latest_idr   r   r  r  r  r   r   r   r  r   )r   r  r   r  r  r  r  r  rZ  r  r	  rX  r  r  s                 r   'test_mail_close_tool_dismisses_the_cardr    s    %LD&NN;'( (D( D(((( D((((((9(((9(((((( (((D(((((((OO:t,-7-7777-777-7777777777777777)y)))4)))))4))))4))))))y)))y)))))))))))r   c                   t        |       \  }}t               }t        j                  |j	                  dddd             t        j                  |j	                  ddd             |j
                  }|j                  }|j                  }g }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      t        j                  |      t        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y)z8A stale card (engine restarted) must not crash or speak.GONErm  X)r   rn  r   r  r  r   r  r%   rR  rS  r   N)r   r&   rq  rr  rs  r$   r   r   r   r   r  r  r  r   r   r   )r   r  r  r%   r  r  r  r7  rY  rZ  r[  s              r   $test_unknown_thread_action_is_a_noopr    s    +&MD'AKKf+.!0 1 2KKf HIJ55"5;;";""""""""""""1"""1"""5""";""""""""""""""r   c                     t               } d| d<   d| d<   d| d<   d| d<   d	| d
<   | j                  d       | j                  dd       | j                  t        ddd       | S )Nr;   r7   r   r:   Invoicer<   zSat, 12 Jul 2026 09:00:00 +0300r=   <abc@example.com>rS   
Plain bodyz<p>HTML <b>body</b></p>rK  )subtypeapplicationpdfinv.pdf)maintyper  rV   )r   set_contentadd_alternativeadd_attachmentrj   )r   s    r   	_imap_msgr    sw    A)AfI%AdGAiL1AfI)AlOMM,/@S=%'  )Hr   c                 :
   t        j                  t                     } | d   }|j                  } |       }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}x}x}}d}| d	   }||v }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}}| 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   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}||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   }t        t              }||k(  }|st	        j
                  d|fd||f      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t	        j                  |      d z  }
dd|
iz  }t        t	        j                  |            d x}x}}|d   d!   }|j                  } |       }|s`d"t	        j                  |      t	        j                  |      t	        j                  |      d#z  }t        t	        j                  |            d x}x}}y )$Nr   r  r   )zD%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.strip
}()
} == %(py8)s)r   r   r   r   assert %(py10)sr   z<b>body</b>r   r   rp  r   r   r   r   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srk   atts)r&  r   r   r   r~  r   r   rV   r  r   r   rZ   rA   )z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}rj   )r   r   r   r   r   zBassert %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.isdigit
}()
}r  )r   	_parts_ofr  stripr   r   r   r   r   rk   r  r  r  rj   isdigit)r]   r  r	  r  rY  r  r  r  r  r
  r  r  r  r  s                 r   8test_imap_message_parts_are_untruncated_with_attachmentsr    s   ##IK0E5##5#%55%5555%555555#555%5555555555.E+..=.....=....=...........Dt99>933tt97:+)+)++++)++++++)+++++++76?///?/////?////?///////////76?&c#h&?h&&&&?h&&&?&&&&&&c&&&c&&&&&&#&&&#&&&h&&&&&&&78&$$&$&&&&&&&&$&&&&&&&&&&r   c                 R	   t               } t        j                  } ||       }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      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}}t               }|j                  d	d
       d|d<   t        j                  } ||      }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      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}}t        j                  }d} ||      }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}}
t        j                  }d} ||      }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}}
y )Nr  r   )zN%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._root_id
}(%(py3)s)
} == %(py8)sr   r   )r&  r'  r   r   r   r  r   rS   z<def@example.com>z#<abc@example.com> <ccc@example.com>
Referencesr  zSent|42)Sent42)zR%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._split_ident
}(%(py4)s)
} == %(py9)srR  rS  r   r  )rM   r  )r  r   _root_idr   r   r  r  r  r   r   r   replace_header_split_ident)r   r  r  rY  r  r  r  r  r  r  r7  rZ  r[  s                r   !test_imap_root_id_and_ident_splitr    s   A!!;!!$;(;;$(;;;;;$(;;;;;;;=;;;=;;;!;;;;;;!;;;!;;;$;;;(;;;;;;;;	Bl$78<B|!!<!"%<)<<%)<<<<<%)<<<<<<<=<<<=<<<!<<<<<<"<<<"<<<%<<<)<<<<<<<<%%BiB%i0BNB0NBBBB0NBBBBBB=BBB=BBB%BBBiBBB0BBBNBBBBBBB%%>d>%d+>>+>>>>+>>>>>>=>>>=>>>%>>>d>>>+>>>>>>>>>>>r   c                   dd l }g  G fdd      }| j                  |d|       | j                  dd       | j                  dd       | j                  t        d	d
        | j                  t        dd        t        j                  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}||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   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}dg}||k(  }|st        j                  d|fd||f      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}}d$}||v }|st        j                  d|fd%||f      t        j                  |      d&t        j                         v st        j                  |      rt        j                  |      nd&d'z  }d"d#|iz  }t        t        j                  |            d x}}y )(Nr   c                  4    e Zd ZddZd Zd Zd Zd fd	Zy)8test_imap_reply_sets_threading_headers.<locals>.FakeSMTPNc                     y r   r   )r   hostporttimeouts       r   r   zAtest_imap_reply_sets_threading_headers.<locals>.FakeSMTP.__init__      r   c                    | S r   r   r   s    r   	__enter__zBtest_imap_reply_sets_threading_headers.<locals>.FakeSMTP.__enter__  s    Kr   c                     y)NFr   )r   r   s     r   __exit__zAtest_imap_reply_sets_threading_headers.<locals>.FakeSMTP.__exit__  s    r   c                     y r   r   )r   userpws      r   loginz>test_imap_reply_sets_threading_headers.<locals>.FakeSMTP.login  r  r   c                ,    j                  ||f       y r   r   )r   msgto_addrsr   s      r   send_messagezEtest_imap_reply_sets_threading_headers.<locals>.FakeSMTP.send_message  s    KKh(r   r   )r   r   r   r   r  r  r  r  )r   s   r   FakeSMTPr    s    					)r   r  SMTP_SSLr   r   EMAIL_PASSWORDr  _imapc                     t               S r   )	_FakeIMAPr   r   r   r   z8test_imap_reply_sets_threading_headers.<locals>.<lambda>  s    	r   _fetchc                    t               S r   )r  )r   folderuids      r   r   z8test_imap_reply_sets_threading_headers.<locals>.<lambda>  s    y{r   zINBOX|7zOn it.ro  r:   r;   r   r   r   r   r   r<   zRe: InvoicezIn-Reply-Tor  r  r   rp  r   rb  rcptsrd  rP  r   z
Replied torT  r   rO  )smtplibr   r   r   r  r   r   r   r   r   r  r  r  )r   r  r  r   r  r  r  r  r	  r
  r  r  rX  r  r   s                 @r   &test_imap_reply_sets_threading_headersr    s   D) )  X6(?@'.w0CDx:< 

i
2CbJCt911191111191111911111111111y>*]*>]****>]***>***]*******}4!44!44444!4444444!444444443#l"33"33333"3333333"33333333'((5(((((5(((((((5(((5(((((((((((<3<3<33r   c                      e Zd Zd Zd Zy)r  c                    ddgfS )NOK   1r   )r   r
  s     r   selectz_FakeIMAP.select  s    tf~r   c                     y r   r   r   s    r   logoutz_FakeIMAP.logout
  s    r   N)r   r   r   r  r  r   r   r   r  r    s    r   r  )r0   zstr | bytesreturnr*   r   )r  r   );__doc__
__future__r   builtinsr  _pytest.assertion.rewrite	assertionrewriter   rq  r,   r   r   r   email.messager   voice.controlr!   voice.mail_viewr   voicer   r	   r   r   r&   r2   ri   rj   rk   r   r`   rg   rs   r   r   r   r   r   r!  rB  rE  r\  rj  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r!     si   #     2 2 &  # .
   ! !
<
 !
  D/(#KM!,EF&1CD#.OP "#E,,?@
	
  D/ (+-#.NO!CE!,>?&@#.OP)4FG ".2&(%2HIK!,"$eI'J KL "-**6!K L.5s3xHJ "3.4c#hGI	
!03
l ? ?& &, N N  tQB(913E*FG&9<B"A>"E*
4%*HL*	M9"$	#*#	'?"J r   