
    %~iQ                        d Z ddlZddlmc mZ ddlmZm	Z	m
Z
mZmZmZ ddlmZmZ  G d d      Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u>   
models_v2 단위 테스트
테스터: 모리건 (개발3팀)
    N)InsightType	InsightV2ThreadV2Stage1Result
CATEGORIESALL_CATEGORIES)ChatMessageMessageTypec                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestInsightTypeEnumu   InsightType enum 검증c                    t        t              }d}||k(  }|s%t        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                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        j                  dt        t               d      d	z   d
|iz  }t        t        j                  |            dx}x}}y)u6   InsightType enum에 7개의 값이 존재해야 한다   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   py0py1py3py6u/   InsightType 값 개수가 7개여야 하지만 u   개임
>assert %(py8)spy8N)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationself@py_assert2@py_assert5@py_assert4@py_format7@py_format9s         e/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/tests/test_models_v2.pytest_enum_has_seven_valuesz.TestInsightTypeEnum.test_enum_has_seven_values   s    ;p1p1$ppp1ppppppspppspppppp;ppp;pppppp1ppp(WX[\gXhWiio&pppppppp    c                 4   h d}t         D ch c]  }|j                   }}||k(  }|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||z
   d||z
   d	      d
z   d|iz  }t        t        j                  |            d}yc c}w )u?   InsightType 7개 값이 모두 올바르게 정의돼야 한다>   qawarningcase_analysispractical_tipexpert_opinionregulation_changeregulation_interpretationr   )z%(py0)s == %(py2)sactualexpected)r   py2u   InsightType 값 불일치: u	    초과, u    누락z
>assert %(py4)spy4N)r   valuer   r   r   r   r   r   r   r    r!   )r#   r5   er4   @py_assert1@py_format3@py_format5s          r)   test_enum_values_are_correctz0TestInsightTypeEnum.test_enum_values_are_correct   s    
 $//a!''//!wwwvwwwwwwvwwwvwwwwwwwwwwwww%@(AR@SS\]ehn]n\oov#wwwwwww 0s   Dc                    t         j                  }t        |t              }|s=t	        j
                  d      dz   dt        j                         v st	        j                  t              rt	        j                  t              nd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}}y)uG   InsightType은 str 서브클래스여야 한다 (JSON 직렬화 호환)u,   InsightType.QA가 str 인스턴스가 아님zO
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.QA
}, %(py4)s)
}
isinstancer   strr   r   r   r7   r   N)r   QAr?   r@   r   r   r   r   r   r   r    r!   )r#   r$   r%   r'   s       r)   test_enum_is_str_subclassz-TestInsightTypeEnum.test_enum_is_str_subclass+   s    %..^z.#.^.^^0^^^^^^^z^^^z^^^^^^+^^^+^^^.^^^^^^#^^^#^^^.^^^^^^r+   c                    t         j                  }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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr-   r   )z*%(py2)s
{%(py2)s = %(py0)s.QA
} == %(py5)sr   r   r6   py5assert %(py7)spy7)
r   rB   r   r   r   r   r   r   r    r!   r#   r:   r&   @py_assert3@py_format6@py_format8s         r)   test_qa_valuez!TestInsightTypeEnum.test_qa_value/   so    ~~%%~%%%%~%%%%%%{%%%{%%%~%%%%%%%%%%r+   c                    t         j                  }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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr1   r   )z6%(py2)s
{%(py2)s = %(py0)s.EXPERT_OPINION
} == %(py5)sr   rE   rG   rH   )
r   EXPERT_OPINIONr   r   r   r   r   r   r    r!   rI   s         r)   test_expert_opinion_valuez-TestInsightTypeEnum.test_expert_opinion_value2   sx    ))=-==)-=====)-======={==={===)===-========r+   c                    t         j                  }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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr.   r   )z/%(py2)s
{%(py2)s = %(py0)s.WARNING
} == %(py5)sr   rE   rG   rH   )
r   WARNINGr   r   r   r   r   r   r    r!   rI   s         r)   test_warning_valuez&TestInsightTypeEnum.test_warning_value5   st    ""/i/"i////"i//////{///{///"///i///////r+   c                    t         j                  }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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr2   r   )z9%(py2)s
{%(py2)s = %(py0)s.REGULATION_CHANGE
} == %(py5)sr   rE   rG   rH   )
r   REGULATION_CHANGEr   r   r   r   r   r   r    r!   rI   s         r)   test_regulation_change_valuez0TestInsightTypeEnum.test_regulation_change_value8   sx    ,,C0CC,0CCCCC,0CCCCCCC{CCC{CCC,CCC0CCCCCCCCr+   N)__name__
__module____qualname____doc__r*   r=   rC   rM   rP   rS   rV    r+   r)   r   r      s,    !qx_&>0Dr+   r   c                   @    e Zd ZdZdefdZd Zd Zd Zd Z	d Z
d	 Zy
)TestInsightV2RequiredFieldsu%   InsightV2 필수 필드 존재 확인returnc           	      D    t        ddt        j                  ddddg      S )Ninsight-001   테스트 인사이트   보상u   요약 내용입니다.
   포인트1u
   포인트2idtitletypecategorysummary
key_points)r   r   rB   r#   s    r)   _make_minimalz)TestInsightV2RequiredFields._make_minimalD   s*    *-$l3
 	
