
    Si8                       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ZddlZddlmZ ddlZ ee      j#                         j$                  j$                  Zej(                  j+                  d ee             ddlmZmZmZmZ ddZdddZ G d d	      Zdd
ZddZ ddZ! G d d      Z"ejF                  d        Z$ G d d      Z%y)u  
test_memory_enforcement.py

task-2419 통합 회귀 테스트:
- Fix 1: scripts/hooks/pre-commit-memory-check.py (★ 마커 의무 검증)
- Fix 2: scripts/memory_violation_detector.py (위반 자동 감지 CLI)
- Fix 3: utils/memory_check.py 스키마 확장 (pending/acknowledged/structured)

격리: pytest tmp_path + 환경변수 override (WORKSPACE_ROOT, MEMORY_CHECK_FEEDBACK_DIR)
회귀 0: 기존 issue_mc 정상 발급 + memory_items_read 평면 배열 유지
    )annotationsN)Path)ack_mcget_mc_by_taskget_pending_mcsissue_mcc                $   | dz  }|j                          t        j                  g d|d       t        j                  g d|d       t        j                  g d|d       |dz  j                          |dz  dz  j                  d	d
       |S )u3   임시 git repo 초기화. workspace 구조 모방.repo)gitinit-qTcwdcheck)r   configz
user.emailzt@t)r   r   z	user.nametmemory	MEMORY.mdu   # WS Memory
- 일반 항목
utf-8encoding)mkdir
subprocessrun
write_text)tmp_pathr
   s     4/home/jay/workspace/tests/test_memory_enforcement.py
_init_repor   '   s    fDJJLNN(d$?NN9t4PNN6DM	H_	H_{"..(7 /  K    c                :   t         dz  dz  dz  }t        j                  j                         }t	        |       |d<   t	        | dz        |d<   |r|j                  |       t        j                  dt	        |      g| dd|	      }|j                  |j                  fS )
uL   pre-commit-memory-check.py를 임시 repo에서 실행. (exit_code, stderr).scriptshookszpre-commit-memory-check.pyWORKSPACE_ROOTanu_memory_nonexistMEMORY_CHECK_FEEDBACK_DIRpython3Tr   capture_outputtextenv)
r#   osenvironcopystrupdater   r   
returncodestderr)r
   	env_extra	hook_pathr*   results        r   _run_precommitr5   5   s    *W47SSI
**//
CIC'*42G+G'HC#$

9^^	C	N#F fmm++r   c                  $    e Zd Zd Zd Zd Zd Zy)TestFix1PreCommitMemoryCheckc                0   t        |      }|dz  }|j                  dd       t        j                  g d|d       t	        |      \  }}d}||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d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)u7   신규 feedback_*.md 파일 + ★ 미등록 → exit 1.feedback_new_rule.md   새 피드백
r   r   )r   addr9   Tr      ==z%(py0)s == %(py3)scodepy0py3assert %(py5)spy5Ninz%(py1)s in %(py3)serrpy1rC   r   r   r   r   r5   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)selfr   r
   fbr@   rI   @py_assert2@py_assert1@py_format4@py_format6@py_assert0s              r    test_block_unregistered_feedbackz=TestFix1PreCommitMemoryCheck.test_block_unregistered_feedbackH   s    (#**
'':=4tT"4(	ctqytqttq%,%,,,,%,,,%,,,,,,,,,,,,,,,,r   c                   t        |      }|dz  dz  j                  dd       |dz  }|j                  dd       t        j                  g d|d	
       t	        |      \  }}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}y)u9   ★ 마커로 MEMORY.md에 등록된 feedback → exit 0.r   r   u4   # WS Memory
