
    Řiu/                         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
mZ ddlZdZej                  defd       Z G d d      Z G d	 d
      Z G d d      ZdefdZdefdZ G d d      Zy)uJ   
TDD 테스트: doc_parser.py
RED → GREEN → REFACTOR 순서로 구현
    N)	MagicMockpatchuj   /home/jay/.cokacdir/workspace/autoset/금융소비자_보호에_관한_법률법률제21065호20260102.pdfreturnc                  n    t        t        d      5 } | j                         cddd       S # 1 sw Y   yxY w)u/   실제 PDF 파일을 바이트로 읽어 반환rbN)openTEST_PDF_PATHread)fs    1/home/jay/workspace/libs/tests/test_doc_parser.py	pdf_bytesr      s.     
mT	" avvx  s   +4c                       e Zd ZddZddZy)TestParseResultNc                    ddl m}  |dddgddgdd	ggd
gddi      }|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  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d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  }d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  }dd|iz  }t        t        j                  |            dx}x}x}
}	|j                  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}}y) uF   ParseResult 데이터클래스를 기본값으로 생성할 수 있다r   ParseResulthellopage1page2AB12)headersrows
page_count   textpagestablesmetadata==)z,%(py2)s
{%(py2)s = %(py0)s.text
} == %(py5)sresultpy0py2py5assert %(py7)spy7N)z-%(py2)s
{%(py2)s = %(py0)s.pages
} == %(py5)s   )zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.tables
})
} == %(py8)slenr'   py1py3r)   py8assert %(py10)spy10)z%(py1)s == %(py4)sr/   py4assert %(py6)spy6)
doc_parserr   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr    r!   r-   r"   )selfr   r%   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert2@py_assert7@py_assert6@py_format9@py_format11@py_assert0@py_format5@py_format7s                   r   test_parse_result_instantiationz/TestParseResult.test_parse_result_instantiation   s   *G$!$c
c3ZLAB"A&	
 {{%g%{g%%%%{g%%%%%%v%%%v%%%{%%%g%%%%%%%||111|11111|1111111v111v111|11111111111==&s=!&Q&!Q&&&&!Q&&&&&&s&&&s&&&&&&6&&&6&&&=&&&!&&&Q&&&&&&&|,11,1111,111,1111111111    c                    ddl m}  |dg g i       }|j                  }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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}}|j                  }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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}}|j                  }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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
)uK   ParseResult 필드 기본값(빈 컨테이너)으로도 생성 가능하다r   r    r   Passert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.pages
}, %(py4)s)
}
isinstancer%   listr'   r/   r0   r5   r7   NzQassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.tables
}, %(py4)s)
}zSassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.metadata
}, %(py4)s)
}dict)r8   r   r    rT   rU   r;   r<   r9   r=   r>   r?   r@   r!   r"   rW   )rA   r   r%   rG   @py_assert5rN   s         r    test_parse_result_default_fieldsz0TestParseResult.test_parse_result_default_fields*   s   *"BrBG ,,-z,--------z---z------&---&---,------------------- --.z-........z...z......&...&...-................... //0z/400000000z000z000000&000&000/000000400040000000000rP   r   N)__name__
__module____qualname__rO   rY    rP   r   r   r      s    21rP   r   c                   T    e Zd ZdeddfdZdeddfdZdeddfdZdeddfdZd	dZy)
TestParsePdfr   r   Nc                 L   ddl m}m}  ||      }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                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}y)	uF   parse_pdf가 유효한 PDF bytes를 받아 ParseResult를 반환한다r   )r   	parse_pdf5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}rT   r%   r   r'   r/   r(   r5   N)r8   r   rb   rT   r;   r<   r9   r=   r>   r?   r@   )rA   r   r   rb   r%   rD   rM   s          r   #test_parse_pdf_returns_parse_resultz0TestParsePdf.test_parse_pdf_returns_parse_result8   s    59%&+........z...z......&...&......+...+..........rP   c                 
   ddl m}  ||      }|j                  }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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}}|j                  }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                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}	}y)u/   parse_pdf 결과의 text가 비어있지 않다r   rb   zOassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.text
}, %(py4)s)
}rT   r%   strrV   N>zI%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.text
})
} > %(py8)sr-   r.   r2   r3   )r8   rb   r   rT   rh   r;   r<   r9   r=   r>   r?   r@   r-   r:   rA   r   rb   r%   rG   rX   rN   rC   rH   rI   rJ   rK   s               r   test_parse_pdf_text_not_emptyz*TestParsePdf.test_parse_pdf_text_not_empty?   sO   (9% +++z+s++++++++z+++z++++++&+++&++++++++++s+++s++++++++++;;#s;#!#!####!######s###s######6###6###;######!#######rP   c                 
   ddl m}  ||      }|j                  }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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}}|j                  }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                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}	}y)u@   parse_pdf 결과의 pages가 리스트이고 비어있지 않다r   rg   rS   rT   r%   rU   rV   Nri   )zJ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.pages
})
} > %(py8)sr-   r.   r2   r3   )r8   rb   r    rT   rU   r;   r<   r9   r=   r>   r?   r@   r-   r:   rl   s               r   %test_parse_pdf_pages_is_nonempty_listz2TestParsePdf.test_parse_pdf_pages_is_nonempty_listG   sO   (9% ,,-z,--------z---z------&---&---,-------------------<<$s< $1$ 1$$$$ 1$$$$$$s$$$s$$$$$$6$$$6$$$<$$$ $$$1$$$$$$$rP   c                    ddl m}  ||      }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}}|j                  d   }	t        |	t              }|sd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}	}|j                  d   }d}
||
kD  }|slt        j                  d|fd||
f      t        j
                  |      t        j
                  |
      dz  }dd|iz  }t        t        j                  |            d