r+   c                 $   | j                         }d}t        ||      }|st        j                  d      dz   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  }t        t        j                  |            dx}}y)u    id 필드가 존재해야 한다re   u    InsightV2에 id 필드가 없음7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrobjr   r   r   rF   N
rl   ro   r   r   r   r   r   r   r    r!   r#   rp   r$   r&   rK   s        r)   test_id_field_existsz0TestInsightV2RequiredFields.test_id_field_existsN   s      " EwsD!E!EE#EEEEEEEwEEEwEEEEEEsEEEsEEEDEEE!EEEEEEr+   c                 $   | j                         }d}t        ||      }|st        j                  d      dz   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  }t        t        j                  |            dx}}y)u#   title 필드가 존재해야 한다rf   u#   InsightV2에 title 필드가 없음rn   ro   rp   rq   Nrr   rs   s        r)   test_title_field_existsz3TestInsightV2RequiredFields.test_title_field_existsS   s      "#KwsG$K$KK&KKKKKKKwKKKwKKKKKKsKKKsKKKGKKK$KKKKKKr+   c                 $   | j                         }d}t        ||      }|st        j                  d      dz   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  }t        t        j                  |            dx}}y)u"   type 필드가 존재해야 한다rg   u"   InsightV2에 type 필드가 없음rn   ro   rp   rq   Nrr   rs   s        r)   test_type_field_existsz2TestInsightV2RequiredFields.test_type_field_existsX   s      ""IwsF#I#II%IIIIIIIwIIIwIIIIIIsIIIsIIIFIII#IIIIIIr+   c                 $   | j                         }d}t        ||      }|st        j                  d      dz   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  }t        t        j                  |            dx}}y)u&   category 필드가 존재해야 한다rh   u&   InsightV2에 category 필드가 없음rn   ro   rp   rq   Nrr   rs   s        r)   test_category_field_existsz6TestInsightV2RequiredFields.test_category_field_exists]   s      "&QwsJ'Q'QQ)QQQQQQQwQQQwQQQQQQsQQQsQQQJQQQ'QQQQQQr+   c                 $   | j                         }d}t        ||      }|st        j                  d      dz   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  }t        t        j                  |            dx}}y)u%   summary 필드가 존재해야 한다ri   u%   InsightV2에 summary 필드가 없음rn   ro   rp   rq   Nrr   rs   s        r)   test_summary_field_existsz5TestInsightV2RequiredFields.test_summary_field_existsb   s      "%OwsI&O&OO(OOOOOOOwOOOwOOOOOOsOOOsOOOIOOO&OOOOOOr+   c                 $   | j                         }d}t        ||      }|st        j                  d      dz   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  }t        t        j                  |            dx}}y)u(   key_points 필드가 존재해야 한다rj   u(   InsightV2에 key_points 필드가 없음rn   ro   rp   rq   Nrr   rs   s        r)   test_key_points_field_existsz8TestInsightV2RequiredFields.test_key_points_field_existsg   s      "(UwsL)U)UU+UUUUUUUwUUUwUUUUUUsUUUsUUULUUU)UUUUUUr+   N)rW   rX   rY   rZ   r   rl   rt   rv   rx   rz   r|   r~   r[   r+   r)   r]   r]   A   s5    /
y 
F
L
J
R
P
Vr+   r]   c                   X    e Zd ZdZdefdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)TestInsightV2DefaultValuesu!   InsightV2 기본값 설정 확인r^   c                 @    t        ddt        j                  ddg       S )Nr`   u   기본값 테스트u   영업노하우   요약rd   )r   r   PRACTICAL_TIPrk   s    r)   rl   z(TestInsightV2DefaultValues._make_minimalu   s'    '**&
 	
r+   c                    | j                         }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u1   expert 기본값은 빈 문자열이어야 한다 r   z.%(py2)s
{%(py2)s = %(py0)s.expert
} == %(py5)srp   rE   u-   expert 기본값이 빈 문자열이 아님: 
>assert %(py7)srH   N)rl   expertr   r   r   r   r   r   r   reprr    r!   r#   rp   r:   r&   rJ   rK   rL   s          r)   $test_expert_defaults_to_empty_stringz?TestInsightV2DefaultValues.test_expert_defaults_to_empty_string   s      "zzcRczRccczRccccccscccsccczcccRccc#PQUVYV`V`QaPb!ccccccccr+   c                    | j                         }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u0   confidence 기본값은 'medium'이어야 한다mediumr   z2%(py2)s
{%(py2)s = %(py0)s.confidence
} == %(py5)srp   rE   u*   confidence 기본값이 medium이 아님: r   rH   N)rl   
confidencer   r   r   r   r   r   r   r   r    r!   r   s          r)   "test_confidence_defaults_to_mediumz=TestInsightV2DefaultValues.test_confidence_defaults_to_medium   s      "~~nn~)nnn~nnnnnnsnnnsnnn~nnnnnn-WX\]`]k]kXlWm+nnnnnnnnr+   c                    | j                         }|j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)	u6   related_topics 기본값은 빈 리스트여야 한다r   )z6%(py2)s
{%(py2)s = %(py0)s.related_topics
} == %(py5)srp   rE   u3   related_topics 기본값이 빈 리스트가 아님r   rH   N)rl   related_topicsr   r   r   r   r   r   r   r    r!   r   s          r)   *test_related_topics_defaults_to_empty_listzETestInsightV2DefaultValues.test_related_topics_defaults_to_empty_list   s      "!!_R_!R'___!R______s___s___!___R___+^_______r+   c                    | j                         }|j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)	u,   tags 기본값은 빈 리스트여야 한다r   )z,%(py2)s
{%(py2)s = %(py0)s.tags
} == %(py5)srp   rE   u)   tags 기본값이 빈 리스트가 아님r   rH   N)rl   tagsr   r   r   r   r   r   r   r    r!   r   s          r)    test_tags_defaults_to_empty_listz;TestInsightV2DefaultValues.test_tags_defaults_to_empty_list   s      "xxK2Kx2~KKKx2KKKKKKsKKKsKKKxKKK2KKK!JKKKKKKKr+   c                    | j                         }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u6   source_date 기본값은 빈 문자열이어야 한다r   r   )z3%(py2)s
{%(py2)s = %(py0)s.source_date
} == %(py5)srp   rE   u   source_date 기본값 오류: r   rH   N)rl   source_dater   r   r   r   r   r   r   r   r    r!   r   s          r)   )test_source_date_defaults_to_empty_stringzDTestInsightV2DefaultValues.test_source_date_defaults_to_empty_string         "^"^"$^^^"^^^^^^s^^^s^^^^^^"^^^(FtCOOG\F]&^^^^^^^^r+   c                    | j                         }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u6   source_chat 기본값은 빈 문자열이어야 한다r   r   )z3%(py2)s
{%(py2)s = %(py0)s.source_chat
} == %(py5)srp   rE   u   source_chat 기본값 오류: r   rH   N)rl   source_chatr   r   r   r   r   r   r   r   r    r!   r   s          r)   )test_source_chat_defaults_to_empty_stringzDTestInsightV2DefaultValues.test_source_chat_defaults_to_empty_string   r   r+   c                    | j                         }|j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)	u2   raw_thread 기본값은 빈 리스트여야 한다r   )z2%(py2)s
{%(py2)s = %(py0)s.raw_thread
} == %(py5)srp   rE   u/   raw_thread 기본값이 빈 리스트가 아님r   rH   N)rl   
raw_threadr   r   r   r   r   r   r   r    r!   r   s          r)   &test_raw_thread_defaults_to_empty_listzATestInsightV2DefaultValues.test_raw_thread_defaults_to_empty_list   s      "~~WW~#WWW~WWWWWWsWWWsWWW~WWWWWW'VWWWWWWWr+   c                    | j                         }|j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)	u4   participants 기본값은 빈 리스트여야 한다r   )z4%(py2)s
{%(py2)s = %(py0)s.participants
} == %(py5)srp   rE   u1   participants 기본값이 빈 리스트가 아님r   rH   N)rl   participantsr   r   r   r   r   r   r   r    r!   r   s          r)   (test_participants_defaults_to_empty_listzCTestInsightV2DefaultValues.test_participants_defaults_to_empty_list   s      "[2[2%[[[2[[[[[[s[[[s[[[[[[2[[[)Z[[[[[[[r+   c                    | j                         }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u3   question 기본값은 빈 문자열이어야 한다r   r   )z0%(py2)s
{%(py2)s = %(py0)s.question
} == %(py5)srp   rE   u   question 기본값 오류: r   rH   N)rl   questionr   r   r   r   r   r   r   r   r    r!   r   s          r)   &test_question_defaults_to_empty_stringzATestInsightV2DefaultValues.test_question_defaults_to_empty_string   s      "||UrU|r!UUU|rUUUUUUsUUUsUUU|UUUrUUU%@cllAS@T#UUUUUUUUr+   c                    | j                         }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u1   answer 기본값은 빈 문자열이어야 한다r   r   )z.%(py2)s
{%(py2)s = %(py0)s.answer
} == %(py5)srp   rE   u   answer 기본값 오류: r   rH   N)rl   answerr   r   r   r   r   r   r   r   r    r!   r   s          r)   $test_answer_defaults_to_empty_stringz?TestInsightV2DefaultValues.test_answer_defaults_to_empty_string   s      "zzOROzROOOzROOOOOOsOOOsOOOzOOOROOO#<T#**=M<N!OOOOOOOOr+   N)rW   rX   rY   rZ   r   rl   r   r   r   r   r   r   r   r   r   r   r[   r+   r)   r   r   r   sM    +
y 
d
o
`
L
_
_
X
\
V
Pr+   r   c                   "    e Zd ZdZd Zd Zd Zy)TestInsightV2Creationu   InsightV2 생성 가능 확인c           	      *   t        ddt        j                  ddddg      }|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  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}x}}|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  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}x}}|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}y)u1   필수 필드만으로 생성 가능해야 한다r`   u!   광응고술 수술 해당 여부rb   u>   광응고술은 약관 개정으로 수술에 해당합니다.u   약관 개정u   레이저 수술 포함rd   r   )z*%(py2)s
{%(py2)s = %(py0)s.id
} == %(py5)srp   rE   u   id 값 불일치r   rH   N)z-%(py2)s
{%(py2)s = %(py0)s.title
} == %(py5)su   title 값 불일치)zD%(py2)s
{%(py2)s = %(py0)s.type
} == %(py6)s
{%(py6)s = %(py4)s.QA
}r   )r   r6   r7   r   u   type 값 불일치r   r   )r   r   rB   re   r   r   r   r   r   r   r   r    r!   rf   rg   )
r#   rp   r:   r&   rJ   rK   rL   r%   r'   r(   s
             r)   test_create_with_minimal_fieldsz5TestInsightV2Creation.test_create_with_minimal_fields   s   5T')BC
 vv::v&:::v::::::s:::s:::v::::::(::::::::yyV?Vy??VVVy?VVVVVVsVVVsVVVyVVV?VVVAVVVVVVVVxx?;>>?x>)???x>??????s???s???x??????;???;???>???+????????r+   c                    t        d1i dddddt        j                  dddd	d
