
    3in(                     V   d Z ddlZddlmc m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Ze	j                  j                  d e ee      j$                  j$                               ddlmZmZ  G d d      Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Zy)z#Unit tests for generate_carousel.py    N)Path)load_slide_dataload_env_keysc                       e Zd ZdZd Zd Zy)TestLoadSlideDataz%Test slide data loading functionalityc                    t        d      }d}||u}|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}}|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                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d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}}y)z2Test that set_a.json loads correctly with 5 slides   상시AN)is not)z%(py0)s is not %(py3)sdatapy0py3zassert %(py5)spy5slidesinz%(py1)s in %(py3)spy1r      ==)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)r   py2py4py7zassert %(py9)spy9setName)z%(py1)s == %(py4)s)r   r   zassert %(py6)spy6)
r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   )selfr   @py_assert2@py_assert1@py_format4@py_format6@py_assert0@py_assert3@py_assert6@py_assert5@py_format8@py_format10@py_format5@py_format7s                 F/home/jay/workspace/tools/carousel-gen/tests/test_generate_carousel.pytest_load_slide_dataz&TestLoadSlideData.test_load_slide_data   s   y)t4t4tt4x4x4x44>'s>"'a'"a''''"a''''''s'''s'''>'''"'''a'''''''I+)+)++++)++++++)+++++++    c                 z    t        j                  t        d      5  t        d       ddd       y# 1 sw Y   yxY w)z'Test that unknown set raises ValueErrorzUnknown set)matchunknown_setN)pytestraises
ValueErrorr   )r(   s    r5    test_load_slide_data_unknown_setz2TestLoadSlideData.test_load_slide_data_unknown_set   s-    ]]:]; 	+M*	+ 	+ 	+s   1:N)__name__
__module____qualname____doc__r6   r>    r7   r5   r   r      s    /,+r7   r   c                       e Zd ZdZd Zy)TestSlideDataAccuracyz0Test accuracy of numeric and text data in slidesc                 t   t        d      }|d   }t        d |D              }d}|j                  dg       D ]
  }d|v sd} n |s{t        j                  d      d	z   d
dt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}|j                  dg       D ]
  }d|v sd} n |s{t        j                  d      d	z   d
dt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}|j                  dg       D ]
  }d|v sd} n |s{t        j                  d      d	z   d
dt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}	|j                  dg       D ]
  }d|v sd}	 n |	s{t        j                  d      d	z   d
dt        j                         v st        j                  |	      rt        j                  |	      ndiz  }t        t        j                  |            d}
|j                  dg       D ]
  }d|v sd}
 n |
s{t        j                  d      d	z   d
dt        j                         v st        j                  |
      rt        j                  |
      ndiz  }t        t        j                  |            y)z3Test that numeric values match original source datar	   r   c              3   2   K   | ]  }|d    dk(  s|  yw)slideNumber   NrC   ).0ss     r5   	<genexpr>zATestSlideDataAccuracy.test_slide_data_accuracy.<locals>.<genexpr>,   s     BQAm,<,AqBs   FbulletPointsu   1,000만원Tu+   신입 최대 1,000만원 should be presentz
>assert %(py0)sr   	found_10mz50%u3   경력직 최대 직전연봉 50% should be presentfound_50pctu   4회/년u'   해외여행 4회/년 should be presentfound_4timesu   30개u(   30개 지원 패키지 should be presentfound_30packs   잔여수수료u,   잔여수수료 should be present in slide 3found_remaining_feeN)r   nextgetr    _format_assertmsgr"   r#   r$   r%   r&   r'   )r(   r   r   slide_3rN   bullet@py_format1rO   rP   rQ   rS   s              r5   test_slide_data_accuracyz.TestSlideDataAccuracy.test_slide_data_accuracy&   sN   y)h B&BB 	kk."5 	F& 		 GGGGGGGGGyGGGyGGGGG kk."5 	F"	 QQQQQQQQQ{QQQ{QQQQQ kk."5 	FV##	 FFFFFFFFF|FFF|FFFFF kk."5 	F&  $	 HHHHHHHHH}HHH}HHHHH $kk."5 	F F*&*#	 #RR$RRRRRRR"RRR"RRRRR"r7   N)r?   r@   rA   rB   rZ   rC   r7   r5   rE   rE   #   s    :.Sr7   rE   c                       e Zd ZdZd Zy)TestNoForbiddenTermsz&Test that forbidden terms are not usedc                 4   t        d      }t        j                  |d      }d}||v}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d	      d
z   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  }t        j                  d      d
z   d|iz  }t        t        j                  |            dx}}y)u3   Test that '잔존수당' term is not used in slidesr	   F)ensure_asciiu   잔존수당)not in)z%(py1)s not in %(py3)sdata_strr   u0   '잔존수당' forbidden term should not be used
>assert %(py5)sr   NrR   r   r   u(   '잔여수수료' should be used instead)r   jsondumpsr    r!   r%   r"   r#   r$   rV   r&   r'   )r(   r   r`   r-   r)   r+   r,   s          r5   test_no_forbidden_termsz,TestNoForbiddenTerms.test_no_forbidden_termsZ   s    y) ::d7 a~X-aaa~Xaaa~aaaaaaXaaaXaaaa/aaaaaaa !X H,XXX HXXX XXXXXXHXXXHXXXX.XXXXXXXr7   N)r?   r@   rA   rB   rd   rC   r7   r5   r\   r\   W   s    0Yr7   r\   c                       e Zd ZdZd Zd Zy)TestSlideApproachesz!Test slide approach (B/C) mappingc           	      @   t        d      }|d   }dddddd}|D ]   }|d   }|d   }||   }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j
                  |      rt        j                  |      nd
