
    ^i                         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
mZ ddlZej                  j                  d e ee      j"                  j"                  j"                               ddl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edk(  r ej6                  edg       yy)u3   utils/persistent_shell.py 테스트 스위트 (TDD)    N)Path)PersistentShellc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestBasicCommandsu   단순 명령 실행 테스트c                     t               5 }|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  }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}}d	d	d	       y	# 1 sw Y   y	xY w)u$   echo 명령 실행 — 출력 반환
echo hellohelloinz%(py1)s in %(py3)soutpy1py3assert %(py5)spy5Nr   ==z%(py0)s == %(py3)scodepy0r   
r   run
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanation	selfshr   r   @py_assert0@py_assert2@py_format4@py_format6@py_assert1s	            8/home/jay/workspace/utils/tests/test_persistent_shell.pytest_echo_returns_outputz*TestBasicCommands.test_echo_returns_output   s     	"|,IC!7c>!!!7c!!!7!!!!!!c!!!c!!!!!!!41941441	 	 	   E E44E=c                    t               5 }|j                  d      \  }}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}}d	d	d	       y	# 1 sw Y   y	xY w)
u   성공 명령의 exit code = 0truer   r   r   r   r   r   r   N
r   r   r   r   r   r   r    r   r!   r"   r$   r%   _r   r'   r*   r(   r)   s           r+   test_exit_code_successz(TestBasicCommands.test_exit_code_success   s     	"ffVnGAt41941441	 	 	   B;CCc                    t               5 }|j                  d      \  }}d}||k7  }|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	d	d	       y	# 1 sw Y   y	xY w)
u   실패 명령의 exit code != 0falser   )!=)z%(py0)s != %(py3)sr   r   r   r   Nr0   r1   s           r+   test_exit_code_failurez(TestBasicCommands.test_exit_code_failure%   s     	"ffWoGAt41941441	 	 	r4   c                    t               5 }|j                  dd      \  }}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}}ddd       y# 1 sw Y   yxY w)u   특정 exit code 값 확인zexit 42      @timeout*   r   r   r   r   r   r   Nr0   r1   s           r+   test_exit_code_specific_valuez/TestBasicCommands.test_exit_code_specific_value+   s     	"ffYf4GAt42:42442	 	 	s   B=CCc                    t               5 }|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  }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}}d	d	d	       y	# 1 sw Y   y	xY w)u   여러 줄 출력 반환zprintf 'line1\nline2\nline3\n'line1r
   r   r   r   r   r   Nline2line3r   r   r   r   r   r   r#   s	            r+   test_multiline_outputz'TestBasicCommands.test_multiline_output2   s    	"BCIC!7c>!!!7c!!!7!!!!!!c!!!c!!!!!!!!7c>!!!7c!!!7!!!!!!c!!!c!!!!!!!!7c>!!!7c!!!7!!!!!!c!!!c!!!!!!!41941441	 	 	s   J*J>>Kc                     t               5 }|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  }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}}d	d	d	       y	# 1 sw Y   y	xY w)u   인자가 있는 명령 실행zecho -n test_value
test_valuer
   r   r   r   r   r   Nr   r   r   r   r   r   r#   s	            r+   test_command_with_argumentsz-TestBasicCommands.test_command_with_arguments;   s     	"34IC&<3&&&&<3&&&<&&&&&&3&&&3&&&&&&&41941441	 	 	r-   N)
__name__
__module____qualname____doc__r,   r3   r8   r>   rC   rF        r+   r   r      s#    (rL   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestDirectoryPersistenceu+   cd 후 디렉토리 상태 유지 테스트c                 P   t               5 }|j                  d|        |j                  d      \  }}t        |      }||v }|s#t        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                  |      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}	}ddd       y# 1 sw Y   yxY w)u#   cd 명령으로 디렉토리 변경cd pwdr
   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py5)sstrtmp_pathr   r   r   r   r   assert %(py7)spy7Nr   r   r   r   r   r   r   r   r   rS   r   r   r   r   r    r   r!   r"   )r$   rT   r%   r   r   r'   @py_assert4r)   @py_format8r*   r(   s              r+   test_cd_changes_directoryz2TestDirectoryPersistence.test_cd_changes_directoryK   s6    	"FFS