x}x}}
y
)u8   parse_pdf 결과의 metadata에 page_count 키가 있다r   rg   r   )in)z0%(py1)s in %(py5)s
{%(py5)s = %(py3)s.metadata
}r%   )r/   r0   r)   r*   r+   Nz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}rT   int)r'   r(   r0   r)   ri   )z%(py1)s > %(py4)sr4   r6   r7   )r8   rb   r"   r9   r:   r>   r;   r<   r=   r?   r@   rT   rr   )rA   r   rb   r%   rL   rC   rG   rE   rF   rB   rD   rM   rN   s                r   &test_parse_pdf_metadata_has_page_countz3TestParsePdf.test_parse_pdf_metadata_has_page_countO   sV   (9%.v.|....|...|......v...v.......... //,7=z7========z===z===7===================|,0q0,q0000,q000,000q0000000rP   c                 |    ddl m} t        j                  t              5   |d       ddd       y# 1 sw Y   yxY w)u7   잘못된 bytes를 넣었을 때 예외가 발생한다r   rg   s$   this is not a valid pdf file contentN)r8   rb   pytestraises	Exception)rA   rb   s     r   -test_parse_pdf_invalid_bytes_raises_exceptionz:TestParsePdf.test_parse_pdf_invalid_bytes_raises_exceptionX   s/    (]]9% 	?=>	? 	? 	?s   	2;rZ   )	r[   r\   r]   bytesre   rm   ro   rs   rx   r^   rP   r   r`   r`   7   sS    /U /t /$u $ $%u % %1 1$ 1?rP   r`   c                   4    e Zd ZdeddfdZddZdeddfdZy)TestParseDocumentr   r   Nc                    ddl m}m}  ||d      }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                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d	}|j                  }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                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d	x}x}x}
}	y	)uY   parse_document가 .pdf 파일명으로 포맷을 감지하여 ParseResult를 반환한다r   r   parse_documentzdocument.pdfrc   rT   r%   r   rd   Nri   rk   r-   r.   r2   r3   )r8   r   r~   rT   r;   r<   r9   r=   r>   r?   r@   r   r-   r:   )rA   r   r   r~   r%   rD   rM   rG   rC   rH   rI   rJ   rK   s                r   +test_parse_document_detects_pdf_by_filenamez=TestParseDocument.test_parse_document_detects_pdf_by_filenamed   s=   :	>:&+........z...z......&...&......+...+..........;;#s;#!#!####!######s###s######6###6###;######!#######rP   c                     ddl m} t        j                  t        t
        f      5   |dd       ddd       y# 1 sw Y   yxY w)u:   지원하지 않는 확장자는 예외를 발생시킨다r   )r~   s
   some byteszfile.xyzN)r8   r~   ru   rv   
