
    iM                    V   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
mZ ddlZddlZddlmZ  ed      Zddd	d
dddgg g i dddZ ej"                  d      d'd       Z ej"                  d      d(d       Zd)dZd*dZej,                  j/                  dg d      d+d       Zd*dZd*dZd*dZej,                  j/                  dg d      d,d       Zej,                  j/                  dg d       d-d!       Zej,                  j/                  d"g d#      d.d$       Zd*d%Zd*d&Z y)/us  tests/handoff/test_schema.py
handoff-schema.json 스키마 검증 테스트:
- test_schema_self_validity: Draft202012Validator.check_schema() PASS
- test_schema_required_fields: 필수 필드 누락 시 validation 실패
- test_schema_oneof_pending: pending_work + pending_work_path 동시 존재 시 fail
- test_schema_pattern_task_id: 잘못된 task-id 패턴 → fail
    )annotationsN)PathDraft202012ValidatorzN/home/jay/workspace/.worktrees/task-2454-dev4/memory/specs/handoff-schema.json	task-2454z1.0dev4ztask/task-2454-dev4abc1234def5678zscripts/start_task_guard.py	interruptz2026-05-05T12:00:00Z)task_idschema_versionprevious_botcurrent_branchbase_shahead_shachanged_pathsallowed_pathsforbidden_pathstest_resultshandoff_reason
created_atmodule)scopec                    t         j                  }  |        }|st        j                  dt                dz   dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }t        j                  t         j                  d            S )u   handoff-schema.json 로드.u   스키마 파일 없음: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}SCHEMA_PATH)py0py2py4Nzutf-8)encoding)r   exists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationjsonloads	read_text)@py_assert1@py_assert3@py_format5s      0/home/jay/workspace/tests/handoff/test_schema.pyschemar0   $   s     JJJJ#<[M!JJJJJJJ;JJJ;JJJJJJJJJJJJ::k++W+=>>    c                    t        |       S )u"   Draft202012Validator 인스턴스.r   )r0   s    r/   	validatorr3   +   s      ''r1   c                    	 t        j                  |        y# t        j                  $ r"}t	        j
                  d|        Y d}~yd}~ww xY w)uE   스키마 자체가 유효한 JSON Schema Draft 2020-12인지 확인.u    스키마 자체 검증 실패: N)r   check_schema
jsonschemaSchemaErrorpytestfail)r0   es     r/   test_schema_self_validityr;   5   sB    <))&1!! <6qc:;;<s    AAAc                   t        | j                  t                    }| }|st        j                  d|D cg c]  }|j
                   c}       dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}yc c}w )uI   유효한 기본 데이터가 스키마 검증을 통과하는지 확인.u#   유효한 데이터 검증 실패: 
>assert not %(py0)sr   errorsN)listiter_errors
VALID_BASEr!   r"   messager#   r$   r%   r&   r'   r(   )r3   r>   r,   r:   @py_format2s        r/   test_schema_valid_baserD   A   sv    )''
34F:Z:ZZ<QW=XAaii=X<YZZZZZZZvZZZvZZZZZZ=Xs   B=
missing_fieldc                ^   t        t              }||= t        | j                  |            }|st	        j
                  d| d      dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y)u8   필수 필드 누락 시 스키마 검증 실패 확인.u   필수 필드 'u(   ' 누락인데 검증 통과 (비정상)
>assert %(py0)sr   r>   NdictrA   r?   r@   r!   r"   r#   r$   r%   r&   r'   r(   )r3   rE   datar>   @py_format1s        r/   test_schema_required_fieldsrL   K   sp      
D])''-.F\\_]O3[\\\\\\\6\\\6\\\\\6r1   c                d   t        t              }d|d<   d|d<   t        | j                  |            }|s{t	        j
                  d      dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y	)
uA   pending_work + pending_work_path 동시 존재 시 검증 실패.u   잔여 작업 내용pending_work%memory/handoffs/task-2454-pending.txtpending_work_pathuQ   pending_work + pending_work_path 동시 존재인데 검증 통과 (oneOf 위반)rG   r   r>   NrH   r3   rJ   r>   rK   s       r/   &test_schema_oneof_pending_both_presentrR   e   s    
D1D GD	)''-.F   	\              6r1   c                   t        t              }d|d<   t        | j                  |            }| }|st	        j
                  d|D cg c]  }|j                   c}       dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            d}yc c}w )u)   pending_work만 있을 때 검증 통과.u%   잔여 작업 내용 (4000자 이하)rN   u3   pending_work 인라인만 있는데 검증 실패: r=   r   r>   NrI   rA   r?   r@   r!   r"   rB   r#   r$   r%   r&   r'   r(   r3   rJ   r>   r,   r:   rC   s         r/   %test_schema_oneof_pending_inline_onlyrV   p   s    
