
    i                      J   d Z ddlZddlZddlmZ ddlmZmZ ej                  j                  dej                  j                  ej                  j                  e      d             dZ ee      j                  j                  dz  dz  Zdd	Zd
edefdZd Zd Zd Zd Zy)u   
task-1947: blog_writer.py codex/gpt provider → codex-companion.mjs 전환 단위 테스트
테스터: 모리건 (개발3팀)
    N)Path)	MagicMockpatchz..zT/home/jay/.claude/plugins/cache/openai-codex/codex/1.0.3/scripts/codex-companion.mjs	dashboardzblog_writer.pyc                 D    t               }| |_        ||_        ||_        |S N)r   
returncodestdoutstderr)r	   r
   r   mocks       W/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_blog_writer_codex_companion.py_make_mock_resultr      s#    ;D DODKDKK    modeltmp_pathc                 b   |dz  }|dz  }|j                          t        d|      5 }t        dd      5  t        d      5  t        d|d	z        5  t        d
|dz        5  t        d      5  ddlm}  |dgdd| ||       |cddd       cddd       cddd       cddd       cddd       cddd       S # 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       y# 1 sw Y   yxY w)uC   _background_blog_generate를 mock 환경에서 실행하는 헬퍼.status.jsonlocksubprocess.runreturn_value.dashboard.blog_writer._build_naver_blog_prompt   테스트 프롬프트/dashboard.blog_writer._update_blog_write_status&dashboard.blog_writer._BLOG_HISTORY_DBblog.db(dashboard.blog_writer._IMAGE_OUTPUT_BASEimagessqlite3.connectr   _background_blog_generate   테스트키워드 	   정보형keywordsadditional_contenttoner   status_path	lock_pathN)touchr   dashboard.blog_writerr!   )r   mock_run_resultr   r)   r*   mock_runr!   s          r   _run_blog_generater/   !   s9   ]*K6!IOO 	_=AI<1	
 	?@ 	698LM 	688K	
 	  	D!*+!#	
 /                      s   D%DC;C&	"C.B<	C	C&		C; 	D)	D%<CC	C&	CC&		C;&C/+C;2	D;D D	D%D	D%%D.c                 ~   t        d      }t        d||       }|j                  sJ d       |j                  }|d   d   }|d   dk(  sJ d|d           |d   t        k(  sJ d	|d           |d
   dk(  sJ d|d
           t        |      dk(  sJ dt        |              d|dd
 vsJ d       d|vsJ d       y)uk   codex provider가 subprocess.run을 ['node', companion_path, 'task', ...] 형태로 호출하는지 확인.u   codex 생성 결과r
   codex.   subprocess.run이 호출되지 않았습니다r   node5   첫 번째 인자가 'node'여야 합니다. 실제:    =   두 번째 인자가 companion_path여야 합니다. 실제:    task5   세 번째 인자가 'task'여야 합니다. 실제:    6   명령어 인자 수가 4개여야 합니다. 실제: Nu>   명령어에 'codex exec' 패턴이 포함되면 안 됩니다exec8   명령어에 'exec' 인자가 포함되면 안 됩니다r   r/   called	call_argsCOMPANION_PATHlenr   mock_resultr.   rA   cmds        r   "test_codex_provider_uses_companionrG   E   s   #+@AK!';AH??LLL?""I
A,q/Cq6V]TUXYZU[T\]]q6^# 
GAxP# q6V]TUXYZU[T\]]s8q=]RSVWZS[R\]]=#bq'!c#cc!XXXr   c                 b   t        d      }t        d||       }|j                  sJ d       |j                  }|d   d   }|d   dk(  sJ d|d           |d   t        k(  sJ d	|d           |d
   dk(  sJ d|d
           t        |      dk(  sJ dt        |              d|vsJ d       y)uP   gpt(레거시) provider도 codex-companion.mjs를 통해 호출되는지 확인.u   gpt 생성 결과r1   gptr3   r   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   Nr?   rD   s        r    test_gpt_provider_uses_companionrJ   ^   s    #+>?K!%h?H??LLL?""I
A,q/Cq6V]TUXYZU[T\]]q6^# 
GAxP# q6V]TUXYZU[T\]]s8q=]RSVWZS[R\]]=XXXr   c                      t         j                         sJ dt                 t         j                  d      } d| vsJ d       d| vrd| vsJ d       t        | v sJ d	t         d
       d| v sd| v sJ d       yy)uh   blog_writer.py 소스 코드에 'codex exec' 또는 ['codex', 'exec'] 패턴이 없는지 정적 검증.u4   blog_writer.py 파일이 존재하지 않습니다: zutf-8)encodingz
