
    Ni>                        d 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                  d                ej                  d        Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zy)u6   task-2370 P2 — anu_confirm_bot Flask webhook 검증.    N)Path   c                    |j                  dt        |              |j                  dd       |j                  dd       |j                  dd       ddl}dd	lm} |j                  |       dd
lm} |j                  |       | |fS )uX   격리된 workspace를 사용하여 audit log + processed marker가 tmp에 쌓이도록.WORKSPACE_ROOTANU_CONFIRM_SECRETtest_secretANU_CONFIRM_BOT_TOKEN ANU_CONFIRM_CHAT_IDr   N)config)main)setenvstr	importlibscripts.anu_confirm_botr   reloadr   )tmp_pathmonkeypatchr   cfgbot_mains        P/home/jay/workspace/.worktrees/task-2467-dev6/tests/dev3/test_anu_confirm_bot.pyisolated_workspacer      s|     'X7+];.3,b15S8XX    c                     | \  }}|j                   j                         }|j                  d      }|j                  dk(  sJ |j	                         }|d   dk(  sJ d|v sJ y )Nz/healthz   statusoktrigger_marker)apptest_clientgetstatus_codeget_jsonr   _r   clientrespbodys         r   test_healthz_returns_200r)      sj    $KAx\\%%'F::j!Ds"""==?D>T!!!t###r   c                     | \  }}|j                   j                         }ddddi}|j                  d|      }|j                  dk(  sJ y)	u   위조 callback_data → 401.callback_querycb1za:2370:99:9999999999:wrongsigiddata/webhookjson  N)r   r    postr"   )r   r%   r   r&   updater'   s         r   +test_webhook_signature_verification_failurer6   &   sZ    $KAx\\%%'F3
F ;;z;/Ds"""r   c           	          | \  }}ddl m}  |dddt        t        j                               dz
  d      }|j                  j                         }dd	|d
i}|j                  d|      }|j                  dk(  sJ y)u#   만료된 callback → 401 expired.r   sign_callbackaB	  c   
   r   r+   r,   r-   r0   r1   r3   N)scripts.anu_confirm_bot.signerr9   inttimer   r    r4   r"   )r   r%   r   r9   cbr&   r5   r'   s           r   test_webhook_expired_callbackrB   4   sw    $KAx<	sD"c$))+&6&;]	KB\\%%'Fub 9:F;;z;/Ds"""r   c           	      l   | \  }}ddl m}  |dddt        t        j                               dz   d      }|j                  j                         }dd	|d
i}|j                  d|      }|j                  dk(  sJ |j                         }|d   dk(  sJ |dz  dz  dz  dz  }	|	j                         sJ y)u7   diff action은 PR URL 반환 + processed marker 생성.r   r8   dr;   r<   ,  r   r+   r,   r-   r0   r1   r   outcome
diff_shownmemoryeventszanu-confirmzprocessed-2370-99-dN)
r>   r9   r?   r@   r   r    r4   r"   r#   exists)
r   r   r   r9   rA   r&   r5   r'   r(   markers
             r   $test_webhook_diff_action_returns_urlrL   ?   s    +Hh<	sD"c$))+&6&<m	LB\\%%'Fub 9:F;;z;/Ds"""==?D	?l*** 8+m;>SSF==??r   c           	      t   | \  }}ddl m}  |dddt        t        j                               dz   d      }|j                  j                         }dd	|d
i}|j                  d|      }|j                  dk(  sJ |j                  d|      }|j                  dk(  sJ |j                         }	|	d   dk(  sJ y)u4   동일 callback 재클릭 → 409 already_processed.r   r8   rD   r;   r<   rE   r   r+   r,   r-   r0   r1   r   i  reasonalready_processedN)	r>   r9   r?   r@   r   r    r4   r"   r#   )
r   r%   r   r9   rA   r&   r5   resp1resp2r(   s
             r   test_webhook_replay_protectionrR   O   s    $KAx<	sD"c$))+&6&<m	LB\\%%'Fub 9:FKK
K0E###KK
K0E###>>D>0000r   c           	      p   | \  }}ddl m}  G d d      fd}|j                  d|        |ddd	t        t	        j                               d
z   d      }|j
                  j                         }dd|di}|j                  d|      }	|	j                  dk(  sJ |	j                         }
|
d   dk(  sJ y)u5   Approve → gh pr merge 호출 (subprocess.run mock).r   r8   c                       e Zd ZdZdZdZy)8test_webhook_approve_calls_gh_pr_merge.<locals>.FakeProcr   mergedr
   N)__name__
__module____qualname__
returncodestdoutstderr r   r   FakeProcrU   c   s    
r   r^   c                 B    ~~| d d g dk(  sJ | d   dk(  sJ         S )N   )ghprmerge99r]   )cmd_args_kwargsr^   s      r   fake_runz8test_webhook_approve_calls_gh_pr_merge.<locals>.fake_runh   s5    72Aw////1v~~zr   zsubprocess.runr:   r;   r<   rE   r   r+   r,   r-   r0   r1   r   rF   rV   N)
r>   r9   setattrr?   r@   r   r    r4   r"   r#   )r   r   r%   r   r9   rh   rA   r&   r5   r'   r(   r^   s              @r   &test_webhook_approve_calls_gh_pr_mergerj   ^   s    $KAx< 
 ((3	sD"c$))+&6&<m	LB\\%%'Fub 9:F;;z;/Ds"""==?D	?h&&&r   c           	         | \  }}ddl m}  |dddt        t        j                               dz   d      }|j                  j                         }|j                  dd	d
|di       |dz  dz  dz  }|j                         sJ |j                         j                         D cg c]  }|j                         s| }}t        |      dk\  sJ t        j                  |d         }	|	d   dk(  sJ |	d   dk(  sJ |	d   dk(  sJ yc c}w )u2   callback 처리 후 audit log JSONL append 확인.r   r8   rD   r;   X   rE   r   r0   r+   r,   r-   r1   rH   auditzauto-merge.log   task_idz	task-2370	pr_numbermergeranu_confirm_botN)r>   r9   r?   r@   r   r    r4   rJ   	read_text
splitlinesstriplenr2   loads)
r   r   r   r9   rA   r&   rm   llinesrecs
             r   test_webhook_audit_log_appendedr|   x   s   +Hh<	sD"c$))+&6&<m	LB\\%%'F
KK
"25"4M!NKOx'),<<E<<>>)446D1!'')QDEDu:??
**U2Y
Cy>[((({r!!!x=---- Es   %D;Dc                     | \  }}|j                   j                         }|j                  ddddii      }|j                  dk(  sJ |j	                         }|d   du sJ y	)
u3   callback_query가 없는 update는 무시 (200 ok).r0   messagetexthellor1   r   r   TN)r   r    r4   r"   r#   r$   s         r   &test_webhook_no_callback_query_ignoredr      sj    $KAx\\%%'F;;zVW4E(F;GDs"""==?D:r   )__doc__r2   sysr@   pathlibr   pytestpathinsertr   __file__resolveparentsfixturer   r)   r6   rB   rL   rR   rj   r|   r   r]   r   r   <module>r      s    <  
    3tH~--/77:; <  $## 1'4."r   