g ddddddddgdddgddddddgdddgddd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  }t	        j                  d$      d%z   d&|iz  }t        t	        j                  |            d'x}x}}|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  }t	        j                  d)      d%z   d&|iz  }t        t	        j                  |            d'x}x}}|j                  }t        |      }d*}||k(  }	|	s t	        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                  |      t	        j                  |      d-z  }
t	        j                  d.      d/z   d0|
iz  }t        t	        j                  |            d'x}x}x}	}y')2u+   모든 필드로 생성 가능해야 한다re   zinsight-002rf   u$   비만약 고지의무 면책 사례rg   rh      고지의무ri   uE   비만약 처방 미고지로 면책된 사례가 발생했습니다.rj   )u	   비만약u   고지의무 위반   면책r      이해철/프라임/부산r   highr   r   r   u
   #비만약u   #고지의무r   
2025-12-03r   u   보험설계사 커뮤니티r   u6   [이해철] 비만약 면책 사례가 나왔습니다r   u   박유진/인카/서울r   r   r   r   r   rp   rE   u   expert 값 불일치r   rH   Nr   u   confidence 값 불일치   )zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.key_points
})
} == %(py8)sr   r   r   r   rF   r   u   key_points 개수 불일치
>assert %(py10)spy10r[   )r   r   CASE_ANALYSISr   r   r   r   r   r   r   r   r    r!   r   rj   r   )r#   rp   r:   r&   rJ   rK   rL   r$   @py_assert7@py_assert6r(   @py_format11s               r)   test_create_with_all_fieldsz1TestInsightV2Creation.test_create_with_all_fields   sl    

