
    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$                  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        6/home/jay/workspace/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(  }|st	        j
                  d|fd||f      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}}|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}||
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}}y )Nz/healthz   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresppy0py2py5assert %(py7)spy7statusokz%(py1)s == %(py4)spy1py4assert %(py6)spy6trigger_marker)in)z%(py1)s in %(py3)sbody)r*   py3zassert %(py5)sr#   )apptest_clientgetstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationget_json)r   _r   clientr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r0   @py_assert0@py_assert2@py_format5@py_format7@py_format4s                   r   test_healthz_returns_200rK      sR   $KAx\\%%'F::j!D"s"s""""s""""""4"""4""""""s"""""""==?D>!T!>T!!!!>T!!!>!!!T!!!!!!!#t####t#########t###t#######r   c                    | \  }}|j                   j                         }ddddi}|j                  d|      }|j                  }d}||k(  }|st	        j
                  d|fd	||f      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}}y)u   위조 callback_data → 401.callback_querycb1za:2370:99:9999999999:wrongsigiddata/webhookjson  r   r   r   r    r$   r%   N)r2   r3   postr5   r6   r7   r8   r9   r:   r;   r<   r=   )r   r?   r   r@   updater   rA   rB   rC   rD   rE   s              r   +test_webhook_signature_verification_failurerX   &   s    $KAx\\%%'F3
F ;;z;/D"s"s""""s""""""4"""4""""""s"""""""r   c           	      f   | \  }}ddl m}  |dddt        t        j                               dz
  d      }|j                  j                         }dd	|d
