
    j                     L   d Z ddlZddlmc mZ ddlZddlZddl	m
Z
 ddlZ e
e      j                         j                  d   dz  Zej                   j#                  d ee             ddlmZ dZd Zd	 Zd
 Zej2                  j5                  dg d      d        Zd Zd Zy)u@  regression: task-2575 — record_lock_sha() 동작 검증.

검증 항목:
1. 신규 lock 파일 생성
2. 기존 lock 파일 갱신 (기존 키 보존 + lock_sha 추가)
3. lock_sha 재갱신 (마지막 SHA로 덮어씀)
4. invalid SHA 거부 (길이 오류, 비-hex 문자)
5. atomic write 확인 (.tmp 잔존 없음)
    N)Path   scripts)record_lock_sha(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac                 F   t        | dt              }|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}}t        |d	         }|j                  } |       }|sd
d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}t        j                  |j                               }	|	d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }
dd|
iz  }t        t        j                  |            d 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 )Nz	task-9001statuscreated==z%(py1)s == %(py4)spy1py4assert %(py6)spy6	lock_pathzAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}py0py2r   lock_shaz%(py1)s == %(py3)s	VALID_SHAr   py3assert %(py5)spy5task_id)r   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   exists@py_builtinslocals_should_repr_global_namejsonloads	read_text)tmp_pathresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7r   @py_assert1data@py_format4@py_format6s               </home/jay/workspace/tests/regression/test_lock_sha_record.pytest_new_lock_file_createdr7      s   X{I>F((y(y((((y((((((y(((((((VK()I99::i))+,D
(y((((y(((((((((y(((y(((((((	?)k)?k))))?k)))?)))k)))))))    c                 x	   | dz  dz  }|j                  d       ddddd	d
dd}|dz  }|j                  t        j                  |             t	        | dt
              }|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}}t        j                  |j                               }
|
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}}|
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}}|
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}}|
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}}|
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}}|
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}}|
d   }|t
        k(  }|st        j                  d|fd|t
        f      t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nddz  }dd |iz  }t        t        j                  |            d x}}y )!N.taskslocksT)parentsz	task-9002enkiztask/9002-dev5z-/home/jay/workspace/.worktrees/task-9002-dev5i90  z2025-01-01T00:00:00z2025-01-01T01:00:00)r   botbranchworktreepid
started_atheartbeat_timestampztask-9002.lockr	   updatedr   r   r   r   r   r>   r?   r@   rA   rB   rC   r   r   r   r   r   r   )mkdir
write_textr(   dumpsr   r   r   r    r!   r"   r#   r)   r*   r%   r&   r'   )r+   	locks_direxisting_data	lock_filer,   r-   r.   r/   r0   r1   r3   r4   r5   s                r6   .test_existing_lock_file_updated_keys_preservedrK   ,   s,   8#g-IOODO!"C+4M ,,IM23X{I>F((y(y((((y((((((y(((((((::i))+,D ; & ;&    ;&   ;   &       >--->----->---->-----------
NNNNNNNNNNNNNNNNNNNNNNN;%;%;%;%6!66!66666!6666666!66666666%&?*??&*?????&*????&???*???????? 
(y((((y(((((((((y(((y(((((((r8   c                 r   d}d}t        | d|       t        | d|      }t        |d         }t        j                  |j	                               }|d   }||k(  }|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   }||k(  }|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}}y )N(1111111111111111111111111111111111111111(2222222222222222222222222222222222222222z	task-9003r   r   r   r   sha2r   u$   마지막 SHA로 갱신되어야 함
>assert %(py5)sr   r   )r   r   r(   r)   r*   r   r    r!   r%   r&   r'   _format_assertmsgr"   r#   )
r+   sha1rO   r,   r   r3   r-   r/   r4   r5   s
             r6   (test_lock_sha_overwritten_on_second_callrS   Q   s   DDHk40X{D9FVK()I::i))+,D
Kt#KKKtKKKKKKKKKtKKKtKKKK%KKKKKKK*%%%%%%%%%%%%%%%%%%%%%%%%r8   zbad_sha,reason))'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa	length_39))aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa	length_41)(ggggggggggggggggggggggggggggggggggggggggnon_hex)(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA	uppercase) emptyc                    t        | d|      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d| d      d	z   d
|iz  }t        t        j                  |            d x}x}}| dz  dz  dz  }	|	j                  }
 |
       }| }|st        j                  d| 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}
x}}y )Nz	task-9004r	   skippedr   r   r   [z] status must be 'skipped'z
>assert %(py6)sr   r:   r;   ztask-9004.locku%   ] lock 파일이 생성되면 안 됨zG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   r   )r   r   r    r!   rQ   r"   r#   r$   r%   r&   r'   )r+   bad_shareasonr,   r-   r.   r/   r0   r1   r   r2   @py_assert5r5   s                r6   test_invalid_sha_rejectedrd   c   s    X{G<F(PyPy(PPPyPPPPPPyPPPAfX5O*PPPPPPPP 8#g-0@@IT!T!!T!TTQvh.S#TTTTTTTyTTTyTTTTTT!TTTTTTr8   c                 >   t        | dt               d}t        | d|      }|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}}| dz  dz  dz  }t        j                  |j                               }	|	d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            d
x}}y
)uB   기존 lock 파일이 있을 때 invalid SHA → 파일 미갱신.z	task-9005(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzr	   r_   r   r   r   r   r   Nr:   r;   ztask-9005.lockr   r   r   r   u'   기존 lock_sha가 변경되면 안 됨rP   r   )r   r   r   r    r!   r"   r#   r(   r)   r*   r%   r&   r'   rQ   )r+   ra   r,   r-   r.   r/   r0   r1   r   r3   r4   r5   s               r6   ,test_invalid_sha_does_not_overwrite_existingrg   t   s    Hk95 GX{G<F((y(y((((y((((((y(((((((8#g-0@@I::i))+,D
Sy(SSSySSSSSSSSSySSSySSSS*SSSSSSSr8   c                    t        | dt               | dz  dz  }t        |j                  d            }g }||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 )Nz	task-9006r:   r;   z*.tmpr   )z%(py0)s == %(py3)s	tmp_files)r   r   u   .tmp 잔존 파일이 있음: rP   r   )r   r   listglobr   r    r%   r&   r'   r!   rQ   r"   r#   )r+   rH   ri   r/   r2   r4   r5   s          r6   $test_no_tmp_file_remains_after_writerl      s    Hk958#g-IY^^G,-IH9?HHH9HHHHHH9HHH9HHHHHH<YKHHHHHHHr8   )__doc__builtinsr%   _pytest.assertion.rewrite	assertionrewriter   r(   syspathlibr   pytest__file__resolver<   SCRIPTSpathinsertstrtaskctl_startr   r   r7   rK   rS   markparametrizerd   rg   rl    r8   r6   <module>r      s      
  
x.
 
 
"
*
*1
-	
9 3w<   )		* )J&$ ) , UUT(Ir8   