8
 **
 $	

 \
 F
 0
 
 +H5
 0
 %
 7
 QQ
 78QR
 
  !
$ zzQ9Qz99QQQz9QQQQQQsQQQsQQQzQQQ9QQQ;QQQQQQQQ~~CC~'CCC~CCCCCCsCCCsCCC~CCCCCC)CCCCCCCC>>Fs>"FaF"a'FFF"aFFFFFFsFFFsFFFFFF3FFF3FFF>FFF"FFFaFFF)FFFFFFFFr+   c           	      V   t         D ]  }t        dd|ddg       }|j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      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x}}" y)u<   모든 InsightType enum 값으로 생성 가능해야 한다r`   u	   테스트u   기타r   rd   r   )z,%(py2)s
{%(py2)s = %(py0)s.type
} == %(py4)srp   insight_type)r   r6   r7   ztype=u    생성 실패
>assert %(py6)sr   N)r   r   rg   r   r   r   r   r   r   r   r    r!   )r#   r   rp   r:   rJ   r<   r'   s          r)   !test_type_accepts_all_enum_valuesz7TestInsightV2Creation.test_type_accepts_all_enum_values   s    ' 		RL !!! C 88Q8|+QQQ8|QQQQQQ3QQQ3QQQ8QQQQQQ|QQQ|QQQQu\N.-QQQQQQQQ		Rr+   N)rW   rX   rY   rZ   r   r   r   r[   r+   r)   r   r      s    (@G0Rr+   r   c                   :    e Zd ZdZdefdZd Zd Zd Zd Z	d Z
y	)
TestInsightV2ModelDumpu$   InsightV2.model_dump() 동작 확인r^   c           
      F    t        ddt        j                  dddgdd      S )	Nr`   ra   r   u   전문가 의견 요약rc   r   r   )re   rf   rg   rh   ri   rj   r   r   )r   r   rO   rk   s    r)   _make_insightz$TestInsightV2ModelDump._make_insight   s/    *++#-$~/	
 		
r+   c                    | j                         }|j                         }t        |t              }|s-t	        j
                  dt        |             dz   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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t        t	        j                  |            d}y)u+   model_dump()는 dict를 반환해야 한다u.   model_dump() 반환 타입이 dict가 아님: 7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r?   resultdictr   r   r6   r7   N)r   
model_dumpr?   r   r   r   rg   r   r   r   r   r    r!   )r#   rp   r   rJ   r<   s        r)   test_model_dump_returns_dictz3TestInsightV2ModelDump.test_model_dump_returns_dict  s      "!&$'h'hh+YZ^_eZfYg)hhhhhhhzhhhzhhhhhh&hhh&hhhhhh$hhh$hhh'hhhhhhr+   c                    | j                         }|j                         }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   }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	)u1   model_dump() 결과에 id 키가 있어야 한다re   inz%(py1)s in %(py3)sr   r   r   u$   model_dump() 결과에 id 키 없음
>assert %(py5)srF   Nr`   r   )z%(py1)s == %(py4)s)r   r7   u   id 값 불일치: r   r   )r   r   r   r   r   r   r   r   r   r    r!   )
r#   rp   r   @py_assert0r$   @py_format4rK   rJ   r<   r'   s
             r)   test_model_dump_contains_idz2TestInsightV2ModelDump.test_model_dump_contains_id  s      "!Etv~EEEtvEEEtEEEEEEvEEEvEEEEEEEEEEEd|Q}Q|},QQQ|}QQQ|QQQ}QQQ0B6$<..QQQQQQQQr+   c                    | j                         }|j                         }|d   }t        |t              }|st	        j
                  dt        |d                dz   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}}y)u]   model_dump() 결과의 type은 문자열이어야 한다 (InsightType이 str 서브클래스)rg   u   type이 str이 아님: 7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r?   r@   r   r6   r   rF   N)r   r   r?   r@   r   r   rg   r   r   r   r   r    r!   r#   rp   r   r:   r&   rK   s         r)   test_model_dump_type_is_stringz5TestInsightV2ModelDump.test_model_dump_type_is_string  s      "! .`z.#.`.``2I$vV\~J^I_0```````z```z```.``````#```#```.``````r+   c                    h d}| j                         }|j                         }|t        |j                               z
  }| }|s~t	        j
                  d|       dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            d}y)u<   model_dump() 결과에 필수 키가 모두 있어야 한다>   re   r   rg   rf   r   r   ri   rh   r   r   rj   r   r   r   r   r   u*   model_dump() 결과에 필수 키 누락: z
