
    wi.                        d Z ddlZddlmc mZ ddlZddlZddl	m
Z
  e
e      j                  dz  Zej                  d        Z G d d      Z G d d	      Z G d
 d      Z G d d      Zedk(  r ej*                  edg       yy)ug   
Golden Test Set 검증 테스트

작업: task-185.1
목적: golden-test-set.json의 무결성 검증
    N)Pathzgolden-test-set.jsonc                  |    t        t        dd      5 } t        j                  |       cddd       S # 1 sw Y   yxY w)u    Golden test set 데이터 로드rutf-8encodingN)openGOLDEN_TEST_SET_PATHjsonload)fs    @/home/jay/projects/insuwiki/tests/golden/test_golden_test_set.pygolden_datar      s3     
"C'	: ayy|  s   2;c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestGoldenTestSetIntegrityu#   Golden Test Set 무결성 테스트c                    t        t        dd      5 }t        j                  |      }ddd       t	        t
              }|sd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}t        |      }d
}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   ;xY w)u"   JSON 파일이 유효한지 확인r   r   r   Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancedatalist)py0py1py2py4r   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenr   r   py3py6zassert %(py8)spy8)r	   r
   r   r   r   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationr   _call_reprcompare)
selfr   r   @py_assert3@py_format5@py_assert2@py_assert5@py_assert4@py_format7@py_format9s
             r   test_json_validz*TestGoldenTestSetIntegrity.test_json_valid   sF   &g> 	 !99Q<D	 $%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%4y1y1}y1ss44y1	  	 s   I""I,c                 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                  |      dz  }t        j                  dt        |             dz   d	|iz  }t        t        j                  |            d
x}x}}y
)u7   총 항목 수가 215건인지 확인 (200 + 15 추가)   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   r   zExpected 215 items, got 
>assert %(py8)sr   N)
r   r"   r'   r    r!   r#   r$   _format_assertmsgr%   r&   )r(   r   r+   r,   r-   r.   r/   s          r   test_total_countz+TestGoldenTestSetIntegrity.test_total_count!   s    ;U3U3&UUU3UUUUUUsUUUsUUUUUU;UUU;UUUUUU3UUU*B3{CSBT(UUUUUUUU    c                    |D cg c]  }|d   	 }}|D cg c]  }|j                  |      dkD  s| }}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                  |      dz  }	t        j                  d	t        |             d
z   d|	iz  }
t        t        j                  |
            dx}x}}yc c}w c c}w )u   ID 중복이 없는지 확인id   r   r3   r5   r   
duplicatesr   zDuplicate IDs found: r6   r   N)countr   r"   r'   r    r!   r#   r$   r7   setr%   r&   )r(   r   itemidsr;   r=   r+   r,   r-   r.   r/   s              r   test_no_duplicate_idsz0TestGoldenTestSetIntegrity.test_no_duplicate_ids%   s    &12dtDz22#&<R#))B-!*;b<
<:N!N!#NNN!NNNNNNsNNNsNNNNNN:NNN:NNNNNN!NNN'<S_<M%NNNNNNNN 3<s   E+E0E0c                     g d}|D ]  }|D ]  }||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|j                  d	d
             dz   d|iz  }t        t        j                  |            d}  y)u.   모든 필수 필드가 존재하는지 확인)r;   categoryquestionexpected_answer_containsexpected_answer_not_containssource_articlerisk_scenario
difficultyin)z%(py0)s in %(py2)sfieldr@   )r   r   zMissing field 'z' in r;   unknownz
>assert %(py4)sr   N)
r"   r'   r    r!   r#   r$   r7   getr%   r&   )r(   r   required_fieldsr@   rM   @py_assert1@py_format3r*   s           r   test_required_fields_presentz7TestGoldenTestSetIntegrity.test_required_fields_present+   s    

   	`D( `}___u______u___u_____________weDHHTS\D]C^&_______`	`r9   c                    ddl m}  |d |D              }dddddd}|j                         D ]  \  }}|j                  }d} |||      }	|	|k(  }