i}|j                  d|      }|j                  }d}	||	k(  }
|
st        j                  d|
fd||	f      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}
}	y)u#   만료된 callback → 401 expired.r   sign_callbackaB	  c   
   r   rM   rN   rO   rR   rS   rU   r   r   r   r    r$   r%   N)scripts.anu_confirm_bot.signerr[   inttimer2   r3   rV   r5   r6   r7   r8   r9   r:   r;   r<   r=   )r   r?   r   r[   cbr@   rW   r   rA   rB   rC   rD   rE   s                r   test_webhook_expired_callbackrd   4   s    $KAx<	sD"c$))+&6&;]	KB\\%%'Fub 9:F;;z;/D"s"s""""s""""""4"""4""""""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(  }
|
st        j                  d|
fd||	f      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}
}	|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z  dz  dz  dz  }|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}}
y)"u7   diff action은 PR URL 반환 + processed marker 생성.r   rZ   dr]   r^   ,  r   rM   rN   rO   rR   rS   r   r   r   r   r    r$   r%   Noutcome
diff_shownr(   r)   r,   r-   memoryeventszanu-confirmzprocessed-2370-99-dAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}markerr!   r"   r+   )r`   r[   ra   rb   r2   r3   rV   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   exists)r   r   r   r[   rc   r@   rW   r   rA   rB   rC   rD   rE   r0   rF   rG   rH   rI   rm   s                      r   $test_webhook_diff_action_returns_urlrp   ?   s   +Hh<	sD"c$))+&6&<m	LB\\%%'Fub 9:F;;z;/D"s"s""""s""""""4"""4""""""s"""""""==?D	?*l*?l****?l***?***l******* 8+m;>SSF===??66=?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(  }
|
st        j                  d|
fd||	f      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}
}	|j                  d|      }|j                  }d}	||	k(  }
|
st        j                  d|
fd||	f      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}
}	|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}}
y)u4   동일 callback 재클릭 → 409 already_processed.r   rZ   rf   r]   r^   rg   r   rM   rN   rO   rR   rS   r   r   r   resp1r    r$   r%   Ni  resp2reasonalready_processedr(   r)   r,   r-   )r`   r[   ra   rb   r2   r3   rV   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   )r   r?   r   r[   rc   r@   rW   rr   rA   rB   rC   rD   rE   rs   r0   rF   rG   rH   rI   s                      r   test_webhook_replay_protectionrv   O   s   $KAx<	sD"c$))+&6&<m	LB\\%%'Fub 9:FKK
K0E############5###5#############KK
K0E############5###5#############>>D>000>00000>0000>00000000000r   c           	         | \  }}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(  }|st        j                  d|fd|
|f      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}}|	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}}y)u5   Approve → gh pr merge 호출 (subprocess.run mock).r   rZ   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   FakeProcry   c   s    
r   r   c                    ~~| d d }g 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}}        S )	N   )ghprmerger   r(   r)   r,   r-   99)r6   r7   r;   r<   r=   )	cmd_args_kwargsrF   rC   rG   rH   rI   r   s	           r   fake_runz8test_webhook_approve_calls_gh_pr_merge.<locals>.fake_runh   s    72Aw///w/////w////w///////////1vv~vvzr   zsubprocess.runr\   r]   r^   rg   r   rM   rN   rO   rR   rS   r   r   r   r   r    r$   r%   Nrh   rz   r(   r)   r,   r-   )r`   r[   setattrra   rb   r2   r3   rV   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   )r   r   r?   r   r[   r   rc   r@   rW   r   rA   rB   rC   rD   rE   r0   rF   rG   rH   rI   r   s                       @r   &test_webhook_approve_calls_gh_pr_merger   ^   sQ   $KAx< 
 ((3	sD"c$))+&6&<m	LB\\%%'Fub 9:F;;z;/D"s"s""""s""""""4"""4""""""s"""""""==?D	?&h&?h&&&&?h&&&?&&&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                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            dx}}|j                         j!                         D 
cg c]  }
|
j#                         s|
 }}
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}}t)        j*                  |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}}yc c}
w )&u2   callback 처리 후 audit log JSONL append 확인.r   rZ   rf   r]   X   rg   r   rR   rM   rN   rO   rS   rj   auditzauto-merge.logrl   rn   N   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenlines)r!   r*   r1   r-   zassert %(py8)spy8task_idz	task-2370r   r(   r)   r,   r-   	pr_numbermergeranu_confirm_bot)r`   r[   ra   rb   r2   r3   rV   ro   r8   r9   r6   r:   r;   r<   r=   	read_text
splitlinesstripr   r7   rT   loads)r   r   r   r[   rc   r@   r   rA   rC   rH   lr   rG   @py_assert5rB   rI   @py_format9recrF   s                      r   test_webhook_audit_log_appendedr   x   s   +Hh<	sD"c$))+&6&<m	LB\\%%'F
KK
"25"4M!NKOx'),<<E<<<>>55<>)446D1!'')QDEDu::?:33uu:
**U2Y
Cy>([(>[((((>[(((>((([((((((({!r!r!!!!r!!!!!!r!!!!!!!x=---=-----=----=----------- Es   9O>O>c                    | \  }}|j                   j                         }|j                  ddddii      }|j                  }d}||k(  }|st	        j
                  d|fd||f      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}}|j                         }
|
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}}y)u3   callback_query가 없는 update는 무시 (200 ok).rR   messagetexthellorS   r   r   r   r   r    r$   r%   Nr'   T)is)z%(py1)s is %(py4)sr)   r,   r-   )r2   r3   rV   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   )r   r?   r   r@   r   rA   rB   rC   rD   rE   r0   rF   rG   rH   rI   s                  r   &test_webhook_no_callback_query_ignoredr      s   $KAx\\%%'F;;zVW4E(F;GD"s"s""""s""""""4"""4""""""s"""""""==?D::::r   )__doc__builtinsr8   _pytest.assertion.rewrite	assertionrewriter6   rT   sysrb   pathlibr   pytestpathinsertr   __file__resolveparentsfixturer   rK   rX   rd   rp   rv   r   r   r   r   r   r   <module>r      s    <    
    3tH~--/77:; <  $## 1'4."r   