#$uICx='=C''''=C''''''3'''3''''''x'''x'''=''''''C'''C'''''''41941441		 	 	s   HHH%c                 &   t               5 }|j                  d|        |j                  d       |j                  d      \  }}t        |      }||v }|s#t        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                  |      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       y# 1 sw Y   yxY w)u.   cd 후 다음 명령에도 디렉토리 유지rP   r/   rQ   r
   rR   rS   rT   r   rU   rV   rW   NrX   )	r$   rT   r%   r   r2   r'   rY   r)   rZ   s	            r+   &test_cd_state_persists_across_commandsz?TestDirectoryPersistence.test_cd_state_persists_across_commandsS   s     	("FFS
#$FF6NVVE]FCx='=C''''=C''''''3'''3''''''x'''x'''=''''''C'''C'''''''		( 	( 	(s   E3FFc                    t               5 }|j                  d|        |j                         }t        |      }||v }|s#t	        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                  |      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
       y
# 1 sw Y   y
xY w)u*   get_cwd()가 cd 이후 디렉토리 반환rP   r
   rR   rS   rT   cwdrU   rV   rW   N)r   r   get_cwdrS   r   r   r   r   r    r   r!   r"   )r$   rT   r%   r_   r'   rY   r)   rZ   s           r+   test_get_cwd_reflects_cdz1TestDirectoryPersistence.test_get_cwd_reflects_cd[   s     	("FFS
#$**,Cx='=C''''=C''''''3'''3''''''x'''x'''=''''''C'''C'''''''	( 	( 	(s   EE22E;c                     |dz  }|j                          t               5 }|j                  d|        |j                  d       |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
d
d
       y
