
    i                     8   d Z ddlZddlmc mZ ddlZddlm	Z	m
Z
 ddlZej                  j                  dd       ddlmZmZ ej"                  defd       Zej"                  d        Zej"                  d	        Z G d
 d      Z G d d      Z G d d      Zy)u  
test_ai_parser_integration.py — ai_parser.py 통합 테스트 (Task-511 서브태스크)

테스트 항목:
  1. opendataloader 기반 정상 동작 테스트
  2. 에러 전파 테스트 (parse_pdf 예외 시 전파 확인)
  3. _table_to_markdown 헬퍼 함수 테스트
    N)	MagicMockpatchz /home/jay/projects/InsuRo/server)_table_to_markdownextract_text_from_pdfreturnc                       y)u"   테스트용 최소 PDF 바이트.s%   %PDF-1.4 fake pdf content for testing r	       B/home/jay/workspace/teams/dev2/tests/test_ai_parser_integration.pysample_pdf_bytesr      s     4r
   c                  X    t               } d| _        g | _        dg| _        ddi| _        | S )u   정상 ParseResult mock 객체.uE   보험 약관 1조: 계약자는 보험료를 납부해야 합니다.
page_count   r   texttablespagesmetadataresults    r   sample_parse_resultr   "   s4     [FYFKFM[\FL#Q'FOMr
   c                  p    t               } d| _        g dg dg dgdg| _        dg| _        ddi| _        | S )u)   테이블 포함 ParseResult mock 객체.u   보험료 납부 일정)u   월u   납부금액u   비고)u   1월
   100,000원u
   첫 납부)u   2월r   u   정기 납부headersrowsr   r   r   r   s    r   sample_parse_result_with_tablesr   -   sM     [F+FK 947	
FM ..FL#Q'FOMr
   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestNormalOperationu.   opendataloader 기반 정상 동작 테스트.c                 4   t        d|      5  t        |      }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}d	}||v }|st        j                  d
