
    Ki                         d Z ddlZddlmc mZ ddlZddlm	Z	 ej                  j                  dd       dZdZdZde	d	dfd
Zdde	ded	e	fdZd Zd Zd Zd Zd Zd Zd Zy)u  
통합 테스트: _create_task_docs + three_docs_check.verify E2E 라이프사이클
task-1837_5.1 - 엔키 작성

흐름:
1. _create_task_docs로 3문서 생성 (mock 템플릿 사용)
2. 생성된 파일 존재 확인
3. three_docs_check.verify()로 검증 → WARN (status=draft)
4. plan.md status를 completed로 수정 후 → PASS
5. 디렉토리 없으면 → SKIP
6. 파일 누락 시 → FAIL
    N)Pathz/home/jay/workspaceu   ---
task_id: {task_id}
type: plan
scope: task
created: {date}
updated: {date}
status: draft
---

# 계획서: {task_id}
## 목표
테스트용 계획서
## 범위
테스트 범위
## 검증 기준
테스트 기준
u   ---
task_id: {task_id}
type: context
scope: task
created: {date}
updated: {date}
status: draft
---

# 맥락 노트: {task_id}
## 결정 근거
테스트 결정 근거
u   ---
task_id: {task_id}
type: checklist
scope: task
created: {date}
updated: {date}
status: draft
---

# 체크리스트: {task_id}
## Phase 1
- [x] A. 작업 항목 완료
- [x] B. 작업 항목 완료
tmp_pathreturnc                     | dz  dz  dz  }|j                  dd       |dz  j                  t        d       |d	z  j                  t        d       |d
z  j                  t        d       y)uA   tmp_path 아래 템플릿 디렉토리와 파일을 생성한다.prompts	templatesz	task-docsTparentsexist_okzplan.template.mdutf-8encodingzcontext-notes.template.mdzchecklist.template.mdN)mkdir
write_text_PLAN_TEMPLATE_CONTEXT_TEMPLATE_CHECKLIST_TEMPLATE)r   tmpl_dirs     =/home/jay/workspace/tests/integration/test_3docs_lifecycle.py_setup_templatesr   G   su    )#k1K?HNN4$N/""..~.P++778IT[7\''334GRY3Z    task_idc                    ddl }||j                  |d|        n| |_        |j                  |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  }t	        j                  d
      dz   d|iz  }t        t	        j                  |            dx}}|S )ue   dispatch._create_task_docs를 tmp_path WORKSPACE로 호출하고 결과 디렉토리를 반환한다.r   N	WORKSPACE   )level)is not)z%(py0)s is not %(py3)sresult)py0py3u&   _create_task_docs가 None을 반환함
>assert %(py5)spy5)dispatchsetattrr   _create_task_docs
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)	r   r   monkeypatch_dr   @py_assert2@py_assert1@py_format4@py_format6s	            r   _create_docsr5   P   s    BX6!!'!3FG6GGG6GGGGGG6GGG6GGGGGGGGGGGGGMr   c                 Z   t        |        d}t        | ||      }d}||z  }|j                  } |       }|st        j                  d      dz   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}}d}||z  }|j                  } |       }|st        j                  d	      dz   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}}d
}||z  }|j                  } |       }|st        j                  d      dz   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}}y)u_   _create_task_docs 호출 후 plan.md, context-notes.md, checklist.md가 생성되어야 한다.z	task-9001plan.mdu   plan.md 미생성zO
>assert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}docs_dir)r   py2r"   py7Nzcontext-notes.mdu   context-notes.md 미생성checklist.mdu   checklist.md 미생성)r   r5   existsr&   r,   r(   r)   r*   r+   r-   r.   )	r   r/   r   r8   r2   @py_assert3@py_assert4@py_assert6@py_format8s	            r   +test_create_task_docs_generates_three_filesrA   _   s   XGHg{;H ?Hy ? ((?(*?*??,???????H???H???y???(???*??????)QH))Q)11Q13Q3QQ5QQQQQQQHQQQHQQQ)QQQ1QQQ3QQQQQQ%IH~%I%--I-/I/II1IIIIIIIHIIIHIII~III-III/IIIIIIr   c                    t        |        d}t        | ||      }|dz  j                  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  }t        j                  d
      dz   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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}||v }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j
                  |      nddt        j                         v st        j                  |      rt        j
                  |      nddz  }