dt        j                         v st        j
                  |      rt        j                  |      nddz  }	t        j                  d| d| d|       dz   d|	iz  }
t        t        j                  |
            d} y)z/Test that slide approaches are correctly mappedr	   r   CB      rI      r   rH   approachr   )z%(py0)s == %(py2)sactual_approachexpected_approachr   r   Slide z: expected approach z, got 
>assert %(py4)sr   N
r   r    r!   r"   r#   r$   r%   rV   r&   r'   )r(   r   r   expected_approachesslide	slide_numro   rp   r*   @py_format3r3   s              r5   test_slide_approachesz)TestSlideApproaches.test_slide_approachesk   sP   y)h 
  	cEm,I#J/O 3I >"&77 cQbQbc?&7 c c\b\bc cJbJb # c cYbYb # c c\b\bc cJbJb '8 c cYbYb '8 c cQbQb&#78I7J&Q`Pabc c cObObc c	cr7   c                    t        d      }|d   }|D ],  }|d   dk(  sd}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndd	z  }t        j                  d
|d    d      dz   d|iz  }t        t        j                  |            dx}}|d   }|sUt        j                  d
|d    d      dz   dt        j                  |      iz  }t        t        j                  |            d}/ y)z)Test that Approach C slides have bgPromptr	   r   rn   rh   bgPromptr   r   rv   r   rr   rH   z$ has approach C but missing bgPromptra   r   Nz bgPrompt is emptyz
>assert %(py1)sr   )
r   r    r!   r%   r"   r#   r$   rV   r&   r'   )	r(   r   r   rv   r-   r)   r+   r,   @py_format2s	            r5   test_approach_c_has_bg_promptz1TestSlideApproaches.test_approach_c_has_bg_prompt   s_   y)h 	FEZ C'! XzU* XFWFWXzU X XNWi " X XQWQWX X?W?W &+ X XNWi &+ X XFWFWfU=122VWX X XDWDWX XZ( F( F4E4EfU=122DEF F<EI ) F F F2E2EF F		Fr7   N)r?   r@   rA   rB   ry   r}   rC   r7   r5   rf   rf   h   s    +c,
Fr7   rf   c                       e Zd ZdZd Zd Zy)TestLoadEnvKeysz5Test environment variable loading from .env.keys filec           	         t        j                  dddd      5 }|j                  d       |j                  d       |j                  d       |j                  d	       |j                  d
       |j                  d       |j                  d       |j                  d       |j                  }ddd       	 g d}|D ]"  }t        j
                  j                  |d       $ d}ddl}|j                  j                  }d } |       t        j
                  }	|	j                  }
d} |
|      }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                   |	      t        j                   |
      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d      dz   d|iz  }t%        t        j&                  |            dx}	x}
x}x}x}}t        j
                  }	|	j                  }
d} |
|      }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                   |	      t        j                   |
      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d      dz   d|iz  }t%        t        j&                  |            dx}	x}
x}x}x}}t        j
                  }	|	j                  }
d} |
|      }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                   |	      t        j                   |
      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d       dz   d|iz  }t%        t        j&                  |            dx}	x}
x}x}x}}t        j
                  }	|	j                  }
d!} |
|      }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                   |	      t        j                   |
      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d#      dz   d|iz  }t%        t        j&                  |            dx}	x}