# 1 sw Y   y
xY w)u*   연속 cd 명령으로 디렉토리 추적subdirrP   z	cd subdirr
   r   r_   r   r   r   N)mkdirr   r   r`   r   r   r   r   r   r    r!   r"   )	r$   rT   rc   r%   r_   r&   r'   r(   r)   s	            r+   test_multiple_cd_commandsz2TestDirectoryPersistence.test_multiple_cd_commandsb   s    H$ 	#"FFS
#$FF;**,C"8s?"""8s"""8""""""s"""s"""""""		# 	# 	#s   CDDN)rG   rH   rI   rJ   r[   r]   ra   re   rK   rL   r+   rN   rN   H   s    5((#rL   rN   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestEnvironmentPersistenceu(   환경변수 설정 및 조회 테스트c                    t               5 }|j                  d       |j                  d      }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}}d
d
d
       y
# 1 sw Y   y
xY w)u   환경변수 설정 후 조회zexport MY_VAR=hello_worldMY_VARhello_worldr   r   valr   r   r   Nr   r   get_envr   r   r   r   r    r   r!   r"   r$   r%   rk   r'   r*   r(   r)   s          r+   test_set_and_get_env_varz3TestEnvironmentPersistence.test_set_and_get_env_varu   s     	("FF./**X&C''3-''''3-''''''3'''3'''-'''''''	( 	( 	(s   C	CC&c                    t               5 }|j                  d       |j                  d       |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  }d	d
|iz  }t        t        j                  |            dx}}ddd       y# 1 sw Y   yxY w)u.   환경변수가 여러 명령에 걸쳐 유지zexport PERSIST_VAR=persistentr/   zecho $PERSIST_VAR
persistentr
   r   r   r   r   r   Nr   )r$   r%   r   r2   r&   r'   r(   r)   s           r+   %test_env_var_persists_across_commandsz@TestEnvironmentPersistence.test_env_var_persists_across_commands|   s     	'"FF23FF6NVV/0FC&<3&&&&<3&&&<&&&&&&3&&&3&&&&&&&		' 	' 	's   CC00C9c                    t               5 }|j                  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dd       y# 1 sw Y   yxY w)	u)   존재하지 않는 환경변수 → None__NONEXISTENT_VAR_12345__N)is)z%(py0)s is %(py3)srk   r   r   r   )
r   rm   r   r   r   r   r    r   r!   r"   rn   s          r+   %test_get_env_returns_none_for_missingz@TestEnvironmentPersistence.test_get_env_returns_none_for_missing   s     	"**89C3$;3$33$	 	 	s   B7CCc                    t               5 }|j                  d       |j                  d       |j                  d      }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}}ddd       y# 1 sw Y   yxY w)u   환경변수 덮어쓰기zexport OVERRIDE_VAR=firstzexport OVERRIDE_VAR=secondOVERRIDE_VARsecondr   r   rk   r   r   r   Nrl   rn   s          r+   test_env_var_overridez0TestEnvironmentPersistence.test_env_var_override   s     	#"FF./FF/0**^,C""3(?"""3(""""""3"""3"""("""""""		# 	# 	#s   CC..C7N)rG   rH   rI   rJ   ro   rr   rv   rz   rK   rL   r+   rg   rg   r   s    2('#rL   rg   c                   "    e Zd ZdZd Zd Zd Zy)TestContextManageru'   컨텍스트 매니저 사용 테스트c                     t               5 }|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  }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}}d	d	d	       y	# 1 sw Y   y	xY w)u    with 블록 정상 진입/종료zecho context_ok
context_okr
   r   r   r   r   r   Nr   r   r   r   r   r   r#   s	            r+   %test_context_manager_enters_and_exitsz8TestContextManager.test_context_manager_enters_and_exits   s     	"01IC&<3&&&&<3&&&<&&&&&&3&&&3&&&&&&&41941441	 	 	r-   c                    t               5 }|}dd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}}y# 1 sw Y   xY w)u*   with 블록 종료 후 프로세스 정리N)is not)z%(py0)s is not %(py3)sprocr   r   r   )	r   r   r   r   r   r    r   r!   r"   )r$   r%   r   r'   r*   r(   r)   s          r+   &test_context_manager_cleans_up_on_exitz9TestContextManager.test_context_manager_cleans_up_on_exit   s     	"D	  t4t4tt4		 	s   B<<Cc                 z    t               }|j                  d       |j                          |j                          y)u   명시적 close() 호출zecho before_closeN)r   r   close)r$   r%   s     r+   test_explicit_closez&TestContextManager.test_explicit_close   s)    
"#



rL   N)rG   rH   rI   rJ   r   r   r   rK   rL   r+   r|   r|      s    1 rL   r|   c                       e Zd ZdZd Zd Zy)TestTimeoutu   타임아웃 처리 테스트c           	         t               5 }t        j                         }	 |j                  dd      \  }}t        j                         |z
  }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}}ddd       y# t        $ r t        j                         |z
  }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}}Y w xY w# 1 sw Y   yxY w)u!   긴 명령에 타임아웃 발생zsleep 60g      ?r;   g      $@)<)z%(py0)s < %(py3)selapsedr   r   r   N)r   timer   r   r   r   r   r    r   r!   r"   	Exception)
r$   r%   startr   r   r   r'   r*   r(   r)   s
             r+   .test_timeout_raises_or_returns_on_long_commandz:TestTimeout.test_timeout_raises_or_returns_on_long_command   s+    		&"IIKE&FF:sF;	T))+-!%%w~%%%w%%%%%%w%%%w%%%%%%%%%%		& 		&  &))+-!%%w~%%%w%%%%%%w%%%w%%%%%%%%%%&		& 		&s*   G	CC==CGG	GG		Gc                    t               5 }|j                  d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  }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}}ddd       y# 1 sw Y   yxY w)u+   빠른 명령은 타임아웃 없이 완료z	echo fastr:   r;   fastr
   r   r   r   r   r   Nr   r   r   r   r   r   r#   s	            r+   test_fast_command_no_timeoutz(TestTimeout.test_fast_command_no_timeout   s     	"{C8IC 6S=   6S   6      S   S       41941441	 	 	s   E"E66E?N)rG   rH   rI   rJ   r   r   rK   rL   r+   r   r      s    '&rL   r   c                   "    e Zd ZdZd Zd Zd Zy)TestSequentialStateu,   연속 명령 실행 상태 유지 테스트c                    t               5 }|j                  d|        |j                  d       |j                  d      \  }}|j                  d      \  }}t        |      }||v }|s#t        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                  |      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       y# 1 sw Y   yxY w)u-   여러 명령 연속 실행 시 상태 유지rP   zexport SEQ_VAR=sequentialrQ   zecho $SEQ_VARr
   rR   rS   rT   out_pwdrU   rV   rW   N
sequentialr   out_envr   r   r   rX   )r$   rT   r%   r   r2   r   r'   rY   r)   rZ   r&   r(   s               r+   'test_sequential_commands_maintain_statez;TestSequentialState.test_sequential_commands_maintain_state   sV    	+"FFS
#$FF./JGQ0JGQx=+=G++++=G++++++3+++3++++++x+++x+++=++++++G+++G+++++++*<7****<7***<******7***7*******	+ 	+ 	+s   H,I  I	c                    t               5 }|j                  d      }t        |t              }|sd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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            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   }
t        |
t              }|sd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                  |      dz  }t        t        j                  |            dx}
}|d   }
t        |
t              }|sd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                  |      dz  }t        t        j                  |            dx}
}ddd       y# 1 sw Y   yxY w)u!   run()이 (str, int) 튜플 반환r   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresulttuple)r   r   py2py4N   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen)r   r   r   py6zassert %(py8)spy8r   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}rS   )r   r   r   r      int)r   r   r   r   r   r   r   r    r   r!   r"   r   r   rS   r   )r$   r%   r   @py_assert3@py_format5r'   @py_assert5rY   @py_format7@py_format9r*   r)   s               r+   test_run_returns_tuplez*TestSequentialState.test_run_returns_tuple   s;    	."VVL)Ffe,,,,,,,,:,,,:,,,,,,f,,,f,,,,,,e,,,e,,,,,,,,,,v;#!#;!####;!######3###3######v###v###;###!#######$Qi-:i--------:---:---i-------------------$Qi-:i--------:---:---i-------------------	. 	. 	.s   P4QQc                    t               5 }|j                  d|        |j                  d       d}||z  }|j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}x}}ddd       y# 1 sw Y   yxY w)u@   cd 후 파일 생성 — 실제 해당 디렉토리에 생성됨rP   zecho content > testfile.txtztestfile.txtzMassert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}rT   )r   r   r   rW   N)
r   r   existsr   r   r   r    r   r!   r"   )r$   rT   r%   r*   r   rY   @py_assert6rZ   s           r+   #test_file_created_in_persistent_dirz7TestSequentialState.test_file_created_in_persistent_dir   s     	8"FFS
#$FF01-7H~-7-557577777777H777H777~77757777777777	8 	8 	8s   C+C??DN)rG   rH   rI   rJ   r   r   r   rK   rL   r+   r   r      s    6+.8rL   r   __main__z-v)rJ   builtinsr   _pytest.assertion.rewrite	assertionrewriter   ossysr   pathlibr   pytestpathinsertrS   __file__parentutils.persistent_shellr   r   rN   rg   r|   r   r   rG   mainrK   rL   r+   <module>r      s    9   	 
    3tH~,,33::; < 2+ +f"# "#T# #L @ :8 8< zFKK4 ! rL   