
    j                     H   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mZmZ  ee      j!                         j"                  d   dz  Ze	j&                  j)                  d ee             ddlmZ dee   d	ed
ej2                  fdZded
efdZd Zd Zd Zd Zy)u  regression: task-2575 — lock_sha end-to-end 통합 테스트.

검증 항목:
1. e2e: git init repo → worktree 생성 → lock 파일에 lock_sha 기록 확인 + HEAD 일치
2. resolve_lock_sha unit: git repo → SHA40 반환
3. resolve_lock_sha 실패: non-git 디렉토리 → None

★ 모든 git 조작은 tmp_path 안에서만 수행.
★ network call 없음 (git push는 mock으로 무력화).
    N)Path)patch	MagicMock   scripts)resolve_lock_shaargscwdreturnc                 P    t        j                  dg| z   t        |      ddd      S )NgitTr
   checkcapture_outputtext)
subprocessrunstr)r	   r
   s     A/home/jay/workspace/tests/regression/test_lock_sha_integration.py_gitr      s,    >>	$H     pathc                 8   t        g d|        t        g d|        t        g d|        | dz  }|j                  d       t        ddg|        t        g d|        t        j                  g dt	        |       d	d	d	
      }|j
                  j                         S )uJ   path에 git repo를 초기화하고 첫 커밋을 생성. HEAD SHA 반환.)initz-bmain)configz
user.emailztest@test.com)r   z	user.nameTestz	README.mdz# test
add)commitz-mr   )r   z	rev-parseHEADTr   )r   
write_textr   r   r   stdoutstrip)r   readmeresults      r   
_init_repor&   %   s    	&	2D9	($/KF
j!%	t$	!4(^^$IF ==  r   c                 B   | dz  }|j                          t        |       t               }g g f|j                  _        t        j                  t        j                  d|i      5  dt        j                  v rt        j                  d= ddl	}t        j                  |dt        |            5  |j                  t        |      dd	d
      }ddd       ddd       d   }d}||k(  }|st        j                  d|fd||f      t        j                   |      t        j                   |      dz  }t        j"                  d|       dz   d|iz  }	t%        t        j&                  |	            dx}x}}|dz  dz  dz  }
|
j(                  } |       }|st        j"                  d      dz   dt+        j,                         v st        j.                  |
      rt        j                   |
      ndt        j                   |      t        j                   |      dz  }t%        t        j&                  |            dx}}t1        j2                  |
j5                               }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   }t7        |      }d#}||k(  }|st        j                  d|fd$||f      d%t+        j,                         v st        j.                  t6              rt        j                   t6              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* |D        }t9        |      }|sd+d,t+        j,                         v st        j.                  t8              rt        j                   t8              nd,t        j                   |      t        j                   |      dz  }t%        t        j&                  |            dx}}|j:                  }d} ||      }||k(  }|st        j                  d|fd-||f      d.t+        j,                         v st        j.                  |      rt        j                   |      nd.t        j                   |      t        j                   |      t        j                   |      d&t+        j,                         v st        j.                  |      rt        j                   |      nd&d/z  }d0d1|iz  }t%        t        j&                  |            dx}x}x}}y# 1 sw Y   =xY w# 1 sw Y   BxY w)2uN   git init repo에서 cmd_create() 호출 → lock 파일에 lock_sha 기록됨.repozutils.blast_radius_parserworktree_managerr   N_run)wrapsztask-e2ezdev-testF)copy_envstatuscreated==)z%(py1)s == %(py4)s)py1py4u   예상: created, 실제: z
>assert %(py6)spy6z.taskslocksztask-e2e.locku"   lock 파일이 생성되어야 함zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	lock_pathpy0py2r2   lock_sha)in)z%(py1)s in %(py3)sdata)r1   py3u,   lock_sha 키가 lock 파일에 있어야 함
>assert %(py5)spy5(   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenrecorded_shar7   r1   r<   r3   zassert %(py8)spy8c              3   $   K   | ]  }|d v  
 yw0123456789abcdefN .0cs     r   	<genexpr>z7test_e2e_cmd_create_records_lock_sha.<locals>.<genexpr>e   s     =1q&&=   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py8)sr%   )r7   r8   r2   r3   rD   zassert %(py10)spy10)mkdirr&   r   parse_blast_radiusreturn_valuer   dictsysmodulesr)   object_patched_run_factory