x}x}x}}t        j
                  }	|	j                  }
d$} |
|      }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                   |	      t        j                   |
      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d&      dz   d|iz  }t%        t        j&                  |            dx}	x}
x}x}x}}t        j
                  }	|	j                  }
d'} |
|      }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                   |	      t        j                   |
      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d)      dz   d|iz  }t%        t        j&                  |            dx}	x}
x}x}x}}t)        |      j+                          y# 1 sw Y   	xY w# t)              j+                          w xY w)*zATest that export prefix parsing is correct (using temporary file)w.keysFutf-8modesuffixdeleteencodingz# This is a comment
z&export OPENAI_API_KEY=sk-test-key-123
zPLAIN_VAR=plain_value
z!export QUOTED_VAR='quoted_value'
z$DOUBLE_QUOTED="double_quoted_value"
z   SPACED_VAR  =  spaced_value  
zEMPTY_VAR=

N)OPENAI_API_KEY	PLAIN_VAR
QUOTED_VARDOUBLE_QUOTED
SPACED_VAR	EMPTY_VARr   c                    t        |       }|j                         r|j                  d      j                         D ]  }|j	                         }|s|j                  d      r(d|v s-|j                  d      r|dd }|j                  d      \  }}}|j	                         j	                  d      j	                  d	      }t        j                  j                  |j	                         |        yy)
zLoad API keys from filer   r   #=export    N"'
r   exists	read_text
splitlinesstrip
startswith	partitionosenviron
setdefault	file_pathenv_pathlinekey_values         r5   load_env_keys_from_filezCTestLoadEnvKeys.test_load_env_keys.<locals>.load_env_keys_from_file   s    	???$ ( 2 2G 2 D O O Q 	F#zz|(<#y9'+ABx,0NN3,?MCE$)KKM$7$7$<$B$B3$GEJJ11#))+uE	F %r7   r   zsk-test-key-123r   zg%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.environ
}.get
}(%(py6)s)
} == %(py11)sr   r   r   r   r   py8py11z export prefix should be stripped
>assert %(py13)spy13r   plain_valuez$plain var without export should workr   quoted_valuezsingle quotes should be removedr   double_quoted_valuezdouble quotes should be removedr   spaced_valuez*leading/trailing spaces should be strippedr    zempty values should be allowed)tempfileNamedTemporaryFilewritenamer   r   popgenerate_carouselr   __code__rU   r    r!   r"   r#   r$   r%   rV   r&   r'   r   unlink)r(   tmptmp_path	test_varsvaroriginal_load_env_keysr   original_env_pathr   r*   r.   r0   @py_assert7@py_assert10@py_assert9@py_format12@py_format14s                    r5   test_load_env_keysz"TestLoadEnvKeys.test_load_env_keys   s    ((	
 	 
 II-.II?@II/0II:;II?@II9:IIn%IIdOxxH	  5	$I ! *

sD)* &*"$ 1 ? ? H HF  $H- :: 3:>> 3"2 3>"23 37H 337HH 3 3!2!2337H 3 3,2F3 322  3 3)2  3 3)2  3 3)2 " 3 3)2 #3 3 3)2 4 3 3)2 8I 3 3!2!223 3 3223 3 3:: 7:>> 7+ 7>+. 7- 7.-? 7 7%6%67.- 7 7067 766  7 7-6Y  7 7-6Y  7 7-6Y " 7 7-6Y #. 7 7-6Y / 7 7-6Y 3@ 7 7%6%667 7 7#6#67 7 7:: 2:>> 2, 2>,/ 2> 2/>A 2 2 1 12/> 2 2+162 211  2 2(1	  2 2(1	  2 2(1	 " 2 2(1	 #/ 2 2(1	 0 2 2(1	 4B 2 2 1 112 2 2112 2 2:: 2:>> 2/ 2>/2 26K 226KK 2 2 1 1226K 2 2+162 211  2 2(1	  2 2(1	  2 2(1	 " 2 2(1	 #2 2 2(1	 3 2 2(1	 7L 2 2 1 112 2 2112 2 2:: =:>> =, =>,/ => =/>A = =+<+<=/> = =6<f= =$<$<  = =3<9  = =3<9  = =3<9 " = =3<9 #/ = =3<9 0 = =3<9 4B = =+<+<<= = =)<)<= = =:: 1:>> 1+ 1>+. 1" 1."4 1 1001." 1 1*0&1 100  1 1'0y  1 1'0y  1 1'0y " 1 1'0y #. 1 1'0y / 1 1'0y 35 1 10001 1 1001 1 1
 N!!#K	  	 J N!!#s   Bb68_$c 6c cc           	      
   t        j                  dddd      5 }|j                  d       |j                  d       |j                  }ddd       	 t        j
                  j                  d	d       d
 } |       t        j
                  }|j                  }d	} ||      }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                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