★ feedback_new_rule.md — 신규 룰
r   r   r9   r:   )r   r;   zmemory/MEMORY.mdr9   Tr   r   r=   r?   r@   rA   rD   rE   NrL   
rU   r   r
   rV   r@   _rW   rX   rY   rZ   s
             r   test_pass_when_registeredz6TestFix1PreCommitMemoryCheck.test_pass_when_registeredT   s    (#	;	&22Dw 	3 	
 **
'':QW[cgh &atqytqttqr   c                   t        |      }|dz  }|j                  dd       t        j                  g d|d       t	        |dd	i
      \  }}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}y)u2   SKIP_MEMORY_CHECK=1 → 미등록이어도 exit 0.feedback_emergency.mdu   긴급
r   r   )r   r;   rb   Tr   SKIP_MEMORY_CHECK1)r2   r   r=   r?   r@   rA   rD   rE   NrL   r^   s
             r   test_skip_env_bypassz1TestFix1PreCommitMemoryCheck.test_skip_env_bypassb   s    (#++
j73>DPTU 2Es1KLatqytqttqr   c                   t        |      }|dz  }|j                  dd       t        j                  g d|d       t	        |      \  }}d}||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}y)u4   feedback_test_*.md 패턴 → 검사 제외, exit 0.feedback_test_fixture.mdztest fixture
r   r   )r   r;   rg   Tr   r   r=   r?   r@   rA   rD   rE   NrL   r^   s
             r   test_test_files_excludedz5TestFix1PreCommitMemoryCheck.test_test_files_excludedm   s    (#..
&9AtSWX &atqytqttqr   N)__name__
__module____qualname__r\   r`   re   rh    r   r   r7   r7   G   s    
-		r   r7   c                   t         dz  dz  }t        j                  j                         }t	        |       |d<   t        j                  dt	        |      g|| dd|      }|j                  |j                  |j                  fS )uF   detector CLI를 임시 repo에서 실행. (exit_code, stdout, stderr).r!   zmemory_violation_detector.pyr#   r&   Tr'   )
r#   r+   r,   r-   r.   r   r   r0   stdoutr1   )r
   argsclir*   r4   s        r   _run_detectorrq   ~   sy    
9
$'E
EC
**//
CIC^^	CH$t$F fmmV]]::r   c                f    | dz  dz  }|j                  dd       |dz  j                  |d       y)	u0   memory/specs/memory-violation-rules.yaml 작성.r   specsTparentsexist_okzmemory-violation-rules.yamlr   r   N)r   r   )r
   
rules_yamlspec_dirs      r   _seed_rulesry      s9    h(HNN4$N/--99*w9Wr   c                ^   |D ]U  \  }}| |z  }|j                   j                  dd       |j                  |d       t        j                  dd|g| d       W t        j                  ddd	d
d|g| d       t        j                  g d| ddd      j
                  j                         }|S )u*   파일 작성 + 커밋. commit SHA 반환.Trt   r   r   r   r;   r   commitr   z--no-verifyz-m)r   z	rev-parseHEAD)r   r(   r)   r   )parentr   r   r   r   rn   strip)r
   msgfilespathcontentfullshas          r   _commitr      s     Cgd{$6'2ud+TB	C
 NN	$tS9
 ..$$t$VZfUUW  Jr   c                  .    e Zd ZdZd Zd Zd Zd Zd Zy)TestFix2ViolationDetectora)  version: "1.0"
rules:
  - id: rule-A
    name: "Forbidden import"
    target: "changed_files"
    file_pattern: "*.py"
    pattern_regex: "^import forbidden_module"
    severity: high
    description: "Forbidden module import"
  - id: rule-B
    name: "Bad commit phrase"
    target: "commit_messages"
    pattern_regex: "BADWORD"
    severity: high
    description: "Bad commit phrase"
  - id: rule-C
    name: "MC pending"
    target: "log_entries"
    log_field: "pending"
    expected_value: false
    severity: medium
    description: "MC pending"
c                   t        |      }t        || j                         t        |ddg      }t	        |d|g      \  }}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d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)u    위반 없는 commit → exit 0.zclean: add module)ok.pyz
import os
--commitr   r=   r?   r@   rA   rD   rE   NPASSrF   rH   rn   rJ   r   ry   
RULES_YAMLr   rq   rM   rN   rO   rP   rQ   rR   rS   rT   )rU   r   r
   r   r@   rn   r_   rW   rX   rY   rZ   r[   s               r   test_clean_commit_passesz2TestFix2ViolationDetector.test_clean_commit_passes   s    (#D$//*d/2J1KL'z3.?@fatqytqttqvvvr   c                   t        |      }t        || j                         t        |ddg      }t	        |d|g      \  }}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d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)u3   changed_files 룰 위반 → exit 1, rule-A 보고.z	feat: add)zbad.pyimport forbidden_module
r   r<   r=   r?   r@   rA   rD   rE   Nrule-ArF   rH   r1   rJ   r   rU   r   r
   r   r@   r_   r1   rW   rX   rY   rZ   r[   s               r   test_changed_files_violationz6TestFix2ViolationDetector.test_changed_files_violation   s    (#D$//*+ GH
 (z3.?@atqytqttq!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r   c                   t        |      }t        || j                         t        |ddg      }t	        |d|g      \  }}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d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)u5   commit_messages 룰 위반 → exit 1, rule-B 보고.zfix: BADWORD merged)r   zx = 1
r   r<   r=   r?   r@   rA   rD   rE   Nzrule-BrF   rH   r1   rJ   r   r   s               r   test_commit_message_violationz7TestFix2ViolationDetector.test_commit_message_violation   s    (#D$//*d14H3IJ'z3.?@atqytqttq!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r   c           	     j   t        |      }t        || j                         |dz  dz  }|j                  t	        j
                  dddddgi      d	       t        |d
dg      \  }}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d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)u2   log_entries 룰: pending=True인 entry → exit 1.r   memory-check-log.jsoncheckszMC-0001task-XT)mc_idtask_idpendingr   r   z	--task-idr<   r=   r?   r@   rA   rD   rE   Nzrule-CrF   rH   r1   rJ   )r   ry   r   r   jsondumpsrq   rM   rN   rO   rP   rQ   rR   rS   rT   )rU   r   r
   log_filer@   r_   r1   rW   rX   rY   rZ   r[   s               r   test_log_entries_violationz4TestFix2ViolationDetector.test_log_entries_violation   s2   (#D$//*(?%<<JJ%.'/'+
  	 	
 ({H.EFatqytqttq!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r   c                ~   t        |      }t        || j                         t        |ddg       |dz  }|j	                  dd       t        j                  g d|d	       t        |d
g      \  }}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d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)u   --staged 모드 동작.r   )zseed.txtxevil.pyr   r   r   )r   r;   r   Tr   z--stagedr<   r=   r?   r@   rA   rD   rE   Nr   rF   rH   r1   rJ   )r   ry   r   r   r   r   r   rq   rM   rN   rO   rP   rQ   rR   rS   rT   )rU   r   r
   badr@   r_   r1   rW   rX   rY   rZ   r[   s               r   test_staged_modez*TestFix2ViolationDetector.test_staged_mode   s   (#D$//*f012Y2WE0d$G'zl;atqytqttq!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r   N)	ri   rj   rk   r   r   r   r   r   r   rl   r   r   r   r      s"    J0	 "	""2"r   r   c                r    | dz  }| dz  }|j                  dd       | dz  }|j                          |||dS )u   memory_check 모듈의 기본 경로를 tmp_path로 격리.

    feedback_dir는 비어있는 디렉토리로 두어 매칭 0건 보장.
    r   r   uA   # WS
★ 항목 1: 절대 X 금지
★ 항목 2: 항상 Y 수행
r   r   anu_feedback)log_pathmemory_pathfeedback_dir)r   r   )r   r   	memory_mdr   s       r   isolated_logr     s_     11H;&IN   n,L  $ r   c                  6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestFix3MCSchemac                   t        dd|d   |d   |d   d      }|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}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}t        |d   d      5 }t        j                  |      }	ddd       	d   d   }
|
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}||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}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}y# 1 sw Y   xY w)u@   issue_mc 직후 pending=True, acknowledged=False, acked_at=None.r   z	test descr   r   r   Tr   r   r   _skip_anu_memoryr   isz%(py1)s is %(py4)srK   py4assert %(py6)spy6NacknowledgedFr   r   r   acked_at)	r   rM   rN   rR   rS   rT   openr   load)rU   r   r4   r[   @py_assert3rW   @py_format5@py_format7fdatalasts              r   "test_issue_mc_pending_default_truez3TestFix3MCSchema.test_issue_mc_pending_default_true'  s   !*-$]3%n5!
 i (D( D(((( D((( (((D(((((((n%..%....%...%..........,z*W= 	 99Q<D	 H~b!I&$&$&&&&$&&&&&&$&&&&&&&N#,u,#u,,,,#u,,,#,,,u,,,,,,,J'4'4''''4''''''4'''''''	  	 s   )KKc                   t        dd|d   |d   |d   d      }|d   }t        |t              }|sd	d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            dx}}|d   }t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)u1   회귀 0: 평면 memory_items_read 배열 유지.ztask-Ytestr   r   r   Tr   memory_items_readz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancelist)rB   py2rC   rE   N   >=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slen)rB   r   r   py7zassert %(py9)spy9)r   r   r   rO   rP   rM   rQ   rR   rS   rT   r   rN   )rU   r   r4   rX   @py_assert4rZ   r   @py_assert6@py_assert5@py_format8@py_format10s              r   )test_issue_mc_memory_items_read_preservedz:TestFix3MCSchema.test_issue_mc_memory_items_read_preserved<  s9   !*-$]3%n5!
 !!45<z5t<<<<<<<<z<<<z<<<5<<<<<<t<<<t<<<<<<<<<<-.4s./414/14444/1444444s444s444.444/44414444444r   c                H   t        dd|d   |d   |d   d      }|d   }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}}|D ]  }	g d}
t        |
      }|j                  }|	j                  } |       } ||      }|s&ddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      t        j                  |      dt	        j
                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}
x}x}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}} y)uR   memory_items_structured: memory_item_id/source_path/item_type/ack_required 포함.ztask-Zr   r   r   r   Tr   memory_items_structuredr   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   items)rB   rK   rC   r   zassert %(py8)spy8N)memory_item_idsource_path	item_typeack_requiredzassert %(py13)s
{%(py13)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.issubset
}(%(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.keys
}()
})
}setit)rB   r   r   r   r   r   py11py13r   r   r   r   r   r   )r   r   rM   rN   rO   rP   rQ   rR   rS   rT   r   issubsetkeys)rU   r   r4   r   rW   r   r   r   @py_format9r   rX   r   @py_assert8@py_assert10@py_assert12@py_format14r[   r   s                     r   test_issue_mc_structured_itemsz/TestFix3MCSchema.test_issue_mc_structured_itemsJ  sz   !*-$]3%n5!
 015zQzQzQss55zQ 	.BU 3UV V__ 	_   v     I   I V  I W  I `  v    I  I  I  I       n%--%----%---%----------		.r   c                L   t        dd|d   |d   |d   d      }|d   t        |d   	      }d}||u }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}t        |d   d      5 }t        j                  |      }	ddd       t        fd	d   D              }