>assert not %(py0)sr   missingN)r   r   setkeysr   r   r   r   r   r   r    r!   )r#   required_keysrp   r   r   r:   @py_format2s          r)   *test_model_dump_contains_all_required_keyszATestInsightV2ModelDump.test_model_dump_contains_all_required_keys  s    
   "!#fkkm"44{R{RRH	RRRRRRR7RRR7RRRRRRr+   c                 b   | j                         }|j                         }|d   }t        |t              }|st	        j
                  d      dz   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}}y)u;   model_dump() 결과의 key_points는 리스트여야 한다rj   u!   key_points가 리스트가 아님r   r?   listr   N)r   r   r?   r   r   r   r   r   r   r   r    r!   r   s         r)   "test_model_dump_key_points_is_listz9TestInsightV2ModelDump.test_model_dump_key_points_is_list"  s      "! .Zz.5Z5ZZ7ZZZZZZZzZZZzZZZ.ZZZZZZZZZZZZ5ZZZZZZr+   N)rW   rX   rY   rZ   r   r   r   r   r   r   r   r[   r+   r)   r   r      s/    .

y 

iRaS[r+   r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestThreadV2u$   ThreadV2 생성 및 기본값 확인c                    t               }|j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)	u'   빈 ThreadV2 생성 가능해야 한다r   )z0%(py2)s
{%(py2)s = %(py0)s.messages
} == %(py5)sthreadrE   u-   messages 기본값이 빈 리스트가 아님r   rH   N)r   messagesr   r   r   r   r   r   r   r    r!   r#   r   r:   r&   rJ   rK   rL   s          r)   test_create_empty_threadz%TestThreadV2.test_create_empty_thread1  s    U"U"$UUU"UUUUUUvUUUvUUUUUU"UUU&UUUUUUUUr+   c                     t               }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u5   start_time 기본값은 빈 문자열이어야 한다r   r   z2%(py2)s
{%(py2)s = %(py0)s.start_time
} == %(py5)sr   rE   u   start_time 기본값 오류: r   rH   N)r   
start_timer   r   r   r   r   r   r   r   r    r!   r   s          r)   (test_start_time_defaults_to_empty_stringz5TestThreadV2.test_start_time_defaults_to_empty_string6  s      aBa B&aaa Baaaaaavaaavaaa aaaBaaa*GVM^M^H_G`(aaaaaaaar+   c                     t               }|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  }t        j                  dt        |j                               dz   d|iz  }t        t        j                  |            d	x}x}}y	)
u6   topic_label 기본값은 빈 문자열이어야 한다r   r   )z3%(py2)s
{%(py2)s = %(py0)s.topic_label
} == %(py5)sr   rE   u   topic_label 기본값 오류: r   rH   N)r   topic_labelr   r   r   r   r   r   r   r   r    r!   r   s          r)   )test_topic_label_defaults_to_empty_stringz6TestThreadV2.test_topic_label_defaults_to_empty_string;  s    !!dRd!R'ddd!Rddddddvdddvddd!dddRddd+I$vOaOaJbIc)ddddddddr+   c                    t               }|j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                         dz   d|iz  }t        t        j                  |            dx}x}}y)	u-   has_insight 기본값은 None이어야 한다Nisz3%(py2)s
{%(py2)s = %(py0)s.has_insight
} is %(py5)sr   rE   u   has_insight 기본값 오류: r   rH   )r   has_insightr   r   r   r   r   r   r   r    r!   r   s          r)   !test_has_insight_defaults_to_nonez.TestThreadV2.test_has_insight_defaults_to_none@  s    !!`T`!T)```!T``````v```v```!```T```-KFL^L^K_+````````r+   c                    t               }|j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)	u5   insight_types 기본값은 빈 리스트여야 한다r   z5%(py2)s
{%(py2)s = %(py0)s.insight_types
} == %(py5)sr   rE   u2   insight_types 기본값이 빈 리스트가 아님r   rH   N)r   insight_typesr   r   r   r   r   r   r   r    r!   r   s          r)   )test_insight_types_defaults_to_empty_listz6TestThreadV2.test_insight_types_defaults_to_empty_listE  s    ##`r`#r)```#r``````v```v```#```r```-_```````r+   c                    t        ddddt        j                        g}t        |d      }|j                  }t        |      }d}||k(  }|s t        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                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}}|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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}	x}
}y)u:   메시지를 포함한 ThreadV2 생성 가능해야 한다r   17:00   질문자/인카/서울u   질문입니다datetimeusercontentrg   2025-12-03 17:00r   r      r   )zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.messages
})
} == %(py8)sr   r   r   u   메시지 개수 불일치r   r   Nr   rE   u   start_time 값 불일치r   rH   )r	   r
   MESSAGEr   r   r   r   r   r   r   r   r   r   r    r!   r   )r#   r   r   r$   r&   r   r   r(   r   r:   rJ   rK   rL   s                r)   test_create_with_messagesz&TestThreadV2.test_create_with_messagesJ  si    !.) ((
 88JK??Fs?#FqF#q(FFF#qFFFFFFsFFFsFFFFFF6FFF6FFF?FFF#FFFqFFF*FFFFFFFF  R$6R $66RRR $6RRRRRRvRRRvRRR RRR$6RRR8RRRRRRRRr+   c                 <   t        ddg      }|j                  }d}||u }|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}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y
)u1   has_insight를 True로 설정 가능해야 한다Tr-   )r   r   r   r   r   rE   rG   rH   Nr   )z5%(py1)s in %(py5)s
{%(py5)s = %(py3)s.insight_types
})r   r   rF   )r   r   r   r   r   r   r   r   r    r!   r   )	r#   r   r:   r&   rJ   rK   rL   r   r$   s	            r)   test_set_has_insight_truez&TestThreadV2.test_set_has_insight_trueY  s    d4&A!!)T)!T))))!T))))))v)))v)))!)))T)))))))+v+++t+++++t++++t++++++v+++v+++++++++++r+   c                    t               }t               }|j                  j                  d       |j                  }g }||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  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}x}}y	)
uk   ThreadV2 인스턴스 간 insight_types 리스트가 공유되지 않아야 한다 (dataclass field 격리)r-   r   r   t2rE   uW   ThreadV2 인스턴스 간 insight_types 리스트가 공유됨 (dataclass field 버그)r   rH   N)r   r   appendr   r   r   r   r   r   r   r    r!   )r#   t1r  r:   r&   rJ   rK   rL   s           r)   test_insight_types_isolationz)TestThreadV2.test_insight_types_isolation_  s    ZZ
%  	A2  	A2%  	A  	A  	A2  	A  	A  	A  	A  	A  	Ar  	A  	A  	Ar  	A  	A  	A  	A  	A  	A2  	A  	A  	A  (A  	A  	A  	A  	A  	A  	A  	Ar+   N)rW   rX   rY   rZ   r   r   r   r   r   r  r
  r  r[   r+   r)   r   r   .  s4    .V