cmd_creater   
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationexists@py_builtinslocals_should_repr_global_namejsonloads	read_textrA   rN   get)tmp_pathr(   fake_br_parserwmr%   @py_assert0@py_assert3@py_assert2@py_format5@py_format7r5   @py_assert1r;   @py_format4@py_format6rB   @py_assert5@py_assert4@py_format9@py_assert7@py_format11s                        r   $test_e2e_cmd_create_records_lock_sharw   >   s   fDJJLt [N68"XN%%2	CKK"=~!N	O ,./% \\"f,@,DE 	]]D		 # F	" (NyNy(NNNyNNNNNNyNNN,EfX*NNNNNNNN x')O;ICCCCCCCCCCC9CCC9CCCCCCCCCCCC::i))+,DM:MMM:MMM:MMMMMMMMMMMMMMMMMMMM
#L |""""""""""""3"""3""""""|"""|"""""""""""""===3=========3===3============== ::1j1:j!1!\1111!\11111161116111:111j111!111111\111\11111111/	 	 s%   $A	X-XXX	XXc                     ~ dd}|S )u9   git push 명령을 무력화하는 _run 래퍼 팩토리.c                     | r?t        |       dk\  r1| d   dk(  r)| d   dk(  r!t               }d|_        d|_        d|_        |S dd l}|j                  | ||d|r|j                  nd |r|j                        S d       S )	Nr   r   r      push T)r
   r   r   r"   stderr)rA   r   
returncoder"   r}   r   r   PIPE)r	   r
   r   capturemock_cp_sps         r   _patchedz&_patched_run_factory.<locals>._patchedo   s    CINtAw%'7DGv<MkG!"GGNGNN 	!ww&388D&388  
 	
 -1  
 	
r   )NTTrH   )	wm_moduler   s     r   rW   rW   k   s    
( Or   c                 ~   | dz  }|j                          t        |      }t        |      }d}||u}|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}}t        |      }d
}||k(  }	|	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                  |      t        j                  |      dz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}x}	}d |D        }t        |      }|st        j                  d|       dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}||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z   d|iz  }t        t        j                  |            d}y)uD   git init 후 HEAD SHA를 resolve_lock_sha가 반환하는지 검증.resolve_testN)is not)z%(py0)s is not %(py3)sr%   r7   r<   u   SHA를 반환해야 함r=   r>   r?   r/   r@   rA   rC   u   SHA 길이가 40이어야 함: z
>assert %(py8)srD   c              3   $   K   | ]  }|d v  
 ywrF   rH   rI   s     r   rL   z6test_resolve_lock_sha_returns_sha40.<locals>.<genexpr>   s     71q&&7rM   u   hex 문자여야 함: z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rN   r6   )z%(py0)s == %(py2)sexpected_sha)r7   r8   u   HEAD SHA와 일치해야 함z
>assert %(py4)sr2   )rP   r&   r   rY   rZ   r`   ra   rb   r[   r\   r]   r^   rA   rN   )rg   r(   r   r%   rl   ro   rp   rq   rr   rs   rn   rt   rk   rm   @py_format3s                  r   #test_resolve_lock_sha_returns_sha40r      s   n$DJJLd#Ld#F868886888888688868888888888888v;H"H;"HHH;"HHHHHH3HHH3HHHHHHvHHHvHHH;HHH"HHH ?xHHHHHHHH77Z377Z7ZZ;QRXQY9ZZZZZZZ3ZZZ3ZZZ7ZZZ7ZZZZZZ\!AAA6\AAAAAA6AAA6AAAAAA\AAA\AAAA#AAAAAAAr   c                    | dz  }|j                          t        |      }d}||u }|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      d	z   d
|iz  }t        t        j                  |            dx}}y)uS   git repo가 아닌 디렉토리에서 resolve_lock_sha는 None을 반환해야 함.non_gitN)is)z%(py0)s is %(py3)sr%   r   u   None이어야 하지만 u
    반환됨r=   r>   )rP   r   rY   rZ   r`   ra   rb   r[   r\   r]   r^   )rg   non_git_dirr%   rl   ro   rp   rq   s          r   .test_resolve_lock_sha_non_git_dir_returns_noner      s    Y&Kk*FJ6T>JJJ6TJJJJJJ6JJJ6JJJTJJJ5fZzJJJJJJJr   ) __doc__builtinsr`   _pytest.assertion.rewrite	assertionrewriterY   rc   r   rT   pathlibr   unittest.mockr   r   __file__resolveparentsSCRIPTSr   insertr   taskctl_startr   listCompletedProcessr   r&   rw   rW   r   r   rH   r   r   <module>r      s   	    
  *
x.
 
 
"
*
*1
-	
9 3w<   *tCy t 
(C(C !T !c !2*2Z>B$Kr   