t        j                  d| d      dz   d|
iz  }t        t        j                  |            d}	y)u_   생성된 파일 내용에서 {task_id}와 {date} 플레이스홀더가 치환되어야 한다.z	task-9002r7   r   r   z	{task_id})not in)z%(py1)s not in %(py3)splan_content)py1r    u1   plan.md에 {task_id} 플레이스홀더 미치환r!   r"   Nz{date}u.   plan.md에 {date} 플레이스홀더 미치환in)z%(py0)s in %(py2)sr   )r   r9   u   plan.md에 task_id(u   ) 미포함z
>assert %(py4)spy4)r   r5   	read_textr&   r'   r+   r(   r)   r*   r,   r-   r.   )r   r/   r   r8   rD   @py_assert0r1   r3   r4   r2   @py_format3@py_format5s               r   +test_create_task_docs_replaces_placeholdersrM   j   s|   XGHg{;Hy(33W3EL_;l*___;l___;______l___l____,_______Y8<'YYY8<YYY8YYYYYY<YYY<YYYY)YYYYYYYl"NNN7lNNNNNN7NNN7NNNNNNlNNNlNNNN&9'+$NNNNNNNr   c                    t        |        d}t        | ||       ddlm}  ||t	        |             }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }t        j                  d
|d    d|d          dz   d|iz  }	t        t        j                  |	            dx}x}}g }
d}|d   }|j                  } |       }||v }|}|s d}|d   }|j                  } |       }||v }|}|sNt        j                  d|fd||f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }|
j                  |       |st        j                  dfdf      t        j                  |      t        j                        t        j                        t        j                  |      dz  }dd|iz  }|
j                  |       t        j                  |
d      i z  }dd|iz  }t        t        j                  |            dx}x}
x}x}x}x}x}x}x}x}x}}y)uB   생성 직후(status=draft) verify 결과는 WARN이어야 한다.z	task-9003r   verifyr   	workspacestatusWARN==z%(py1)s == %(py4)srE   rH   u   WARN 기대, 실제:  - message
>assert %(py6)spy6NdraftwarnrF   )zF%(py3)s in %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.lower
}()
})r    r\   py8py10z%(py12)spy12)zJ%(py15)s in %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.lower
}()
})py15py18py20py22z%(py24)spy24   zassert %(py27)spy27)r   r5   'teams.shared.verifiers.three_docs_checkrP   strr&   r'   r+   r,   r-   r.   lowerappend_format_boolop)r   r/   r   rP   r   rJ   r=   r1   rL   @py_format7r2   @py_assert5@py_assert7@py_assert9r>   @py_assert14@py_assert17@py_assert19@py_assert21@py_assert16@py_format11@py_format13@py_format23@py_format25@py_format26@py_format28s                             r   4test_three_docs_verify_returns_warn_for_draft_statusr}   x   s   XG7K0>Gs8}=F(gvgv%gggvggggggvggg)>vh?O>PPSTZ[dTeSf'ggggggggV7VfY'V'--V-/V7//V6VVI=NV=N=T=TV=T=VV6=V3VVVVV7/VVV7VVV'VVV-VVV/VVVVVVV6=VVVV6VVV=NVVV=TVVV=VVVVVVVVVVVVVVVVr   c                 (   t        |        d}t        | ||      }|dz  }|j                  d      }|j                  ddd      }|j	                  |d       dd	lm}  ||t        |       
      }|d   }	d}
|	|
k(  }|st        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }t        j                  d|d    d|d          dz   d|iz  }t        t        j                  |            dx}	x}}
y)uP   plan.md status를 completed로 수정한 후 verify 결과는 PASS여야 한다.z	task-9004r7   r   r   zstatus: draftzstatus: completedrg   r   rO   rQ   rS   PASSrU   rW   rX   u   PASS 기대, 실제: rY   rZ   r[   r\   N)r   r5   rI   replacer   ri   rP   rj   r&   r'   r+   r,   r-   r.   )r   r/   r   r8   	plan_pathcontentupdatedrP   r   rJ   r=   r1   rL   rn   s                 r   7test_three_docs_verify_returns_pass_after_status_updater      s    XGHg{;H 9$I!!7!3Gooo/BAFG73>Gs8}=F(gvgv%gggvggggggvggg)>vh?O>PPSTZ[dTeSf'ggggggggr   c                 n   ddl m}  |dt        |             }|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}}y)uH   3문서 디렉토리가 없으면 verify 결과는 SKIP이어야 한다.r   rO   ztask-nonexistent-99999rQ   rS   SKIPrU   rW   rX   u   SKIP 기대, 실제: r[   r\   N)	ri   rP   rj   r&   r'   r+   r,   r-   r.   )r   rP   r   rJ   r=   r1   rL   rn   s           r   5test_three_docs_verify_returns_skip_when_no_directoryr      s    >4HNF(QvQv%QQQvQQQQQQvQQQ)>vh?O>P'QQQQQQQQr   c                    t        |        d}t        | ||      }|dz  j                          ddlm}  ||t        |             }|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}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)u@   checklist.md가 없으면 verify 결과는 FAIL이어야 한다.z	task-9005r;   r   rO   rQ   rS   FAILrU   rW   rX      FAIL 기대, 실제: r[   r\   NrZ   rF   )z%(py1)s in %(py4)szassert %(py6)s)r   r5   unlinkri   rP   rj   r&   r'   r+   r,   r-   r.   )r   r/   r   r8   rP   r   rJ   r=   r1   rL   rn   s              r   5test_three_docs_verify_returns_fail_when_file_missingr      s    XGHg{;H &&(>Gs8}=F(QvQv%QQQvQQQQQQvQQQ)>vh?O>P'QQQQQQQQ.VI..>.....>....>...........r   c                    d}| dz  dz  dz  |z  }|j                  dd       ddlm}  ||t        |       	      }|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}}y)uU   3문서 디렉토리가 있지만 파일이 하나도 없으면 FAIL이어야 한다.z	task-9006memoryplanstasksTr	   r   rO   rQ   rS   r   rU   rW   rX   r   r[   r\   N)
r   ri   rP   rj   r&   r'   r+   r,   r-   r.   )
r   r   r8   rP   r   rJ   r=   r1   rL   rn   s
             r   :test_three_docs_verify_returns_fail_when_all_files_missingr      s    G("W,w6@HNN4$N/>Gs8}=F(QvQv%QQQvQQQQQQvQQQ)>vh?O>P'QQQQQQQQr   )N)__doc__builtinsr(   _pytest.assertion.rewrite	assertionrewriter&   syspathlibr   pathinsertr   r   r   r   rj   r5   rA   rM   r}   r   r   r   r    r   r   <module>r      s     
  ( )&  "[t [ [
4 
# 
D 
J	O
Wh(R/ 
Rr   