b
e
a
a
S,Ar+   r   c                   :    e Zd ZdZdefdZd Zd Zd Zd Z	d Z
y	)
TestStage1Resultu%   Stage1Result 생성 및 필드 확인r^   c           	      V    t        t        ddddt        j                        gd      S )Nr   r   r   u   #궁금증
질문입니다r   r  r  )r   r	   r
   r  rk   s    r)   _make_threadzTestStage1Result._make_threado  s6    % 29$,, *
 	
r+   c                    | j                         }t        |ddg      }|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}x}}|j                  }dg}||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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}x}}y)u;   has_insight=True로 Stage1Result 생성 가능해야 한다Tr-   r   r   r   r   r   r   rE   u   has_insight 값 불일치r   rH   Nr   r   u   insight_types 값 불일치)r  r   r   r   r   r   r   r   r   r   r    r!   r   r#   r   r   r:   r&   rJ   rK   rL   s           r)   !test_create_with_has_insight_truez2TestStage1Result.test_create_with_has_insight_true}  s%   ""$&

 !!FTF!T)FFF!TFFFFFFvFFFvFFF!FFFTFFF+FFFFFFFF##LvL#v-LLL#vLLLLLLvLLLvLLL#LLLvLLL/LLLLLLLLr+   c                    | j                         }t        |dg d      }|j                  }d}||u }|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}||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  }t        j                  d      dz   d	|iz  }t        t        j                  |            d
x}x}}y
)uA   has_insight=False + noise_reason으로 생성 가능해야 한다Fu   단순 인사 메시지)r   r   r   noise_reasonr   r   r   rE   rG   rH   Nr   z4%(py2)s
{%(py2)s = %(py0)s.noise_reason
} == %(py5)su   noise_reason 값 불일치r   )r  r   r   r   r   r   r   r   r   r    r!   r  r   r  s           r)   "test_create_with_has_insight_falsez3TestStage1Result.test_create_with_has_insight_false  s   ""$2	
 !!*U*!U****!U******v***v***!***U*******""]&?]"&??]]]"&?]]]]]]v]]]v]]]"]]]&?]]]A]]]]]]]]r+   c                 (   | j                         }t        |dg       }|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  }t        j                  dt        |j                               d	z   d