DBD)''-.F:j:jjLagMh\]aiiMhLijjjjjjjvjjjvjjjjjjMh   C
c                   t        t              }d|d<   t        | j                  |            }| }|st	        j
                  d|D cg c]  }|j                   c}       dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            d}yc c}w )u.   pending_work_path만 있을 때 검증 통과.rO   rP   u.   pending_work_path만 있는데 검증 실패: r=   r   r>   NrT   rU   s         r/   #test_schema_oneof_pending_path_onlyrY   x   s    
D GD	)''-.F:e:eeG\bHcWXHcGdeeeeeeeveeeveeeeeeHcrW   invalid_task_id)task2454z	TASK-2454ztask-abcztask-2454-dev4z  task-2454  ztask- c                b   t        t              }||d<   t        | j                  |            }|st	        j
                  d| d      dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y)u+   잘못된 task-id 패턴 → 검증 실패.r   u   잘못된 task-id 'u-   '인데 검증 통과 (패턴 검증 없음?)rG   r   r>   NrH   )r3   rZ   rJ   r>   rK   s        r/   #test_schema_pattern_task_id_invalidr^      s     
D%DO)''-.F   o..[\              6r1   valid_task_id)r   ztask-1z
task-99999ztask-2454.1z
task-100.2c           	        t        t              }||d<   d| d|d<   t        | j                  |            }| }|st	        j
                  d| d|D cg c]  }|j                   c}       dz   dd	t        j                         v st	        j                  |      rt	        j                  |      nd	iz  }t        t	        j                  |            d
}y
c c}w )u+   유효한 task-id 패턴 → 검증 통과.r   ztask/z-dev4r   u   유효한 task-id 'u   '인데 검증 실패: r=   r   r>   NrT   )r3   r_   rJ   r>   r,   r:   rC   s          r/   !test_schema_pattern_task_id_validra      s     
D#DO$]O59D	)''-.F: :   m_,CX^D_STQYYD_C`a              D_s   Cinvalid_reason)pausestop	INTERRUPTdoner\   c                b   t        t              }||d<   t        | j                  |            }|st	        j
                  d| d      dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y)u+   잘못된 handoff_reason → 검증 실패.r   u   잘못된 reason 'u   '인데 검증 통과rG   r   r>   NrH   )r3   rb   rJ   r>   rK   s        r/   "test_schema_invalid_handoff_reasonrh      su     
D+D	)''-.FMM''77LMMMMMMM6MMM6MMMMM6r1   c                Z   t        t              }d|d<   t        | j                  |            }|s{t	        j
                  d      dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y)uT   additionalProperties: false → 정의되지 않은 필드 추가 시 검증 실패.valueunexpected_fielduS   정의되지 않은 필드가 있는데 검증 통과 (additionalProperties 위반)rG   r   r>   NrH   rQ   s       r/   $test_schema_no_additional_propertiesrl      sh    
D&D	)''-.Fhhhhhhhhh6hhh6hhhhh6r1   c                Z   t        t              }d|d<   t        | j                  |            }|s{t	        j
                  d      dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            y)u1   pending_work가 4000자 초과 시 검증 실패.  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrN   uB   4000자 초과 pending_work인데 검증 통과 (maxLength 위반)rG   r   r>   NrH   rQ   s       r/   "test_schema_pending_work_maxlengthro      sg    
D%D)''-.FWWWWWWWWW6WWW6WWWWW6r1   )returnrI   )r0   rI   rp   'Draft202012Validator')r0   rI   )r3   rq   )r3   rq   rE   str)r3   rq   rZ   rr   )r3   rq   r_   rr   )r3   rq   rb   rr   )!__doc__
__future__r   builtinsr#   _pytest.assertion.rewrite	assertionrewriter!   r)   pathlibr   r6   r8   r   r   rA   fixturer0   r3   r;   rD   markparametrizerL   rR   rV   rY   r^   ra   rh   rl   ro    r1   r/   <module>r~      sq   #       +cd +34!(
  h?  ? h(  (<[  + ]]kf * -   + 		  ) , NNiXr1   