
    ȉjrm                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dlm
Z
 d dlmZ  e	e      j                         j                  d   Zedz  Zedz  Zej&                  j)                  d  ee             ej&                  j)                  d  ee             d dlmZ d d	lmZ  G d
 d      Z G d dej6                        Z G d dej6                        Zedk(  r ej>                          yy)    N)Path)mock)Image   agentradar)can_generate_visual)can_generate_captionc                   <    e Zd ZdddedefdZddZd Zd Zd	 Z	y
)_ImageResponsez
image/jpeg)content_typebodyr   c                ~    t        j                  |      | _        d| _        |t	        t        |            d| _        y )N   )zContent-TypezContent-Length)ioBytesIO_bodystatusstrlenheaders)selfr   r   s      5/tmp/h005_diag/test_visual_photo_pipeline_modified.py__init__z_ImageResponse.__init__   s.    ZZ%
(4CPTIW    c                 8    | j                   j                  |      S N)r   read)r   amounts     r   r   z_ImageResponse.read   s    zzv&&r   c                      y)N(https://images.example.invalid/topic.jpg r   s    r   geturlz_ImageResponse.geturl    s    9r   c                     | S r   r"   r#   s    r   	__enter__z_ImageResponse.__enter__#   s    r   c                      y r   r"   )r   _argss     r   __exit__z_ImageResponse.__exit__&   s    r   N))
__name__
__module____qualname__bytesr   r   r   r$   r&   r)   r"   r   r   r   r      s/    ;G XU XS X
':r   r   c                       e Zd Zedddededdf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)VisualPhotoPipelineTestsPNGimage_formatpathr3   returnNc                T    t        j                  ddd      j                  | |       y )NRGB      blueformat)r   newsave)r4   r3   s     r   _write_imagez%VisualPhotoPipelineTests._write_image+   s"    		%(--d<-Hr   c                     ddddddd}t        |      }| j                  |d          | j                  |d	   d
       | j                  d