ValueErrorrw   )rA   r~   s     r   0test_parse_document_unsupported_extension_raiseszBTestParseDocument.test_parse_document_unsupported_extension_raisesl   s5    -]]J	23 	6=*5	6 	6 	6s	   
9Ac                 N   ddl m}m}  ||d      }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                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d	}y	)
uB   확장자 대소문자 구분 없이 포맷 감지가 동작한다r   r}   zdocument.PDFrc   rT   r%   r   rd   N)r8   r   r~   rT   r;   r<   r9   r=   r>   r?   r@   )rA   r   r   r~   r%   rD   rM   s          r   .test_parse_document_case_insensitive_extensionz@TestParseDocument.test_parse_document_case_insensitive_extensions   s    :	>:&+........z...z......&...&......+...+..........rP   rZ   )r[   r\   r]   ry   r   r   r   r^   rP   r   r{   r{   c   s.    $U $t $6/ /RV /rP   r{   c                  8    dddddddg dddddd	dg d
ddgdS )u>   opendataloader-pdf JSON 출력을 흉내 내는 dict를 반환ztest.pdfr,   Nheading)r   r   d   r   u   테스트 PDF 텍스트)typeidpage numberbounding boxzheading levelcontent	paragraphr   )r   r   r   2   u   페이지1 텍스트)r   r   r   r   r   )z	file nameznumber of pagesauthortitlekidsr^   r^   rP   r   _make_mock_odl_outputr   ~   sN       "  0!"4 $  /1
 rP   output_datac                       fd}|S )uP   opendataloader_pdf.convert()의 side_effect: JSON 파일을 output_dir에 생성c                 <   t        j                  |      j                  dd       t        | t              r| n| d   }t        j                  |      j
                  dz   }t        j                  |      |z  j                  t        j                  d             y )NT)parentsexist_okr   z.jsonF)ensure_ascii)	pathlibPathmkdirrT   rh   stem