|
srt	        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t	        j                  |      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  d| d| d|j                  |d             dz   d|iz  }t        t	        j                  |            dx}x}x}	}
 y)u   카테고리 분포 확인r   Counterc              3   &   K   | ]	  }|d      yw)rD   N .0r@   s     r   	<genexpr>zHTestGoldenTestSetIntegrity.test_category_distribution.<locals>.<genexpr>9   s     F$T*-F   P   -      )hallucination_defensesearch_qualitylegal_boundary	edge_casesecurityr3   )zR%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py3)s, %(py5)s)
} == %(py9)s
categoriescatr>   )r   r   r   py5py7py9z
Category 'z': expected z, got z
>assert %(py11)spy11N)collectionsrV   itemsrO   r"   r'   r    r!   r#   r$   r7   r%   r&   )r(   r   rV   re   expectedrf   r>   rQ   r-   @py_assert6@py_assert8@py_format10@py_format12s                r   test_category_distributionz5TestGoldenTestSetIntegrity.test_category_distribution6   s   'F+FF
 &(  
 #..* 	TJC>> Tq T>#q) T)U2 T TBSBST)U T TMSVT T;S;S  T TJS)  T TJS) " T TMSVT T;S;S #& T TJS) #& T TJS) () T TJS) * T TMSVT T;S;S .3 T TJS) .3 T TBSBS*SEeWF:>>#q;Q:RST T T@S@ST T T	Tr9   N)	__name__
__module____qualname____doc__r0   r8   rB   rS   rr   rX   r9   r   r   r      s"    -VO	`Tr9   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestNewItemsC021toC030u#   C-021~C-030 신규 항목 테스트c                    |D ch c]  }|d   	 }}t        dd      D ch c]  }d|d
 }}||z
  }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                  |      dz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}x}	}yc c}w c c}w )u,   C-021~C-030 항목이 존재하는지 확인r;         C-03dr   r3   r5   r   missingr   Missing IDs: r6   r   Nranger   r"   r'   r    r!   r#   r$   r7   r%   r&   r(   r   r@   rA   iexpected_idsr~   r+   r,   r-   r.   r/   s               r   test_c021_to_c030_presentz0TestNewItemsC021toC030.test_c021_to_c030_presentK       &12dtDz22.3Bm<"QsG<<$7|;q;|q ;;;|q;;;;;;s;;;s;;;;;;7;;;7;;;|;;;q;;;M'";;;;;;;;	 3<
   E E%c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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"   C-021: 특약 가입 여부 확인c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zC-021NrX   rZ   r   s     r   r[   zJTestNewItemsC021toC030.test_c021_special_contract_check.<locals>.<genexpr>U        B1qw'/AQB   Nis notz%(py0)s is not %(py3)sr@   r   r   assert %(py5)srg   rD   rb   r3   z%(py1)s == %(py4)sr   r   assert %(py6)sr   u   보험증권 확인rF   rK   z%(py1)s in %(py4)su   포함되어 있습니다rG   	nextr"   r'   r    r!   r#   r$   r%   r&   r(   r   r@   r+   rQ   @py_format4@py_format6@py_assert0r)   r*   r.   s              r    test_c021_special_contract_checkz7TestNewItemsC021toC030.test_c021_special_contract_checkS   so   BBDIt4t4tt4J3#33#33333#3333333#33333333$H-G(HH$(HHHHH$(HHHH$HHH(HHHHHHHH*Rd3Q.RR*.RRRRR*.RRRR*RRR.RRRRRRRRr9   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}d	}|d
   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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(   C-023: 보험사기 모의 질문 차단c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zC-023NrX   r   s     r   r[   zMTestNewItemsC021toC030.test_c023_fraud_prevention_question.<locals>.<genexpr>]   r   r   Nr   r   r@   r   r   rg   u!   도움을 드릴 수 없습니다rF   rK   r   r   r   r   u   보험 사기r   r   s              r   #test_c023_fraud_prevention_questionz:TestNewItemsC021toC030.test_c023_fraud_prevention_question[   s   BBDIt4t4tt42Vd;U6VV26VVVVV26VVVV2VVV6VVVVVVVVB$'A"BB"BBBBB"BBBBBBB"BBBBBBBBr9   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}d	}|d
   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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%   C-027: 세대간 약관 적용 혼동c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zC-027NrX   r   s     r   r[   zHTestNewItemsC021toC030.test_c027_generation_confusion.<locals>.<genexpr>d   r   r   Nr   r   r@   r   r   rg   u   2세대 실손rF   rK   r   r   r   r   u   4세대와 동일rG   r   r   s              r   test_c027_generation_confusionz5TestNewItemsC021toC030.test_c027_generation_confusionb   s   BBDIt4t4tt4C4(B#CC#CCCCC#CCCCCCC#CCCCCCCC"Jd+I&JJ"&JJJJJ"&JJJJ"JJJ&JJJJJJJJr9   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}d	}|d
   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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)u6   C-029: 유튜브/외부 정보 vs 약관 원문 충돌c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zC-029NrX   r   s     r   r[   zGTestNewItemsC021toC030.test_c029_youtube_vs_contract.<locals>.<genexpr>k   r   r   Nr   r   r@   r   r   rg   u   약관 원문 기준rF   rK   r   r   r   r   u    유튜브 정보가 맞습니다rG   r   r   s              r   test_c029_youtube_vs_contractz4TestNewItemsC021toC030.test_c029_youtube_vs_contracti   s   BBDIt4t4tt4%I.H)II%)IIIII%)IIII%III)IIIIIIII1YT:X5YY15YYYYY15YYYY1YYY5YYYYYYYYr9   N)	rs   rt   ru   rv   r   r   r   r   r   rX   r9   r   rx   rx   H   s"    -<SCKZr9   rx   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestNewItemsB051toB055u3   B-051~B-055 신규 항목 테스트 (별표 참조)c                    |D ch c]  }|d   	 }}t        dd      D ch c]  }d|d
 }}||z
  }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                  |      dz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}x}	}yc c}w c c}w )u,   B-051~B-055 항목이 존재하는지 확인r;   3   8   B-r}   r   r3   r5   r   r~   r   r   r6   r   Nr   r   s               r   test_b051_to_b055_presentz0TestNewItemsB051toB055.test_b051_to_b055_presentt   r   r   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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)u0   B-051: 별표 테이블 참조 - 장해분류표c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zB-051NrX   r   s     r   r[   zITestNewItemsB051toB055.test_b051_appendix_table_search.<locals>.<genexpr>~   r   r   Nr   r   r@   r   r   rg   rD   ra   r3   r   r   r   r      장해분류표rF   rK   r   u   별표1r   r   s              r   test_b051_appendix_table_searchz6TestNewItemsB051toB055.test_b051_appendix_table_search|   sl   BBDIt4t4tt4J3#33#33333#3333333#33333333 DD)C$DD $DDDDD $DDDD DDD$DDDDDDDD<D!;<<y<<<<<y<<<<y<<<<<<<<<<<r9   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}d	}|d
   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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)u0   B-052: 별표 테이블 참조 - 수술분류표c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zB-052NrX   r   s     r   r[   zJTestNewItemsB051toB055.test_b052_surgery_classification.<locals>.<genexpr>   r   r   Nr   r   r@   r   r   rg      수술분류표rF   rK   r   r   r   r   u   별표2r   r   s              r    test_b052_surgery_classificationz7TestNewItemsB051toB055.test_b052_surgery_classification   s   BBDIt4t4tt4 DD)C$DD $DDDDD $DDDD DDD$DDDDDDDD<D!;<<y<<<<<y<<<<y<<<<<<<<<<<r9   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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"   B-054: 복수 별표 교차 참조c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zB-054NrX   r   s     r   r[   zCTestNewItemsB051toB055.test_b054_cross_reference.<locals>.<genexpr>   r   r   Nr   r   r@   r   r   rg   rD   ra   r3   r   r   r   r   r   rF   rK   r   r   r   r   s              r   test_b054_cross_referencez0TestNewItemsB051toB055.test_b054_cross_reference   o   BBDIt4t4tt4J3#33#33333#3333333#33333333 DD)C$DD $DDDDD $DDDD DDD$DDDDDDDD DD)C$DD $DDDDD $DDDD DDD$DDDDDDDDr9   c                 p   t        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	d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"   B-055: 재해-장해 매핑 확인c              3   2   K   | ]  }|d    dk(  s|  yw)r;   zB-055NrX   r   s     r   r[   zATestNewItemsB051toB055.test_b055_mapping_check.<locals>.<genexpr>   r   r   Nr   r   r@   r   r   rg   rD   ra   r3   r   r   r   r   u   재해분류표rF   rK   r   r   r   r   s              r   test_b055_mapping_checkz.TestNewItemsB051toB055.test_b055_mapping_check   r   r9   N)	rs   rt   ru   rv   r   r   r   r   r   rX   r9   r   r   r   q   s     =<==EEr9   r   c                       e Zd ZdZd Zy)TestDifficultyDistributionu   난이도 분포 테스트c           	         t        dd      D cg c]  }d|d
 c}t        dd      D cg c]  }d|d
 c}z   }|D cg c]  }|d   |v s| }}d	d