|d          y )Nphoto-test-1feuchtegeeignetu&   Kondensation am Fenster früh erkennen   X   )	signal_idsignal_categorybriefing_freigabebriefing_winkelmallorca_relevanceradar_scoreallowedvisual_typephotoreason)r	   
assertTrueassertEqualassertInr   signalresults      r   +test_feuchte_signals_require_a_photo_visualzDVisualPhotoPipelineTests.test_feuchte_signals_require_a_photo_visual/   s`    '(!+G"$
 %V,y)*.8gvh/0r   c                     dddddddd}t        |      }| j                  |d	          | j                  |d
   d       y )Nzoperator-choice-1	allgemein	verwerfen r   r   z"Lokales Verkehrsthema auf Mallorca)rG   rH   rI   rJ   rK   rL   topicrM   rN   rO   )r	   rQ   rR   rT   s      r   =test_business_relevance_does_not_block_operator_visual_choicezVVisualPhotoPipelineTests.test_business_relevance_does_not_block_operator_visual_choice?   sP    ,*!,!"#9
 %V,y)*.8r   c           	         dddddd}d}|D ]c  }| j                  d|d	
      5  t        i ||di      }| j                  |d          | j                  d|d          d d d        | j                  d|d
      5  t	        i |dd|di      }| j                  |d          | j                  d|d          d d d        | j                  d|d	
      5  t        i ||di      }| j                  |d          | j                  d|d          d d d        | j                  d|d
      5  t	        i |dd|di      }| j                  |d          | j                  d|d          d d d        f t        i |ddd      }| j                  |d          d}i |ddd}|D ]  }| j                  |d	      5  | j                  t        i |d|i      d          d d d        | j                  |d      5  | j                  t	        i |d|i      d          d d d         y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   7xY w# 1 sw Y   OxY w# 1 sw Y   xY w# 1 sw Y   xY w)Nzsafety-test-1rY   rD   rE   P   )rG   rH   rI   rK   rL   )briefing_risikor\   topic_deshort_summaryrJ   briefing_nutzensource_namedeathvisual)kindfieldgatezTodesfall gemeldetrM   	TodesfallrP   captionrJ   zSachliche EinordnungethicalzTerroranschlag gemeldetEthischu   Unverdächtige ÜbersetzungzTerroranschlag auf Mallorca)ra   r\   )u(   Bei dem Unfall wurde ein Mensch getötetz"Der Fahrer starb noch am Unfallortz!Zwei Tote bei Unfall auf Mallorcaz$Drei Menschen wurden schwer verletztu&   El conductor falleció en el accidenteu"   Una víctima murió tras el choquez%One passenger was killed in the crashz Two fatalities in Mallorca crashu)   Er erlitt lebensgefährliche Verletzungenu&   Una persona resultó gravemente heridaz$One passenger was critically injuredzTwo people lost their livesz Zwei Menschen verloren ihr Lebenz$Drei Menschen wurden schwer
verletztz$Drei Menschen wurden schwer	verletztz$Drei Menschen wurden schwer-verletztu   lebensgefährlichu   Todes​fallu   d​eadu   schw​er verletztzT.o.t.eu   tödlicher Unfallu   tödliche Kollisionu   getötete Personu   TerroranschlägeVergewaltigungenu   Kindesmissbrauchsfälleu   Terroran​schläge)rJ   rK   )phraseri   r\   )subTestr	   assertFalserS   r
   )	r   basefieldsrh   rV   both_topicsrealistic_phrasescaption_basero   s	            r   7test_death_and_ethical_safeguards_scan_every_text_fieldzPVisualPhotoPipelineTests.test_death_and_ethical_safeguards_scan_every_text_fieldO   s   (*!+"$

  	;E7%hG =,-R-Re=Q-RS  	!23k6(+;<= 7%iH =- //-/EuNb/    	!23k6(+;<= 9EI ;,-W-We=V-WX  	!23i)9:; 9E	J ;- //-/EuNg/    	!23i)9:; ;	;, * +
+
52+
 
 	Y/0
<

5"$

 ( 	eFV(; \  !45N5Ngv5N!OPY!Z[\V)< e  !56W6WwPV6W!XYb!cde e	e= == =; ;; ;d\ \e esG   ;H+<=H8;I,=I=$I<$I++H5	8I	I	I	I(	+I4	c                    dd l }t        j                         5 }t        |      }|dz  }|dz  }|j	                          | j                  |d       |j                  ddi||      }|j                  ddi|      }d d d        | j                  j                  d       | j                  j                  d	             y # 1 sw Y   FxY w)
Nr   selected.jpgphotosJPEGr2   rG   zreal-photo-1zreal-photo-1.jpgdata:image/jpeg;base64,)visual_rendertempfileTemporaryDirectoryr   mkdirr@   select_photo_assetload_photo_data_urirR   namerQ   
startswith)r   r}   tmprootselected	photo_dir	installeddata_uris           r   >test_selected_real_photo_is_validated_and_installed_for_signalzWVisualPhotoPipelineTests.test_selected_real_photo_is_validated_and_installed_for_signal   s    ((* 	c9Dn,HxIOOhV<%88n-xI %88n-yH	 	);<++,EFG	 	s   A"C  C	c                    dd l }t        j                         5 }t        |      }|dz  }|dz  }|j	                          | j                  |d       |j                  ddi||       t        j                  j                  |d      5 }|j                  dd	d
d|      }d d d        d d d        | j                         j                          y # 1 sw Y   3xY w# 1 sw Y   7xY w)Nr   ry   rz   r{   r2   rG   zmanual-context-1_open_image_requestu&   Vollständiger späterer SignalkontextferienimmobilierG   r\   rH   )r}   r~   r   r   r   r@   r   r   patchobjectensure_topic_photoassertIsNotNoneassert_not_called)r   r}   r   r   r   r   openerrV   s           r   @test_manual_photo_remains_valid_when_full_signal_context_arriveszYVisualPhotoPipelineTests.test_manual_photo_remains_valid_when_full_signal_context_arrives   s    ((* 	c9Dn,HxIOOhV<,,k;M-NPXZcd""=2GH F&99%7!I+<
 	$ 	V$  " 	 	s$   A.CCCC	CC%c                    dd l }t        j                         5 }t        |      }| j	                  |dz  d       ddi}|j                  ||      }d d d        | j                  j                  d             y # 1 sw Y   *xY w)Nr   photo-test-1.jpgr{   r2   rG   rB   r|   )r}   r~   r   r   r@   r   rQ   r   )r   r}   r   r   rU   r   s         r   (test_photo_asset_is_embedded_as_data_urizAVisualPhotoPipelineTests.test_photo_asset_is_embedded_as_data_uri   s    ((* 	LcS	Ii*<<6R!>2F$88KH	L 	++,EFG	L 	Ls   8A::Bc                    dd l }t        j                         5 }t        |      }|dz  }|j	                          | j                  |dz         |j                  ddi|      }d d d        | j                         y # 1 sw Y   xY w)Nr   rz   z	outsi.pngrG   
../outside)r}   r~   r   r   r   r@   r   assertIsNone)r   r}   r   r   r   r   s         r   1test_photo_asset_rejects_unsafe_signal_identifierzJVisualPhotoPipelineTests.test_photo_asset_rejects_unsafe_signal_identifier   s    ((* 	c9DxIOOd[01$88l+YH	 	(#	 	s   A	A<<Bc                    dd l }t        j                         5 }t        |      }|dz  }| j	                  |       |dz  j                  |       |j                  ddi|      }d d d        | j                         y # 1 sw Y   xY w)Nr   z
actual.pngzphoto-test-1.pngrG   rB   )r}   r~   r   r   r@   
symlink_tor   r   )r   r}   r   r   targetr   s         r    test_photo_asset_rejects_symlinkz9VisualPhotoPipelineTests.test_photo_asset_rejects_symlink   s    ((* 	cS	I-Ff%++77?$88n-yH	 	(#	 	s   A
A==Bc                     dd l }t        j                         5 }t        |      }|dz  j	                  d       |j                  ddi|      }d d d        | j                         y # 1 sw Y   xY w)Nr   r   s   not an imagerG   rB   )r}   r~   r   r   write_bytesr   r   )r   r}   r   r   r   s        r   *test_photo_asset_rejects_undecodable_imagezCVisualPhotoPipelineTests.test_photo_asset_rejects_undecodable_image   so    ((* 	cS	I++88I$88n-yH		 	(#	 	s   4A''A0c                     dd l }t        j                  ddg      5  | j                  t        d      5  |j                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   zsocket.getaddrinfo)r9   r      r[   )z8.8.8.8i  return_valuefreigegebenz"https://attacker.example/image.jpg)r}   r   r   assertRaisesRegex
ValueError_validate_public_https_urlr   r}   s     r   Ctest_unapproved_image_host_is_rejected_even_if_it_resolves_publiclyz\VisualPhotoPipelineTests.test_unapproved_image_host_is_rejected_even_if_it_resolves_publicly  so    ZZ,<[;\] 	_''
MB _889]^_	_ 	__ _	_ 	_s"   A#AA#A 	A##A,c                 D    dd l }| j                  t        |d      d       y )Nr   _PinnedHTTPSConnectionzFimage transport must pin the validated public IP during TLS connection)r}   rQ   hasattrr   s     r   3test_image_transport_uses_a_pinned_https_connectionzLVisualPhotoPipelineTests.test_image_transport_uses_a_pinned_https_connection  s    M#;<T	
r   c           
         dd l }dddd}t        j                         }t        j                  ddd      j                  |d	
       t        j                         5 }t        |      }t        j                  j                  |d      5  t        j                  j                  |dt        |j                                     5  |j                  ||      }d d d        d d d        t        |j!                  d            }d d d        | j#                  j%                  d             | j'                  t)              d       y # 1 sw Y   oxY w# 1 sw Y   sxY w# 1 sw Y   ]xY w)Nr   zautomatic-photo-1u:   Direkte Busverbindung zwischen Sóller und Flughafen Palmar!   )rG   r\   	image_urlr7   )  i   r;   r{   r<   r   r   r   *.jpgr|   r   )r}   r   r   r   r>   r?   r~   r   r   r   r   r   r   getvaluer   listglobrQ   r   rR   r   )r   r}   rU   imager   r   rV   r   s           r   <test_topic_photo_is_acquired_automatically_from_signal_imagezUVisualPhotoPipelineTests.test_topic_photo_is_acquired_automatically_from_signal_image  s8    -QC

 

		%f-2252H((* 	6cS	I

!!-1MNM

!!-1FUcdidrdrdtUu!vM '99&)L	M M
 Y^^G45I	6 	))*CDEY+M M M M	6 	6s<   ,E:EEE"EEEE	EE#c                   	
 dd l }ddddd}t        j                         	t        j                  ddd	      j                  	d
       g 
	
fd}t        j                         5 }t        |      }t        j                  j                  |d      5  t        j                  j                  |d|      5  |j                  ||      }d d d        d d d        t        |j                  d            }d d d        | j                         | j!                  |j#                  d             | j%                  t'              d       | j%                  t'        
      d       | j)                  d
d   d          | j)                  d
d   d          | j)                  d
d   d          | j)                  d
d   d          | j+                  t'        
d   d         d       t,        j.                  j1                  t,        j.                  j3                  
d   d         j4                        }| j7                  t9        |d   d         d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   zxY w)Nr   z$4f8f77c8-be8e-4a74-8dcf-13f4b2de2db4u9   Sommernebel überrascht Palma während einer Hitzewarnungu=   Dichter Küstennebel liegt am Morgen über Palma de Mallorca.wetter_klima)rG   ra   rb   rH   r7   )r   r   r;   r{   r<   c                 p    j                  | j                  |f       t        j                               S r   )appendfull_urlr   r   )requesttimeoutr   requestss     r   open_generatedzvVisualPhotoPipelineTests.test_missing_topic_image_is_generated_automatically_from_signal_topic.<locals>.open_generated6  s,    OOW--w78!%.."233r   r   r   side_effectr   r|   r   zimage.pollinations.aiSommernebelzDense%20summer%20fogznot%20documentary%20evidencei^  seedi)r}   r   r   r   r>   r?   r~   r   r   r   r   r   r   r   r   r   rQ   r   rR   r   rS   
assertLessurllibparseparse_qsurlparsequeryassertLessEqualint)r   r}   rU   r   r   r   rV   r   r   r   r   s            @@r   Etest_missing_topic_image_is_generated_automatically_from_signal_topicz^VisualPhotoPipelineTests.test_missing_topic_image_is_generated_automatically_from_signal_topic)  s!    @S\-	
 

		%v.33E&3I	4 ((* 	6cS	I

!!-1MNM

!!-1FTb!cM '99&)L	M M
 Y^^G45I	6 	V$))*CDEY+X*-x{1~>mXa[^4,hqk!n=4hqk!nEHQKN+S1%%fll&;&;HQKN&K&Q&QRSvq!12MB#M M M M	6 	6s<   &,I*#I5II"I*III'	"I**I4c                    dd l }t        j                         }t        j                         }t        j                  ddd      j                  |d       t        j                  ddd      j                  |d       t        |j                               t        |j                               g}dd	d
d}t        j                         5 }t        |      }t        j                  j                  |d      5  t        j                  j                  |d|      5 }|j                  ||      }	|j                  i |ddi|      }
d d d        d d d        d d d        | j                  j                   d       | j#                  	
       t%        j&                  |
j)                  dd      d         }t        j*                  t        j                  |            5 }|j-                  d      j/                  d      \  }}}d d d        | j1                         y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   @xY w)Nr   r7      r   r;   r{   r<   redzsource-replaces-generated-1   Nebel über Palmar   r   r   r   r   r   z)https://images.example.invalid/source.jpgr9   ,r   )
   r   )r}   r   r   r   r>   r?   r   r   r~   r   r   r   r   r   r   rR   
call_countassertNotEqualbase64	b64decodesplitopenconvertgetpixelassertGreater)r   r}   	generatedsource	responsesrU   r   r   r   firstsecondrawr   r   _greenr;   s                   r   Btest_generated_cache_is_replaced_when_a_source_image_later_arrivesz[VisualPhotoPipelineTests.test_generated_cache_is_replaced_when_a_source_image_later_arrivesO  s   JJL			%6*//	&/I		%5)..vf.E9--/06??,-
	
 7(-
 ((* 
	cS	I

!!-1MN

!!-1FT]!^bh%88K&99XvX{,WX 
	 	**A.E6*v||C3A67ZZ

3( 	HE %e 4 = =h GC	H3%   
	 
		H 	HsH   	,H15#H%+HH%H1%H=H"H%%H.	*H11H:=Ic           
         dd l }t        j                         }t        j                  ddd      j                  |d       ddd	d
}t        j                         5 }t        |      }| j                  |dz  d       t        j                  j                  |d      5  t        j                  j                  |dt        |j                                     5 }|j                  ||      }d d d        d d d        |j!                  ||      }d d d        | j#                  j$                  d       | j#                  j'                  d      d       | j)                         y # 1 sw Y   zxY w# 1 sw Y   ~xY w# 1 sw Y   pxY w)Nr   r7   r   r   r{   r<   zlegacy-cache-1r   r   r   zlegacy-cache-1.jpgr2   r   r   r   r   
provenancer   )r}   r   r   r   r>   r?   r~   r   r   r@   r   r   r   r   r   r   _read_photo_metadatarR   r   getr   )	r   r}   r   rU   r   r   r   rV   metadatas	            r   7test_metadata_less_legacy_cache_is_replaced_fail_closedzPVisualPhotoPipelineTests.test_metadata_less_legacy_cache_is_replaced_fail_closeds  sj   JJL			%5)..y.H)(-

 ((* 	McS	Ii*>>VT

!!-1MNM

!!!)!/	0B0B0D!E " M &99&)LM M %99&)LH	M 	**A.l3[AV$M M M M	M 	Ms=   AE;:E/E#*E/2E;#E,(E//E8	4E;;Fc                    dd l }t        d|j                         dd l}t	        |j                  d      5 }|j                         }t        d|j                  |      j                                d d d        t        dt        |             g d}|D ]  }t        d| dt        ||              t        d	t        |      D cg c]	  }|dv s| c}       t        j                         }t        j                  d
dd      j                  |d       | j!                  t"        d      5  |j%                  |j'                                d d d        y # 1 sw Y   xY wc c}w # 1 sw Y   y xY w)Nr   zvisual_render.__file__:rbzSHA-256:zid(visual_render):)_validated_imager   r   r   render_template_htmlr   zhasattr(visual_render, "z"):z[name for name in dir(visual_render) if name in ("_validated_image", "_validate_public_https_url", "select_photo_asset", "load_photo_data_uri", "render_template_html", "_PinnedHTTPSConnection")]:r7   )i!N  r   r;   r1   r<   z[Aa]bmessungen)r}   print__file__hashlibr   r   sha256	hexdigestidr   dirr   r   r   r>   r?   r   r   r   r   )	r   r}   r   fdataattrsar   r   s	            r   *test_extreme_image_dimensions_are_rejectedzCVisualPhotoPipelineTests.test_extreme_image_dimensions_are_rejected  sx   ')?)?@-(($/ 	@1668D*gnnT2<<>?	@ 	"B}$56 b 	RA-aS5w}a7PQ	R  `  tw  xE  tF  bd  lp  JN  Rc  Jc  cg  bd  	e

		%V,11%1F##J0@A 	=**5>>+;<	= 	=	@ 	@ bd
	= 	=s#   :E	E 
