
    ~i                       d Z ddlm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e      j!                         j"                  d         Zee
j&                  vre
j&                  j)                  de       d	dZd
dZd
dZy)u   
test_handoff_to_bot.py — handoff_pr_to_bot 회귀 테스트.

1. dry_run=True 시 mapping dict 반환 + HANDOFF_LOG jsonl append
2. dry_run 2회 호출 → jsonl 라인 2개, 1회차 라인 보존(append-only)
    )annotationsN)Path   c                 "    ~ ~ddidddiddigdS )Nlogin
human-userzfeat-xoidabc1def2)authorheadRefNamecommits )argskwargss     R/home/jay/workspace/.worktrees/task-2481-dev4/tests/scripts/test_handoff_to_bot.py_fake_pr_viewr      s,    fL)FOeV_5     c                   |j                  dt        |              |j                  t        j                  dd       ddlm} | dz  dz  d	z  }|j                  |d
|        |j                  |d|       |j                  d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}}|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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|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}
}|j)                  d !      j+                         j-                         }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't/        |             d(z   d)|	iz  }t        t        j                  |            dx}x}}t1        j2                  |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   }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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|d*   }d+d,g}||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}}y)/uJ   dry_run=True 호출 → mapping dict 정확히 반환 + jsonl 1건 append.WORKSPACE_ROOTutils.handoff_to_botFraisingr   Nmemoryorchestration-audithandoff-to-bot.jsonl	WORKSPACEHANDOFF_LOG*   Tdry_runpr_view_funcoriginal_pr==)z%(py1)s == %(py4)s)py1py4zassert %(py6)spy6original_authorr   
new_branchztask/handoff-42-botr!   )is)z%(py1)s is %(py4)szHANDOFF_LOG not created: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}log_path)py0py2r'   utf-8encoding   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenlinesr-   r&   py3r(   zexpected 1 jsonl line, got 
>assert %(py8)spy8original_commitsr
   r   zoriginal_commits mismatch: z
>assert %(py6)s)setenvstrdelitemsysmodulesutils.handoff_to_bothandoff_to_botsetattrhandoff_pr_to_botr   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationexists_format_assertmsg@py_builtinslocals_should_repr_global_name	read_textstrip
splitlinesr4   jsonloads)tmp_pathmonkeypatchhbr,   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1r5   @py_assert5@py_assert4@py_format9entrys                   r   +test_handoff_to_bot_dry_run_creates_mappingra      s   'X7 %;UK% ("%::=SSHK2M84!!
" " F - &B& B&&&& B&&& &&&B&&&&&&&#$44$4444$444$4444444444,8#88#88888#8888888#88888888)$$$$$$$$$$$$$$$$$$$ ??D?DDD 9(DDDDDDD8DDD8DDD?DDDDDDDDD0668CCEEu:FF:?FFF:FFFFFF3FFF3FFFFFFuFFFuFFF:FFFFFF9#e*FFFFFFFFJJuQx E%2%2%%%%2%%%%%%2%%%%%%%"#3|3#|3333#|333#333|33333337"77"77777"7777777"77777777#t#t####t######t########$ (8 $(88  $(8    %    )9    &e,>&?%@A     r   c                   |j                  dt        |              |j                  t        j                  dd       ddlm} | dz  dz  d	z  }|j                  |d
|        |j                  |d|       |j                  ddt               |j                  d      j                         j                         }|d   }|j                  ddt               |j                  d      j                         j                         }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t        |             dz   d|
iz  }t+        t        j,                  |            dx}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  }t        j(                  d| d|d          dz   d |iz  }t+        t        j,                  |            dx}}y)!uW   dry_run 2회 호출 → jsonl 2라인, 1회차 라인이 그대로 유지(append-only).r   r   Fr   r   Nr   r   r   r   r   r   Tr    r/   r0   r   r$   r3   r4   lines_after_secondr6   z*expected 2 jsonl lines after 2 calls, got r8   r9   )z%(py1)s == %(py3)s
first_line)r&   r7   z91st line was modified (append-only violation):
  before: z
  after:  z
>assert %(py5)spy5)r;   r<   r=   r>   r?   r@   rA   rB   rC   r   rN   rO   rP   r4   rD   rE   rK   rL   rM   rF   rJ   rG   rH   )rS   rT   rU   r,   lines_after_firstrd   rc   rY   r]   r^   r[   r_   rW   @py_format4@py_format6s                  r   +test_handoff_to_bot_audit_jsonl_append_onlyri   H   s   'X7%;UK%("%::=SSHK2M84 TF **G*<BBDOOQ"1%J TF!++W+=CCEPPR!" a "a'   "a                "    "    #    '(    5S9K5L4MN     a   J.  	 J   	 !   	  	 %/   	 %/   L !'*+	-   	 r   )r   objectr   rj   returndict)rS   r   rT   zpytest.MonkeyPatchrk   None)__doc__
__future__r   builtinsrK   _pytest.assertion.rewrite	assertionrewriterD   rQ   r>   pathlibr   pytestr<   __file__resolveparents_WORKTREE_ROOTpathinsertr   ra   ri   r   r   r   <module>r|      sq    #    
   T(^++-55a89!HHOOA~&'Tr   