|
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}||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}||u}|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)uD   ack_mc 호출 후 pending=False, acknowledged=True, acked_at 기록.ztask-Ar   r   r   r   Tr   r   r   r   z%(py0)s is %(py3)sokrA   rD   rE   Nr   r   c              3  4   K   | ]  }|d    k(  s|  yw)r   Nrl   ).0er   s     r   	<genexpr>z7TestFix3MCSchema.test_ack_mc_success.<locals>.<genexpr>n  s     F1!G*2EQFs   r   r   Fr   r   r   r   r   r   is not)z%(py1)s is not %(py4)s)r   r   rM   rN   rO   rP   rQ   rR   rS   rT   r   r   r   next)rU   r   r4   r   rW   rX   rY   rZ   r   r   entryr[   r   r   r   r   s                  @r   test_ack_mc_successz$TestFix3MCSchema.test_ack_mc_success]  s   !*-$]3%n5!
 wEL$<=rTzrTrrT,z*W= 	 99Q<D	 FXFFY(5(5((((5((((((5(((((((^$,,$,,,,$,,,$,,,,,,,,,,Z ,, ,,,, ,,, ,,,,,,,,,,	  	 s   &JJ#c                   |d   j                   j                  dd       |d   j                  dd       t        d|d         }d	}||u }|st	        j
                  d
|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)u$   존재하지 않는 mc_id → False.r   Trt   z{"checks": []}r   r   zMC-9999r   Fr   r   r   rA   rD   rE   N)r}   r   r   r   rM   rN   rO   rP   rQ   rR   rS   rT   )rU   r   r   rW   rX   rY   rZ   s          r   test_ack_mc_unknown_idz'TestFix3MCSchema.test_ack_mc_unknown_ids  s     	Z ''--dT-JZ ++,<w+OIZ(@ArU{rUrrUr   c                ~   t        dd|d   |d   |d   d      }t        dd|d   |d   |d   d      }t        |d	   |d   
       t        |d   
      }|D ch c]  }|d	   	 }}|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}}|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c c}w )u/   get_pending_mcs: ack 안 된 entries만 반환.ztask-P1r   r   r   r   Tr   ztask-P2r   r   rF   rH   idsrJ   rD   rE   N)not in)z%(py1)s not in %(py3)s)r   r   r   rM   rN   rR   rO   rP   rQ   rS   rT   )rU   r   r1r2r   r   r   r[   rW   rY   rZ   s              r   test_get_pending_mcsz%TestFix3MCSchema.test_get_pending_mcs}  sT   !*-$]3%n5!
 !*-$]3%n5!
 	r'{\*%=>!<