codex execus   소스 코드에 'codex exec' 문자열이 존재합니다. companion.mjs 전환 후에는 있으면 안 됩니다.z"codex", "exec"z'codex', 'exec'uu   소스 코드에 ["codex", "exec"] 패턴이 존재합니다. companion.mjs 전환 후에는 있으면 안 됩니다.u    소스 코드에 companion_path(uE   )가 없습니다. 전환이 적용되지 않았을 수 있습니다.z"node"z'node'uz   소스 코드에 'node' 명령어 문자열이 없습니다. companion.mjs 전환이 올바르지 않을 수 있습니다.N)BLOG_WRITER_PATHexists	read_textrB   )sources    r   test_no_codex_exec_patternrQ   u   s    ""$o(\]m\n&oo$'''9F v% }%
 F*/@/N  	DN
 V# 
*>*::  	A#
 vV!3  	E3!3r   c                    	 t        ddd      }| dz  }| dz  }|j                          g 		fd}t        d|	      5  t        d
d	      5  t        d|      5  t        d| dz        5  t        d| dz        5  t        d      5  ddlm}  |dgddd||       ddd       ddd       ddd       ddd       ddd       ddd       	D cg c]  }|j                  d      dk(  s| }}t        |      dkD  sJ d       |d   j                  dd      }d|v sd|v sd |v s
J d!|        yy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 )"ub   codex companion이 returncode != 0으로 실패할 때 status가 failed로 기록되는지 확인.r6   r#   u   companion 실행 오류 발생)r	   r
   r   r   r   c                 (    j                  |       y r   )append)_pathdatacaptured_status_callss     r   capture_statusz5test_companion_error_handling.<locals>.capture_status   s    $$T*r   r   r   r   r   r   )side_effectr   r   r   r   r   r   r    r"   r$   r2   r%   Nstatusfailedu^   companion 실패 시 status='failed'로 _update_blog_write_status가 호출되어야 합니다errorCodexCLIu   오류uO   에러 메시지에 Codex 오류 관련 내용이 없습니다. 실제 에러: )r   r+   r   r,   r!   getrC   )
r   rE   r)   r*   rX   r!   cfailed_calls	error_msgrW   s
            @r   test_companion_error_handlingrc      s   #qDdeK]*K6!IOO+ 	[9
<1	

 	=&	

 	698LM
 	8(X:MN
 	 
 	D 	"*+!#	
#
 
 
 
 
 
6  5T!h88SATLT|q  h 
 Q##GR0Ii5I#5Y9N 
YZcYdeN9N#5E
 
 
 
 
 
 
 
 
 
 
 
6 Us   E/E#E*E	:D?D3D?$E	,E4E#<E/E;*E;3D<8D??EE	EEE E##E,	(E//E8)r   u(   생성된 블로그 글 내용입니다.r#   )__doc__ossyspathlibr   unittest.mockr   r   pathinsertjoindirname__file__rB   parentrM   r   strr/   rG   rJ   rQ   rc    r   r   <module>rq      s   
 
 
  * 277<< 94@ A [  >((//+=@PP c d HY2Y.>1r   