|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            dx}}d}||v }|st        j                  d
|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }	t        t        j                  |	            dx}}y# 1 sw Y   uxY w)uG   parse_pdf 파싱 성공 시 ParseResult.text가 반환되어야 한다.ai_parser.parse_pdfreturn_valueN5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   strpy0py1py2py4u   보험 약관 1조inz%(py1)s in %(py3)sr)   py3assert %(py5)spy5u$   보험료를 납부해야 합니다.)r   r   r%   r&   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation_call_reprcompare)
selfr   r   r   @py_assert3@py_format5@py_assert0@py_assert2@py_format4@py_format6s
             r   &test_extract_text_returns_docling_textz:TestNormalOperation.test_extract_text_returns_docling_textH   sp   (7JK 	=*+;<F	= &#&&&&&&&&z&&&z&&&&&&&&&&&&&&&&&#&&&#&&&&&&&&&&#-#v----#v---#------v---v-------5?5????5???5????????????????	= 	=s   JJc                    t        d|      5  t        |      }ddd       d}|v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y# 1 sw Y   xY w)uR   테이블이 있으면 마크다운 형식으로 결과에 포함되어야 한다.r!   r"   N   ## 추출된 표r,   r.   r   r/   r1   r2   u   | 월 | 납부금액 | 비고 |u"   | 1월 | 100,000원 | 첫 납부 |u%   | 2월 | 100,000원 | 정기 납부 |)
r   r   r5   r:   r7   r3   r4   r6   r8   r9   )r;   r   r   r   r>   r?   r@   rA   s           r   /test_extract_text_with_tables_includes_markdownzCTestNormalOperation.test_extract_text_with_tables_includes_markdownQ   s   (7VW 	=*+;<F	= "+!V++++!V+++!++++++V+++V+++++++0:0F::::0F:::0::::::F:::F:::::::3=3v====3v===3======v===v=======6@6&@@@@6&@@@6@@@@@@&@@@&@@@@@@@	= 	=s   J77Kc                    g |_         t        d|      5  t        |      }ddd       d}|v}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y# 1 sw Y   xY w)uR   테이블이 없으면 '## 추출된 표' 섹션이 포함되지 않아야 한다.r!   r"   NrD   )not in)z%(py1)s not in %(py3)sr   r/   r1   r2   )r   r   r   r5   r:   r7   r3   r4   r6   r8   r9   )r;   r   r   r   r>   r?   r@   rA   s           r   /test_extract_text_no_tables_no_markdown_sectionzCTestNormalOperation.test_extract_text_no_tables_no_markdown_section[   s    %'"(7JK 	=*+;<F	= "/!////!///!////////////////	= 	=s   CCc                    t        d|      5  t        |      }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}y# 1 sw Y   +xY w)	u/   반환값은 항상 str 타입이어야 한다.r!   r"   Nr$   r%   r   r&   r'   )r   r   r%   r&   r3   r4   r5   r6   r7   r8   r9   )r;   r   r   r   r<   r=   s         r   "test_extract_text_returns_str_typez6TestNormalOperation.test_extract_text_returns_str_typec   s    (7JK 	=*+;<F	= &#&&&&&&&&z&&&z&&&&&&&&&&&&&&&&&#&&&#&&&&&&&&&&	= 	=s   EEc                     t        d|      5 }t        |       ddd       j                  |       y# 1 sw Y   xY w)u<   parse_pdf가 file_bytes를 인자로 호출되어야 한다.r!   r"   N)r   r   assert_called_once_with)r;   r   r   
mock_parses       r   %test_parse_pdf_called_with_file_bytesz9TestNormalOperation.test_parse_pdf_called_with_file_bytesj   s?    (7JK 	4z!"23	4 	**+;<	4 	4s   4=N)	__name__
__module____qualname____doc__rB   rE   rH   rJ   rN   r	   r
   r   r   r   E   s     8@A0'=r
   r   c                   "    e Zd ZdZd Zd Zd Zy)TestErrorPropagationu9   parse_pdf 예외 시 그대로 전파되는지 테스트.c                     t        dt        d            5  t        j                  t              5  t	        |       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)uN   parse_pdf에서 RuntimeError가 발생하면 그대로 전파되어야 한다.r!   u   파싱 오류side_effectN)r   RuntimeErrorpytestraisesr   r;   r   s     r   test_runtime_error_propagatesz2TestErrorPropagation.test_runtime_error_propagatesz   sV    (l?6ST 	8|, 8%&678	8 	88 8	8 	8!   AAAA	AA#c                     t        dt        d            5  t        j                  t              5  t	        |       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)uL   parse_pdf에서 ValueError가 발생하면 그대로 전파되어야 한다.r!   u	   빈 bytesrV   N)r   
ValueErrorrY   rZ   r   r[   s     r   test_value_error_propagatesz0TestErrorPropagation.test_value_error_propagates   sV    (j6MN 	8z* 8%&678	8 	88 8	8 	8r]   c                     t        dt        d            5  t        j                  t              5  t	        |       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u?   예상치 못한 Exception도 그대로 전파되어야 한다.r!   u   알 수 없는 오류rV   N)r   	ExceptionrY   rZ   r   r[   s     r   !test_generic_exception_propagatesz6TestErrorPropagation.test_generic_exception_propagates   sW    (i@W6XY 	8y) 8%&678	8 	88 8	8 	8r]   N)rO   rP   rQ   rR   r\   r`   rc   r	   r
   r   rT   rT   w   s    C888r
   rT   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestTableToMarkdownu-   _table_to_markdown() 헬퍼 함수 테스트.c                 ^   ddgddgddggd}t        |d      }d	}||v }|st        j                  d
|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d
|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d
|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d
|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}y)uO   기본 테이블이 올바른 마크다운 형식으로 변환되어야 한다.u   이름u   나이u	   홍길동30u	   김철수25r   r   u   | 이름 | 나이 |r,   r.   r   r/   r1   r2   Nz	|---|---|u   | 홍길동 | 30 |u   | 김철수 | 25 |	r   r5   r:   r7   r3   r4   r6   r8   r9   r;   tabler   r>   r?   r@   rA   s          r   test_basic_tablez$TestTableToMarkdown.test_basic_table   s    !(+!4(;*=>
 $E1-$.$....$...$................${f$$$${f$$${$$$$$$f$$$f$$$$$$$#-#v----#v---#------v---v-------#-#v----#v---#------v---v-------r
   c                 v   dgdggd}t        |d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            dx}}y)u5   테이블 번호가 헤더에 표시되어야 한다.colvalr      u   표 3r,   r.   r   r/   r1   r2   Nri   rj   s          r   test_table_index_in_headerz.TestTableToMarkdown.test_table_index_in_header   sw    "GugY7#E1- w&    w&   w      &   &       r
   c                 v   g dggd}t        |d      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}}y)u9   헤더가 없으면 빈 문자열을 반환해야 한다.ro   r   r    )==)z%(py0)s == %(py3)sr   )r(   r0   r1   r2   N)	r   r5   r:   r3   r4   r6   r7   r8   r9   )r;   rk   r   r?   @py_assert1r@   rA   s          r    test_empty_headers_returns_emptyz4TestTableToMarkdown.test_empty_headers_returns_empty   st    %	2#E1-v|vvvr
   c                    g dddggd}t        |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}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}y)uK   행 열 수가 헤더보다 적어도 예외 없이 처리되어야 한다.)ABC12r   r   r$   r%   r   r&   r'   Nz| A | B | C |r,   r.   r/   r1   r2   )r   r%   r&   r3   r4   r5   r6   r7   r8   r9   r:   )	r;   rk   r   r<   r=   r>   r?   r@   rA   s	            r   test_row_shorter_than_headersz1TestTableToMarkdown.test_row_shorter_than_headers   s    '3ZL
 $E1-&#&&&&&&&&z&&&z&&&&&&&&&&&&&&&&&#&&&#&&&&&&&&&&(&((((&(((((((((&(((&(((((((r
   c                    dgdgdgdggd}t        |d      }d}||v }|st        j                  d|fd	||f      t        j                  |      d
t	        j
                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t	        j
                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t	        j
                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u,   여러 행이 모두 포함되어야 한다.Xabcr   r   z| a |r,   r.   r   r/   r1   r2   Nz| b |z| c |ri   rj   s          r   test_multiple_rowsz&TestTableToMarkdown.test_multiple_rows   s9    uUSEC5)
 $E1- w&    w&   w      &   &        w&    w&   w      &   &        w&    w&   w      &   &       r
   N)	rO   rP   rQ   rR   rl   rq   rv   r}   r   r	   r
   r   re   re      s    7.!	)
!r
   re   )rR   builtinsr3   _pytest.assertion.rewrite	assertionrewriter5   sysunittest.mockr   r   rY   pathinsert	ai_parserr   r   fixturebytesr   r   r   r   rT   re   r	   r
   r   <module>r      s     
 *  5 6 4% 4 4
    .*= *=d8 863! 3!r
   