|iz  }t        t        j                  |            dx}x}}y)u7   noise_reason 기본값은 빈 문자열이어야 한다Tr  r   r   r  r   rE   u   noise_reason 기본값 오류: r   rH   N)r  r   r  r   r   r   r   r   r   r   r   r    r!   r  s           r)   *test_noise_reason_defaults_to_empty_stringz;TestStage1Result.test_noise_reason_defaults_to_empty_string  s    ""$VRP""gbg"b(ggg"bggggggvgggvggg"gggbggg,KDQWQdQdLeKf*ggggggggr+   c                    | j                         }t        |ddg      }|j                  }t        |t              }|s5t        j                  d      dz   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                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
x}}y
)u3   thread 필드가 ThreadV2 인스턴스여야 한다Tr1   r  u#   thread 필드가 ThreadV2가 아님zS
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.thread
}, %(py4)s)
}r?   r   r   rA   N)r  r   r   r?   r   r   r   r   r   r   r   r    r!   )r#   r   r   r$   r%   r'   s         r)   test_thread_field_is_thread_v2z/TestStage1Result.test_thread_field_is_thread_v2  s    ""$VN^M_` --Yz-2Y2YY4YYYYYYYzYYYzYYYYYY&YYY&YYY-YYYYYYYYYYYY2YYYYYYr+   c                    | j                         }t        |dddg      }|j                  }t        |      }d}||k(  }|s t	        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                  |      t	        j                  |      d
z  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}x}x}}y)u9   insight_types에 여러 값이 저장 가능해야 한다Tr-   r1   r     r   )zS%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.insight_types
})
} == %(py8)sr   r   r   u&   insight_types 복수 값 저장 실패r   r   N)r  r   r   r   r   r   r   r   r   r   r   r    r!   )	r#   r   r   r$   r&   r   r   r(   r   s	            r)   "test_insight_types_multiple_valuesz3TestStage1Result.test_insight_types_multiple_values  s    ""$!12

 ''Ws'(WAW(A-WWW(AWWWWWWsWWWsWWWWWW6WWW6WWW'WWW(WWWAWWW/WWWWWWWWr+   N)rW   rX   rY   rZ   r   r  r  r  r  r  r"  r[   r+   r)   r  r  l  s/    /
h 
	M
^hZXr+   r  c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestCategoriesDictu   CATEGORIES dict 검증c                    t        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  }t        j                  d| d      dz   d	|iz  }t        t        j                  |            d
x}}y
)uC   CATEGORIES dict에 15개 이상의 카테고리가 있어야 한다   )>=)z%(py0)s >= %(py3)scount)r   r   u-   CATEGORIES 카테고리 수가 15개 미만: u   개r   rF   N)r   r   r   r   r   r   r   r   r   r    r!   )r#   r(  r$   r:   r   rK   s         r)   'test_categories_has_at_least_15_entriesz:TestCategoriesDict.test_categories_has_at_least_15_entries  sv    JVu{VVVuVVVVVVuVVVuVVVVVVKE7RUVVVVVVVr+   c                    t        t        t              }|s9t        j                  dt        t                     dz   dt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u)   CATEGORIES는 dict 타입이어야 한다u   CATEGORIES가 dict가 아님: r   r?   r   r   r   N)r?   r   r   r   r   rg   r   r   r   r   r    r!   r#   rJ   r<   s      r)   test_categories_is_dictz*TestCategoriesDict.test_categories_is_dict  s    *d+`+``/MdS]N^M_-```````z```z``````*```*``````d```d```+``````r+   c                    d}|t         v }|st        j                  d|fd|t         f      t        j                  |      dt	        j
                         v st        j                  t               rt        j                  t               nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u7   CATEGORIES에 '보상' 카테고리가 있어야 한다rb   r   r   r   r   u*   CATEGORIES에 '보상' 카테고리 없음r   rF   N
r   r   r   r   r   r   r   r   r    r!   r#   r   r$   r   rK   s        r)      test_categories_contains_보상u2   TestCategoriesDict.test_categories_contains_보상  sg    Sx:%SSSx:SSSxSSSSSS:SSS:SSSS'SSSSSSSr+   c                    d}|t         v }|st        j                  d|fd|t         f      t        j                  |      dt	        j
                         v st        j                  t               rt        j                  t               nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u=   CATEGORIES에 '고지의무' 카테고리가 있어야 한다r   r   r   r   r   u0   CATEGORIES에 '고지의무' 카테고리 없음r   rF   Nr.  r/  s        r)   %   test_categories_contains_고지의무u8   TestCategoriesDict.test_categories_contains_고지의무  g    _~+___~___~_____________-_______r+   c                    d}|t         v }|st        j                  d|fd|t         f      t        j                  |      dt	        j
                         v st        j                  t               rt        j                  t               nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u=   CATEGORIES에 '약관해석' 카테고리가 있어야 한다u   약관해석r   r   r   r   u0   CATEGORIES에 '약관해석' 카테고리 없음r   rF   Nr.  r/  s        r)   %   test_categories_contains_약관해석u8   TestCategoriesDict.test_categories_contains_약관해석  r3  r+   c                    d}|t         v }|st        j                  d|fd|t         f      t        j                  |      dt	        j
                         v st        j                  t               rt        j                  t               nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u=   CATEGORIES에 '상품비교' 카테고리가 있어야 한다u   상품비교r   r   r   r   u0   CATEGORIES에 '상품비교' 카테고리 없음r   rF   Nr.  r/  s        r)   %   test_categories_contains_상품비교u8   TestCategoriesDict.test_categories_contains_상품비교  r3  r+   c           	         t        j                         D ]K  \  }}t        |t              }|s0t	        j
                  d| dt        |             dz   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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t        t	        j                  |            d}N y)	u/   CATEGORIES의 각 값은 리스트여야 한다zCATEGORIES['u   '] 값이 리스트가 아님: r   r?   r8   r   r   N)r   itemsr?   r   r   r   rg   r   r   r   r   r    r!   )r#   keyr8   rJ   r<   s        r)    test_categories_values_are_listsz3TestCategoriesDict.test_categories_values_are_lists  s    $**, 	mJCeT*l*lll3%?^_cdi_j^k,lllllll:lll:llllllelllellllllTlllTlll*llllll	mr+   N)rW   rX   rY   rZ   r)  r,  r0  r2  r5  r7  r;  r[   r+   r)   r$  r$    s/     W