E 
+ E%E%E.c           
         dd l }ddddd}ddi}|j                  |d	|      }| j                  |d
   d       | j                  |d   d       | j                  ddj	                  t        t        |j                                            y )Nr   rC   zOHohe Luftfeuchtigkeit auf Mallorca: Kondensation in leerstehender Ferienwohnungu;   Feuchteprobleme in Mallorca-Wohnungen: Ursachen und Lösungu/   Eigentümer erkennt Feuchteprobleme frühzeitig)rH   ra   rJ   rc   category_classzcat-feuchte4x5	cat_labelzFeuchtigkeit im Leerstand	hook_lineu   Kondensation
früh erkennen.zSchimmel kommt )r}   build_contextrR   assertNotInjoinmapr   values)r   r}   rU   ri   contexts        r   -test_feuchte_copy_is_factual_and_not_alarmistzFVisualPhotoPipelineTests.test_feuchte_copy_is_factual_and_not_alarmist  s      )i\P	
 !-0--feTB-/JK-/NO)388CW^^=M4N+OPr   c                     dd l }|j                  ddddddi      }| j                  |d   d	       | j                  d
|d   j	                                y )Nr   rY   u@   Keine direkte Busverbindung zwischen Sóller und Flughafen Palma)rH   r\   1x1r  zcat-allgemeinr  zMallorca
aktuell.handeln)r}   r  rR   r  lowerr   r}   r  s      r   ?test_unknown_category_uses_neutral_hook_instead_of_action_claimzXVisualPhotoPipelineTests.test_unknown_category_uses_neutral_hook_instead_of_action_claim  sc    --#.[ /
 	-/CDGK$8$>$>$@Ar   c                     dd l }|j                  ddddddi      }| j                  d|d	          | j                  d
