
    3in(                     <   d 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                 h    t        d      }|J d|v sJ t        |d         dk(  sJ |d   dk(  sJ y)z2Test that set_a.json loads correctly with 5 slides   상시ANslides   setName)r   len)selfdatas     F/home/jay/workspace/tools/carousel-gen/tests/test_generate_carousel.pytest_load_slide_dataz&TestLoadSlideData.test_load_slide_data   sO    y)44>"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    r    test_load_slide_data_unknown_setz2TestLoadSlideData.test_load_slide_data_unknown_set   s-    ]]:]; 	+M*	+ 	+ 	+s   1:N)__name__
__module____qualname____doc__r   r    r   r   r   r      s    /,+r   r   c                       e Zd ZdZd Zy)TestSlideDataAccuracyz0Test accuracy of numeric and text data in slidesc                    t        d      }|d   }t        d |D              }d}|j                  dg       D ]
  }d|v sd} n |sJ d       d}|j                  dg       D ]
  }d	|v sd} n |sJ d
       d}|j                  dg       D ]
  }d|v sd} n |sJ d       d}|j                  dg       D ]
  }d|v sd} n |sJ d       d}	|j                  dg       D ]
  }d|v sd}	 n |	sJ d       y)z3Test that numeric values match original source datar	   r
   c              3   2   K   | ]  }|d    dk(  s|  yw)slideNumber   Nr   ).0ss     r   	<genexpr>zATestSlideDataAccuracy.test_slide_data_accuracy.<locals>.<genexpr>,   s     BQAm,<,AqBs   FbulletPointsu   1,000만원Tu+   신입 최대 1,000만원 should be presentz50%u3   경력직 최대 직전연봉 50% should be presentu   4회/년u'   해외여행 4회/년 should be presentu   30개u(   30개 지원 패키지 should be present   잔여수수료u,   잔여수수료 should be present in slide 3N)r   nextget)
r   r   r
   slide_3	found_10mbulletfound_50pctfound_4timesfound_30packsfound_remaining_fees
             r   test_slide_data_accuracyz.TestSlideDataAccuracy.test_slide_data_accuracy&   sn   y)h B&BB 	kk."5 	F& 		 GGGy kk."5 	F"	 QQQ{ kk."5 	FV##	 FFF| kk."5 	F&  $	 HHH} $kk."5 	F F*&*#	 #R$RR"r   N)r   r   r   r   r3   r   r   r   r    r    #   s    :.Sr   r    c                       e Zd ZdZd Zy)TestNoForbiddenTermsz&Test that forbidden terms are not usedc                 t    t        d      }t        j                  |d      }d|vsJ d       d|v sJ d       y)	u3   Test that '잔존수당' term is not used in slidesr	   F)ensure_asciiu   잔존수당u0   '잔존수당' forbidden term should not be usedr)   u(   '잔여수수료' should be used insteadN)r   jsondumps)r   r   data_strs      r   test_no_forbidden_termsz,TestNoForbiddenTerms.test_no_forbidden_termsZ   sJ    y) ::d7 X-a/aa- !H,X.XX,r   N)r   r   r   r   r;   r   r   r   r5   r5   W   s    0Yr   r5   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(  rJ d| d	| d
|         y)z/Test that slide approaches are correctly mappedr	   r
   CB      r$      r   r#   approachSlide z: expected approach z, got Nr   )r   r   r
   expected_approachesslide	slide_numactual_approachexpected_approachs           r   test_slide_approachesz)TestSlideApproaches.test_slide_approachesk   s    y)h 
  	cEm,I#J/O 3I >"&77 c#78I7J&Q`Pabc7	cr   c                     t        d      }|d   }|D ]0  }|d   dk(  sd|v sJ d|d    d       |d   r$J d|d    d	        y
)z)Test that Approach C slides have bgPromptr	   r
   rE   r?   bgPromptrF   r#   z$ has approach C but missing bgPromptz bgPrompt is emptyNrG   )r   r   r
   rI   s       r   test_approach_c_has_bg_promptz1TestSlideApproaches.test_approach_c_has_bg_prompt   s    y)h 	FEZ C'!U* XU=122VWX*Z( FU=122DEF(		Fr   N)r   r   r   r   rM   rP   r   r   r   r=   r=   h   s    +c,
Fr   r=   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J d       t        j
                  j                  d      dk(  sJ d       t        j
                  j                  d      dk(  sJ d       t        j
                  j                  d      dk(  sJ d       t        j
                  j                  d      dk(  sJ d        t        j
                  j                  d!      d"k(  sJ d#       	 t        |      j                          y# 1 sw Y   nx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 filerV   r[   #=export    N"'
r   exists	read_text
splitlinesstrip
startswith	partitionosenviron
setdefault	file_pathenv_pathlinekey_values         r   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 %r   r]   zsk-test-key-123z export prefix should be strippedr^   plain_valuez$plain var without export should workr_   quoted_valuezsingle quotes should be removedr`   double_quoted_valuezdouble quotes should be removedra   spaced_valuez*leading/trailing spaces should be strippedrb    zempty values should be allowed)tempfileNamedTemporaryFilewritenamerr   rs   popgenerate_carouselr   __code__r+   r   unlink)	r   tmptmp_path	test_varsvaroriginal_load_env_keysr   original_env_pathr|   s	            r   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- ::>>"237HH 323H::>>+.-? 767?::>>,/>A 212A::>>/26KK 212K::>>,/>A =<=A::>>+."4 1014
 N!!#K	  	 J N!!#s   BH8EH( H%(I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J d       	 t        |      j                          y# 1 sw Y   yxY w# t              j                          w xY w)z'Test that comments are properly ignoredrT   rU   FrV   rW   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 )	NrV   rd   re   rf   rg   rh   ri   rj   rk   ru   s         r   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 %r   valid_valuezvalid var should be loaded)
r   r   r   r   rr   rs   r   r+   r   r   )r   r   r   r|   s       r   #test_load_env_keys_handles_commentsz3TestLoadEnvKeys.test_load_env_keys_handles_comments   s    ((	
 	 
 II-.II/0xxH	 	$JJNN;-
F $H-::>>+.-? -,-? N!!#?	  	 > N!!#s   /CAC C
C(N)r   r   r   r   r   r   r   r   r   rR   rR      s    ?H$T!$r   rR   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 rJ d|j                  d       d|         + y)z)Test that all slides have required fieldsr	   r
   )r#   rE   titleheadlinerF   r#   z missing required field: N)r   r+   )r   r   r
   required_fieldsrI   fields         r   $test_all_slides_have_required_fieldsz7TestSlideStructure.test_all_slides_have_required_fields  sm    y)hJ 	XE( X~ XUYY}566OPUwWX~X	Xr   c                 t    t        d      }|d   }|D cg c]  }|d   	 }}|g dk(  s
J d|        yc c}w )z2Test that slide numbers are sequential from 1 to 5r	   r
   r#   rA   z-Slide numbers should be [1, 2, 3, 4, 5], got NrG   )r   r   r
   r&   slide_numberss        r   test_slide_numbers_sequentialz0TestSlideStructure.test_slide_numbers_sequential  sS    y)h39:a=)::/ 	L;M?K	L/ ;s   5N)r   r   r   r   r   r   r   r   r   r   r      s    4
XLr   r   )r   r8   rr   sysr   pathlibr   r   pathinsertstr__file__parentr   r   r   r   r    r5   r=   rR   r   r   r   r   <module>r      s    )  	 
    3tH~,,334 5 <+ +$1S 1ShY Y"#F #FLn$ n$bL Lr   