+CD#*+aqz++'{!{c!!!!{c!!!{!!!!!!c!!!c!!!!!!!'{%{#%%%%{#%%%{%%%%%%#%%%#%%%%%%% ,s   F:c                   t        dd|d   |d   |d   d      }t        d|d         }d	}||u}|st        j                  d
|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      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}}	|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	)u6   get_mc_by_task: task_id로 가장 최근 entry 조회.ztask-Qr   r   r   r   Tr   r   Nr   )z%(py0)s is not %(py3)sr   rA   rD   rE   r   r=   )z%(py1)s == %(py4)sr   r   r   r   r   r   )
r   r   rM   rN   rO   rP   rQ   rR   rS   rT   )rU   r   rr   rW   rX   rY   rZ   r[   r   r   r   s               r   test_get_mc_by_taskz$TestFix3MCSchema.test_get_mc_by_task  s=   !*-$]3%n5!
 x,z2JK  uD    uD      u   u   D       W~+7+~++++~+++~++++++++++Y'4'4''''4''''''4'''''''r   N)
ri   rj   rk   r   r   r   r   r   r   r  rl   r   r   r   r   &  s%    (*5.&-,&4(r   r   )r   r   returnr   )N)r
   r   r2   zdict[str, str] | Noner  ztuple[int, str])r
   r   ro   z	list[str]r  ztuple[int, str, str])r
   r   rw   r.   r  None)r
   r   r   r.   r   zlist[tuple[str, str]]r  r.   )&__doc__
__future__r   builtinsrO   _pytest.assertion.rewrite	assertionrewriterM   r   r+   r   syspathlibr   pytest__file__resolver}   r#   r   insertr.   utils.memory_checkr   r   r   r   r   r5   r7   rq   ry   r   r   fixturer   r   rl   r   r   <module>r     s   
 #    	  
  h'')0077 3~& ' ,$/ /n;X$b" b"T  *@( @(r   