t        j                  d      dz   d|
iz  }t        t        j                   |            dx}x}x}x}x}	}t#        |      j%                          y# 1 sw Y   xY w# t#              j%                          w xY w)z'Test that comments are properly ignoredr   r   Fr   r   z# Full line comment
zVALID_VAR=valid_value
N	VALID_VARc                    t        |       }|j                         r|j                  d      j                         D ]  }|j	                         }|s|j                  d      r(d|v s-|j                  d      r|dd  }|j                  d      \  }}}|j	                         j	                  d      j	                  d      }t        j                  j                  |j	                         |        y y )	Nr   r   r   r   r   r   r   r   r   r   s         r5   r   zTTestLoadEnvKeys.test_load_env_keys_handles_comments.<locals>.load_env_keys_from_file   s    	???$ ( 2 2G 2 D O O Q F#zz|(<#y9'+ABx,0NN3,?MCE$)KKM$7$7$<$B$B3$GEJJ11#))+uEF %r7   valid_valuer   r   r   r   zvalid var should be loadedr   r   )r   r   r   r   r   r   r   rU   r    r!   r"   r#   r$   r%   rV   r&   r'   r   r   )r(   r   r   r   r*   r.   r0   r   r   r   r   r   s               r5   #test_load_env_keys_handles_commentsz3TestLoadEnvKeys.test_load_env_keys_handles_comments   s   ((	
 	 
 II-.II/0xxH	 	$JJNN;-
F $H-:: -:>> -+ ->+. -- -.-? - -,,-.- - -&,f- -,,  - -#,9  - -#,9  - -#,9 " - -#,9 #. - -#,9 / - -#,9 3@ - -,,,- - -,,- - - N!!#?	  	 > N!!#s   /GE.G' G$'HN)r?   r@   rA   rB   r   r   rC   r7   r5   r   r      s    ?H$T!$r7   r   c                       e Zd ZdZd Zd Zy)TestSlideStructurez*Test overall structure and required fieldsc           	      >   t        d      }|d   }g d}|D ]  }|D ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      nddt        j                         v st        j
                  |      rt        j                  |      nddz  }t        j                  d	|j                  d
       d|       dz   d|iz  }t        t        j                  |            d}  y)z)Test that all slides have required fieldsr	   r   )rH   rn   titleheadliner   )z%(py0)s in %(py2)sfieldrv   rq   rr   rH   z missing required field: rs   r   N)r   r    r!   r"   r#   r$   r%   rV   rU   r&   r'   )	r(   r   r   required_fieldsrv   r   r*   rx   r3   s	            r5   $test_all_slides_have_required_fieldsz7TestSlideStructure.test_all_slides_have_required_fields  s(   y)hJ 	XE( X~ XFWFWXu X XQWQWX X?W?W  X XNWi  X XQWQWX X?W?W !& X XNWi !& X XFWFWfUYY}566OPUwWX X XDWDWX XX	Xr7   c                    t        d      }|d   }|D cg c]  }|d   	 }}g d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d	|       d
z   d|iz  }t        t        j                  |            dx}}yc c}w )z2Test that slide numbers are sequential from 1 to 5r	   r   rH   rj   r   )z%(py0)s == %(py3)sslide_numbersr   z-Slide numbers should be [1, 2, 3, 4, 5], got ra   r   Nrt   )	r(   r   r   rK   r   r)   r*   r+   r,   s	            r5   test_slide_numbers_sequentialz0TestSlideStructure.test_slide_numbers_sequential  s    y)h39:a=):: / 	L}/ 	L:K:K	L} 	L 	LEKV	L 	L3K3K  	L 	LBK)  	L 	LBK) !0 	L 	L:K:K;M?K	L 	L 	L8K8K	L 	L ;s   C%N)r?   r@   rA   rB   r   r   rC   r7   r5   r   r      s    4
XLr7   r   )rB   builtinsr"   _pytest.assertion.rewrite	assertionrewriter    rb   r   sysr   pathlibr   r;   pathinsertstr__file__parentr   r   r   r   rE   r\   rf   r   r   rC   r7   r5   <module>r      s    )    	 
    3tH~,,334 5 <+ +$1S 1ShY Y"#F #FLn$ n$bL Lr7   