write_textjsondumps)
input_path
output_dirkwargssrcfnamer   s        r   side_effectz._mock_convert_side_effect.<locals>.side_effect   sv    Z &&td&C&z37jZ]S!&&0	j	!E	)55JJ{7	
rP   r^   )r   r   s   ` r   _mock_convert_side_effectr      s    
 rP   c                   t   e Zd Zdej                  dej                  ddfdZdej                  dej                  ddfdZdej                  dej                  ddfdZ	dej                  dej                  ddfdZ
dej                  dej                  ddfd	Zdej                  dej                  ddfd
Zy)TestParseCachetmp_pathmonkeypatchr   Nc                    ddl }ddl m} |j                  |d|dz         t               }t	        d      5 }t        |      |_        d} ||      } ||      }	ddd       j                  }
	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t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|j                   }
|	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t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|j"                  }
|	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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  }dd|iz  }t        t        j                  |            dx}
x}}y# 1 sw Y   xY w)u`   같은 bytes로 parse_pdf 2회 호출 시 같은 결과 반환, convert 호출은 1회만 발생r   Nrg   	CACHE_DIRparse_cacheopendataloader_pdf.converts   %PDF-1.4 fake pdf contentr#   zF%(py2)s
{%(py2)s = %(py0)s.text
} == %(py6)s
{%(py6)s = %(py4)s.text
}result1result2r'   r(   r5   r7   assert %(py8)sr1   zH%(py2)s
{%(py2)s = %(py0)s.pages
} == %(py6)s
{%(py6)s = %(py4)s.pages
}zJ%(py2)s
{%(py2)s = %(py0)s.tables
} == %(py6)s
{%(py6)s = %(py4)s.tables
}r,   z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)smock_convertr&   r*   r+   )r8   rb   setattrr   r   r   r   r   r9   r:   r;   r<   r=   r>   r?   r@   r    r!   
call_count)rA   r   r   r8   rb   r   r   
file_bytesr   r   rB   rX   rD   rN   rJ   rC   rE   rF   s                     r   "test_cache_hit_returns_same_resultz1TestParseCache.test_cache_hit_returns_same_result   s    	(JX5MN+-/0 	,L'@'ML$5J
+G
+G		, ||+w||+||++++||++++++w+++w+++|++++++w+++w+++|+++++++}}--}----}------w---w---}-------------------~~//~////~//////w///w///~///////////////////&&+!+&!++++&!++++++|+++|+++&+++!+++++++	, 	,s   #Q##Q-c                 h   ddl }ddl m} |j                  |d|dz         t               }t	        d      5 }t        |      |_         |d        |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  }
dd|
iz  }t        t        j                  |            dx}x}	}y# 1 sw Y   xY w)uG   다른 bytes는 다른 캐시 — 각각 convert 호출이 발생한다r   Nrg   r   r   r   s   %PDF-1.4 content As   %PDF-1.4 content Br   r#   r   r   r&   r*   r+   r8   rb   r   r   r   r   r   r   r9   r:   r;   r<   r=   r>   r?   r@   )rA   r   r   r8   rb   r   r   rB   rC   rD   rE   rF   s               r   test_cache_miss_different_bytesz.TestParseCache.test_cache_miss_different_bytes   s     	(JX5MN+-/0 	-L'@'ML$+,+,	- &&+!+&!++++&!++++++|+++|+++&+++!+++++++	- 	-s   !D((D1c                 p   ddl }ddl m} |j                  |d|dz         t               }d}t	        d      5 }t        |      |_         ||        ||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  }dd|iz  }t        t        j                  |            dx}x}
}	y# 1 sw Y   xY w)uJ   `use_cache=False`로 호출 시 캐시를 무시하고 다시 파싱한다r   Nrg   r   r   s   %PDF-1.4 use_cache false testr   F)	use_cacher   r#   r   r   r&   r*   r+   r   )rA   r   r   r8   rb   r   r   r   rB   rC   rD   rE   rF   s                r   #test_use_cache_false_forces_reparsez2TestParseCache.test_use_cache_false_forces_reparse   s     	(JX5MN+-5
/0 	3L'@'ML$j!jE2	3 &&+!+&!++++&!++++++|+++|+++&+++!+++++++	3 	3s   #D,,D5c                    ddl }ddl m}m} |dz  }|j                  |d|       t	               }t        d      5 }t        |      |_         |d        |d       ddd       |j                  }	 |	       }
|
sd	d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |	      t        j                  |
      dz  }t        t        j                  |            dx}	}