aT```mr+   r$  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestAllCategoriesu   ALL_CATEGORIES 리스트 검증c                 j   t        t              }d}||kD  }|st        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                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        j                  d      dz   d	|iz  }t        t        j                  |            d
x}x}}y
)u/   ALL_CATEGORIES가 비어있지 않아야 한다r   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr   r   r   u   ALL_CATEGORIES가 비어있음r   r   N)r   r   r   r   r   r   r   r   r   r    r!   r"   s         r)    test_all_categories_is_not_emptyz2TestAllCategories.test_all_categories_is_not_empty  s    >"HQH"Q&HHH"QHHHHHHsHHHsHHHHHH>HHH>HHH"HHHQHHH(HHHHHHHHr+   c                    t        t        t              }|s9t        j                  dt        t                     dz   dt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u(   ALL_CATEGORIES는 리스트여야 한다u'   ALL_CATEGORIES가 리스트가 아님: r   r?   r   r   r   N)r?   r   r   r   r   rg   r   r   r   r   r    r!   r+  s      r)   test_all_categories_is_listz-TestAllCategories.test_all_categories_is_list  s    .$/q/qq3Z[_`n[oZp1qqqqqqqzqqqzqqqqqq.qqq.qqqqqq$qqq$qqq/qqqqqqr+   c                    t         D ]E  }t        |t              }|s-t        j                  dt        |             dz   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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}H y)u<   ALL_CATEGORIES의 모든 항목이 문자열이어야 한다u5   ALL_CATEGORIES에 문자열이 아닌 항목 있음: r   r?   itemr@   r   N)r   r?   r@   r   r   r   r   r   r   r   r    r!   )r#   rD  rJ   r<   s       r)   $test_all_categories_contains_stringsz6TestAllCategories.test_all_categories_contains_strings  s    " 	oDdC(n(nn,abfgkblam*nnnnnnn:nnn:nnnnnndnnndnnnnnnCnnnCnnn(nnnnnn	or+   c                 *   t        d t        D              }|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)uX   ALL_CATEGORIES에 '보상/자동차' 같은 서브카테고리가 포함되어야 한다c              3   $   K   | ]  }d |v  
 yw)u   보상/Nr[   ).0cats     r)   	<genexpr>uP   TestAllCategories.test_all_categories_contains_보상_subpath.<locals>.<genexpr>  s     H#Y#-Hs   u8   ALL_CATEGORIES에 '보상/' 서브카테고리가 없음z
>assert %(py0)sr      has_보상_subN)
anyr   r   r   r   r   r   r   r    r!   )r#   rK  @py_format1s      r)   +   test_all_categories_contains_보상_subpathu=   TestAllCategories.test_all_categories_contains_보상_subpath  sP     HHHYYYYYYYYY~YYY~YYYYY~r+   c                 |   t        t              }t        t              }t        |      }||k(  }|st        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                  t              rt        j                  t              ndt        j                  |      dt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        j                  d      dz   d	|iz  }t        t        j                  |            d
x}x}x}}y
)u3   ALL_CATEGORIES에 중복 항목이 없어야 한다r   )zn%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py11)s
{%(py11)s = %(py5)s(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
})
}r   r   r   )r   r   r   rF   r   rH   py9py11u)   ALL_CATEGORIES에 중복 항목이 있음z
>assert %(py13)spy13N)r   r   r   r   r   r   r   r   r   r   r    r!   )r#   r$   @py_assert8@py_assert10r&   @py_format12@py_format14s          r)   !test_all_categories_no_duplicatesz3TestAllCategories.test_all_categories_no_duplicates  s   >"k#n*=kc*=&>k"&>>kkk"&>kkkkkkskkkskkkkkk>kkk>kkk"kkkkkkckkkckkkkkk#kkk#kkkkkknkkknkkk*=kkk&>kkk@kkkkkkkkr+   N)	rW   rX   rY   rZ   r@  rB  rE  rN  rW  r[   r+   r)   r=  r=    s#    )Iro
Zlr+   r=  )rZ   builtinsr   _pytest.assertion.rewrite	assertionrewriter   kakao_knowledge.models_v2r   r   r   r   r   r   kakao_knowledge.modelsr	   r
   r   r]   r   r   r   r   r  r$  r=  r[   r+   r)   <module>r^     s        <#D #DV)V )Vb=P =PJ4R 4Rx3[ 3[v6A 6A|<X <XHm mNl lr+   