|d	          y )Nr   r   u5   Sommernebel überrascht Palma mit voller Hitzewarnung)rH   ra   r  r  zcat-wetter-klimar   r  Sturm)r}   r  rS   r  r  s      r   )test_weather_fog_uses_topic_specific_hookzBVisualPhotoPipelineTests.test_weather_fog_uses_topic_specific_hook  sX    --#1S 12
 	mW[%9:'+"67r   c                 |    dd l }|j                  dddi      }| j                  d|       | j                  d|       y )Nr   z<div>{{ headline }}</div>headlinez9Busmeldung <script>fetch('https://evil.invalid')</script>z<script>z&lt;script&gt;)r}   r   r  rS   )r   r}   htmls      r   ?test_upstream_headline_is_html_escaped_before_browser_renderingzXVisualPhotoPipelineTests.test_upstream_headline_is_html_escaped_before_browser_rendering  sB    11'TU

 	T*&-r   c                     dD ]f  }t         dz  |z  j                  d      }| j                  d|       | j                  d|       | j                  d|       | j                  d|       h y )	Nzvisual_square.htmlzvisual_45.html	templatesutf-8encodingz{{ photo_data_uri }}zobject-fit: coverz<svgfeTurbulence)AGENT	read_textrS   r  r   r   templates      r   0test_templates_use_a_real_photo_and_no_svg_scenezIVisualPhotoPipelineTests.test_templates_use_a_real_photo_and_no_svg_scene  sl    < 	7D+d2==w=OHMM0(;MM-x8VX.^X6	7r   c                     dD ]B  }t         dz  |z  j                  d      }| j                  d|       | j                  d|       D y )Nr  r  r  r  z{% if risk_flag %}u!   Manuell prüfen — Risiko-Signalr!  r"  rS   r#  s      r   /test_templates_restore_conditional_risk_warningzHVisualPhotoPipelineTests.test_templates_restore_conditional_risk_warning  sN    < 	ID+d2==w=OHMM.9MM=xH	Ir   c                     dD ]B  }t         dz  |z  j                  d      }| j                  d|       | j                  d|       D y )Nr  r  r  r  z{% if ai_generated %}zKI-generiertes Motivr'  r#  s      r   2test_templates_disclose_generated_image_provenancezKVisualPhotoPipelineTests.test_templates_disclose_generated_image_provenance  sL    < 	<D+d2==w=OHMM18<MM0(;	<r   )r+   r,   r-   staticmethodr   r   r@   rW   r]   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r%  r(  r*  r"   r   r   r0   r0   *   s    8= I4 I# I$ I I1 9 PedH(#0