t!        |j#                  d            }t%        |      }d}||k\  }|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}} |        t!        |j#                  d            }t%        |      }d}||k(  }|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)u8   `clear_cache()` 후 캐시 디렉토리가 비어 있다r   N)clear_cacherb   r   r   r   s   %PDF-1.4 clear cache test As   %PDF-1.4 clear cache test BAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	cache_dirr'   r(   r5   *.jsonr,   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr-   
json_filesr'   r/   r0   r7   r   r1   r#   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)s	remaining)r8   r   rb   r   r   r   r   r   existsr;   r<   r9   r=   r>   r?   r@   rU   globr-   r:   )rA   r   r   r8   r   rb   r   r   r   rB   rD   rM   r   rG   rX   rC   rN   rJ   r   s                      r   test_clear_cache_removes_allz+TestParseCache.test_clear_cache_removes_all   s    	5},	JY?+-/0 	6L'@'ML$4545	6 !!!!!!!!!y!!!y!!!!!!!!!!!!!)..23
:#!#!####!######s###s######:###:######!####### 	12	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""	6 	6s   !M%%M/c                 r   ddl }ddl m} |dz  }|j                  |d|       t               }d}t	        d      5 }t        |      |_         ||       ddd       |j                  }	 |	       }
|
sdd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |	      t        j                  |
      d
z  }t        t        j                  |            dx}	}
t        |j!                  d            }t#        |      }d}||k(  }|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)u1   캐시 파일이 실제 디스크에 생성된다r   Nrg   r   r   s   %PDF-1.4 disk cache testr   r   r   r   r   r,   r#   r   r-   r   r   r   r1   )r8   rb   r   r   r   r   r   r   r;   r<   r9   r=   r>   r?   r@   rU   r   r-   r:   )rA   r   r   r8   rb   r   r   r   r   rB   rD   rM   r   rG   rX   rC   rN   rJ   s                     r   test_cache_stores_to_diskz(TestParseCache.test_cache_stores_to_disk  sg    	(},	JY?+-0
/0 	"L'@'ML$j!	"
 !!!!!!!!!y!!!y!!!!!!!!!!!!!)..23
:#!#!####!######s###s######:###:######!#######	" 	"s   H,,H6c                 	   ddl }ddl m} |j                  |d|dz         t               }d}t	        d      5 }t        |      |_         ||      }ddd       t	        d      5 }	t        |      |	_         ||      }
|	j                          ddd       j                  }
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t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}x}}|j"                  }|
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t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}x}}|j$                  }|
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t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}x}}|j&                  }|
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t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}x}}y# 1 sw Y   xY w# 1 sw Y   dxY w)uX   캐시된 결과와 원본 결과가 동일하다 (text, pages, tables, metadata 비교)r   Nrg   r   r   s   %PDF-1.4 result match testr   r#   r   originalcachedr   r   r1   r   r   )zN%(py2)s
{%(py2)s = %(py0)s.metadata
} == %(py6)s
{%(py6)s = %(py4)s.metadata
})r8   rb   r   r   r   r   r   assert_not_calledr   r9   r:   r;   r<   r=   r>   r?   r@   r    r!   r"   )rA   r   r   r8   rb   r   r   r   r   mock_no_callr   rB   rX   rD   rN   rJ   s                   r   #test_cached_result_matches_originalz2TestParseCache.test_cached_result_matches_original  s    	(JX5MN+-2
/0 	-L'@'ML$ ,H	-
 /0 	-L'@'ML$z*F**,		- }}++}++++}++++++x+++x+++}+++++++++++++++++++~~--~----~------x---x---~-------------------/&--/-////-//////x///x/////////&///&///-///////  3FOO3 O3333 O333333x333x333 333333F333F333O3333333	- 	-
	- 	-s   S"$)S/"S,/S9)r[   r\   r]   r   r   ru   MonkeyPatchr   r   r   r   r   r   r^   rP   r   r   r      s    ,,393E3E,	,0,,393E3E,	,&,,393E3E,	,,##393E3E#	#6$$393E3E$	$,44393E3E4	4rP   r   )__doc__builtinsr;   _pytest.assertion.rewrite	assertionrewriter9   r   r   unittest.mockr   r   ru   r	   fixturery   r   r   r`   r{   rW   r   r   r   r^   rP   r   <module>r      s   
    *  @ 5  1 1:&? &?X/ /6t 64 "M4 M4rP   