
    Si                        d 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	       \/home/jay/workspace/.worktrees/task-2117-dev1/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                     t        d|      5  t        |      }ddd       t        t              sJ d|v sJ d|v sJ y# 1 sw Y   (xY w)uG   parse_pdf 파싱 성공 시 ParseResult.text가 반환되어야 한다.ai_parser.parse_pdfreturn_valueNu   보험 약관 1조u$   보험료를 납부해야 합니다.r   r   
isinstancestrselfr   r   r   s       r   &test_extract_text_returns_docling_textz:TestNormalOperation.test_extract_text_returns_docling_textH   s\    (7JK 	=*+;<F	= &#&&&#v---5???	= 	=s   AA
c                     t        d|      5  t        |      }ddd       dv sJ d|v sJ d|v sJ d|v sJ y# 1 sw Y   "xY w)uR   테이블이 있으면 마크다운 형식으로 결과에 포함되어야 한다.r!   r"   N   ## 추출된 표u   | 월 | 납부금액 | 비고 |u"   | 1월 | 100,000원 | 첫 납부 |u%   | 2월 | 100,000원 | 정기 납부 |)r   r   )r(   r   r   r   s       r   /test_extract_text_with_tables_includes_markdownzCTestNormalOperation.test_extract_text_with_tables_includes_markdownQ   sh    (7VW 	=*+;<F	= "V+++0F:::3v===6&@@@	= 	=s	   ;Ac                 x    g |_         t        d|      5  t        |      }ddd       dvsJ y# 1 sw Y   xY w)uR   테이블이 없으면 '## 추출된 표' 섹션이 포함되지 않아야 한다.r!   r"   Nr+   )r   r   r   r'   s       r   /test_extract_text_no_tables_no_markdown_sectionzCTestNormalOperation.test_extract_text_no_tables_no_markdown_section[   sG    %'"(7JK 	=*+;<F	= "///	= 	=s   09c                     t        d|      5  t        |      }ddd       t        t              sJ y# 1 sw Y   xY w)u/   반환값은 항상 str 타입이어야 한다.r!   r"   Nr$   r'   s       r   "test_extract_text_returns_str_typez6TestNormalOperation.test_extract_text_returns_str_typec   s@    (7JK 	=*+;<F	= &#&&&	= 	=s   5>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__r)   r,   r.   r0   r4   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	   빈 bytesr<   N)r   
ValueErrorr?   r@   r   rA   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 	8rC   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   알 수 없는 오류r<   N)r   	Exceptionr?   r@   r   rA   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 	8rC   N)r5   r6   r7   r8   rB   rF   rI   r	   r
   r   r:   r:   w   s    C888r
   r:   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestTableToMarkdownu-   _table_to_markdown() 헬퍼 함수 테스트.c                 f    ddgddgddggd}t        |d      }d	|v sJ d
|v sJ d|v sJ d|v sJ y)uO   기본 테이블이 올바른 마크다운 형식으로 변환되어야 한다.u   이름u   나이u	   홍길동30u	   김철수25r   r   u   | 이름 | 나이 |z	|---|---|u   | 홍길동 | 30 |u   | 김철수 | 25 |Nr   r(   tabler   s      r   test_basic_tablez$TestTableToMarkdown.test_basic_table   sk     !(+!4(;*=>
 $E1-$...f$$$#v---#v---r
   c                 8    dgdggd}t        |d      }d|v sJ y)u5   테이블 번호가 헤더에 표시되어야 한다.colvalr      u   표 3NrO   rP   s      r   test_table_index_in_headerz.TestTableToMarkdown.test_table_index_in_header   s,    "GugY7#E1-&   r
   c                 8    g dggd}t        |d      }|dk(  sJ y)u9   헤더가 없으면 빈 문자열을 반환해야 한다.rU   r   r    NrO   rP   s      r    test_empty_headers_returns_emptyz4TestTableToMarkdown.test_empty_headers_returns_empty   s(    %	2#E1-||r
   c                 `    g dddggd}t        |d      }t        |t              sJ d|v sJ y)uK   행 열 수가 헤더보다 적어도 예외 없이 처리되어야 한다.)ABC12r   r   z| A | B | C |N)r   r%   r&   rP   s      r   test_row_shorter_than_headersz1TestTableToMarkdown.test_row_shorter_than_headers   sC     '3ZL
 $E1-&#&&&&(((r
   c                 X    dgdgdgdggd}t        |d      }d|v sJ d|v sJ d	|v sJ y
)u,   여러 행이 모두 포함되어야 한다.Xabcr   r   z| a |z| b |z| c |NrO   rP   s      r   test_multiple_rowsz&TestTableToMarkdown.test_multiple_rows   sX     uUSEC5)
 $E1-&   &   &   r
   N)	r5   r6   r7   r8   rR   rW   rZ   ra   rg   r	   r
   r   rK   rK      s    7.!	)
!r
   rK   )r8   sysunittest.mockr   r   r?   pathinsert	ai_parserr   r   fixturebytesr   r   r   r   r:   rK   r	   r
   r   <module>ro      s     *  5 6 4% 4 4
    .*= *=d8 863! 3!r
   