H$$$_
,,$CL"&H%:=&Q"B8	.7I<r   r0   c                   *    e Zd Zd Zd Zd Zd Zd Zy)PostingPackageTestsc                 F   dd l }dddddddd	d
dd
}ddddddd}t        j                         5 }t        |      }|dz  }t	        j
                  ddd      j                  |d       |j                  }|dz  |_        |j                  j                          	 t        j                  j                  |d|      5  t        j                  j                  |d|      5  t        j                  j                  |ddt        |      dd      5  |j                  d      }d d d        d d d        d d d        d    r5|j                  dz  j                         D 	ch c]  }	|	j                   c}	n	t!               }
||_        	 d d d        | j#                  d    |d!          | j%                  t        |d"         j                  d       | j%                  
h d#       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}	w # ||_        w xY w# 1 sw Y   xY w)$Nr   zdb60c553-expiredschimmel_risikozurueckstellenu0   Feuchtigkeit an Außenwänden sachlich erklärenu/   Eigentümer erkennt Handlungsbedarf frühzeitigzkein besonderes RisikorE   r_   z&Feuchtigkeit in einer Mallorca-Wohnungz2020-01-01T00:00:00+00:00)
rG   rH   rI   rJ   rc   r`   rK   rL   r\   
expires_atTFacebookLinkedIn   facebooklinkedinsuccessr6  r7  
char_countrendered.pngr7   r8   r;   r1   r<   packagesload_signalr   render_captionrender_signalokr9  r4   rP   r9  rP   package_dir>   facebook.txtlinkedin.txtmetadata.jsonvisual_45.pngvisual_square.png)posting_packager~   r   r   r   r>   r?   
OUTPUT_DIRr   r   r   r   r   generate_packageiterdirr   setrQ   rR   )r   rH  rU   rk   r   r   renderedoriginal_outputrV   r4   filess              r   ?test_expired_db60c553_like_signal_can_generate_complete_packagezSPostingPackageTests.test_expired_db60c553_like_signal_can_generate_complete_package  sC    ,0!1QP7"$=5
 ""'(a8	
 ((* 	=c9Dn,HIIeVV,11(51I-88O)-
):O&&&,,.	=JJ%%o}SY%ZRJJ%%o7GV]%^R JJ%%oaeors{o|  IM  VN%  OR
 -==>PQFR R R pvv  pA0J0JM_0_/h/h/jktk  GJ  GL-<*!	=$ 	y)6(+;<f]3499;MNc	
R R R R R R l-<*!	= 	=sx   A)H"H<#G:0G.G"	!G.)G:1,HH0H=H"G+'G..G73G::H	?H	HHH c                 
   dd l }t        j                  j                  |d      5 }|j	                  d      }d d d        | j                  d          | j                  d|d          j                          y # 1 sw Y   CxY w)Nr   r=  r   r9     Ungültige Signal-IDrP   )rH  r   r   r   rJ  rq   rS   r   )r   rH  r=  rV   s       r   ?test_package_rejects_unsafe_signal_id_before_lookup_or_path_usezSPostingPackageTests.test_package_rejects_unsafe_signal_id_before_lookup_or_path_use!  sy    ZZ> 	D+$55lCF	D 		*+,fX.>?%%'	D 	Ds   A99Bc                     dd l }t        j                  j                  |dddi      5  |j	                  d      }d d d        | j                  d          | j                  d|d	          y # 1 sw Y   3xY w)
Nr   r=  rG   r   r   zsafe-idr9  rR  rP   )rH  r   r   r   rJ  rq   rS   )r   rH  rV   s      r   <test_package_rejects_unsafe_loaded_signal_id_before_path_usezPPostingPackageTests.test_package_rejects_unsafe_loaded_signal_id_before_path_use+  s|    ZZ]+|9T  
 	A %55i@F	A
 		*+,fX.>?	A 	As   A--A6c                    dd l }dddddd}dd	d
dddd}t        j                         5 }t        |      }|dz  }|j	                          |dz  }|j	                          |dz  j                  dd       |dz  }t        j                  ddd      j                  |d       |j                  }	d }
||_	        	 t        j                  j                  |d|      5  t        j                  j                  |dddd      5  t        j                  j                  |dddd      5  t        j                  j                  |d |      5  t        j                  j                  |d!dt        |      dd"      5  t        j                  j                  |d#|
$      5  |j                  d      }d d d        d d d        d d d        d d d        d d d        d d d        |dz  j                  d      }|j!                         D cg c]  }||k7  s	|j"                   }}|	|_	        	 d d d        | j%                  d%          | j'                  d       | j'                  g        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w # |	|_	        w xY w# 1 sw Y   xY w)&Nr   zswap-test-1rC   rD   r_   TestrG   rH   rI   rL   r\   Tznew Facebookznew LinkedIn   r5  r8  r<  z
marker.txtoldr  r  r;  r7   r8   r;   r1   r<   c                     t        d      )Nz injected atomic exchange failure)OSError)_left_rights     r   fail_exchangezwPostingPackageTests.test_failed_final_swap_preserves_previous_package_and_cleans_temporary_files.<locals>.fail_exchangeQ  s    @AAr   r=  r   r
   r@  rM   rP   r	   r>  r?  rA  _rename_exchanger   r9  )rH  r~   r   r   r   
write_textr   r>   r?   rI  r   r   r   r   rJ  r"  rK  r   rq   rR   )r   rH  rU   rk   r   r   r<  rB  rM  rN  r_  rV   markerr4   	leftoverss                  r   Ltest_failed_final_swap_preserves_previous_package_and_cleans_temporary_filesz`PostingPackageTests.test_failed_final_swap_preserves_previous_package_and_cleans_temporary_files6  s    '(!+
 &&')r:	
 ((* 	=c9Dj(HNN"]2K<'33EG3Ln,HIIeVV,11(51I-88OB *2O&=JJ%%o}SY%ZMJJ%%o7Mhlx|\}%~M JJ%%o7Lgkw{[|%}M JJ%%o7GV]%^	M
 JJ%%oaeors{o|  IM  VN%  OM JJ%%o7IWd%eM -==mLFM M M M M M &4???Q3;3C3C3E]4Q\I\TYY]	]-<*9	=< 		*+'B'!M M M M M M M M M M M M ^-<*9	= 	=s   BK;"J9&J(&J)#J	0J<#I8I,1I89JJ		JJ(/J9
J4J4!J9#K,I51I88J=JJ	J	JJJ%!J((J1	-J99	KKKc                    dd l }dddddd}dd	d
dddd}t        j                         5 }t        |      }|dz  }t	        j
                  ddd      j                  |d       |j                  }|dz  |_        |j                  j                          	 t        j                  j                  |d|      5  t        j                  j                  |dddd      5  t        j                  j                  |dddd      5  t        j                  j                  |d|      5  t        j                  j                  |ddt        |      dddd ddg       5  |j                  d      }d d d        d d d        d d d        d d d        d d d        |j                  d!z  j                         }	||_        	 d d d        | j                  d"          | j!                  |d#          | j!                  |d$          | j                  	       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# ||_        w xY w# 1 sw Y   xY w)%Nr   zpackage-test-1rC   rD   r_   rW  rX  Tr2  r3  r4  r5  r8  r;  r7   r8   r;   r1   r<   r<  r=  r   r
   r@  r`  r	   r>  r?  rA  Fbrokenr   packager9  rB  captions)rH  r~   r   r   r   r>   r?   rI  r   r   r   r   r   rJ  existsrq   r   )
r   rH  rU   rk   r   r   rM  rN  rV   package_existss
             r   Btest_required_visual_failure_returns_no_partial_successful_packagezVPostingPackageTests.test_required_visual_failure_returns_no_partial_successful_packageh  s|    *(!+
 ""'(a8	
 ((* 	=c9Dn,HIIeVV,11(51I-88O)-
):O&&&,,.=JJ%%o}SY%ZPJJ%%o7Mhlx|\}%~P JJ%%o7Lgkw{[|%}P JJ%%o7GV]%^	P
 JJ%%''(,c(mtT(-txP% & P -==>NOFP P P P P #2"<"<y"H!P!P!R-<*3	=6 		*+&/0&,-(-P P P P P P P P P P" .=*3	= 	=s   A)I"I7&I&H5#H)	&6HH.H6H)	>H5I%I3IHHH&"H)	)H2.H55H>:II
	I	III"N)r+   r,   r-   rP  rS  rU  re  rl  r"   r   r   r-  r-    s    ,
\(	@0(d.)r   r-  __main__) osr   r   sysr~   unittesturllib.parser   pathlibr   r   PILr   r   resolveparentsROOTr!  RADARr4   insertr   visual_gater	   caption_gater
   r   TestCaser0   r-  r+   mainr"   r   r   <module>r}     s    	  	 
      H~''*ww 3u:  3u:  + - &E<x00 E<Pd)(++ d)N zHMMO r   