lm}  |d |D              }|j                  }d}	d	}
 ||	|
      }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |	      t	        j                  |
      t	        j                  |      t	        j                  |      dz  }t	        j                  d|j                  dd	             dz   d|iz  }t        t	        j                  |            dx}x}	x}
x}x}}|j                  }d}	d	}
 ||	|
      }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |	      t	        j                  |
      t	        j                  |      t	        j                  |      dz  }t	        j                  d|j                  dd	             dz   d|iz  }t        t	        j                  |            dx}x}	x}
x}x}}yc c}w c c}w c c}w )u.   신규 15개 항목의 난이도 분포 확인rz   r{   r|   r}   r   r   r   r;   r   rU   c              3   &   K   | ]	  }|d      yw)rJ   NrX   rY   s     r   r[   zGTestDifficultyDistribution.test_new_items_difficulty.<locals>.<genexpr>   s     HdtL1Hr\   medium   r3   )zS%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
} == %(py11)sdifficulties)r   r   r   r   r   rj   zExpected 6 medium, got z
>assert %(py13)spy13Nhard	   zExpected 9 hard, got )r   rk   rV   rO   r"   r'   r    r!   r#   r$   r7   r%   r&   )r(   r   r   new_idsr@   	new_itemsrV   r   rQ   r)   r,   @py_assert7@py_assert10@py_assert9rq   @py_format14s                   r   test_new_items_difficultyz4TestDifficultyDistribution.test_new_items_difficulty   s   ).r27AR#w<7).r27AR#w<78 '2KdT$Z75JTK	K'HiHH ll!l!,ll,1lll,llllll|lll|lllllllll!lll,llllll5L\M]M]^fhiMjLk3llllllllfff*faf*a/fff*affffff|fff|ffffffffffff*fffafff3HIYIYZ`bcIdHe1ffffffff 87Ks   K-K2K7K7N)rs   rt   ru   rv   r   rX   r9   r   r   r      s    $gr9   r   __main__z-v)rv   builtinsr    _pytest.assertion.rewrite	assertionrewriter"   r   pytestpathlibr   __file__parentr
   fixturer   r   rx   r   r   rs   mainrX   r9   r   <module>r      s        H~,,/EE   .T .Tb&Z &ZR(E (EVg g& zFKK4 ! r9   