
    Li1                      j   d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
mZ ddlmZ ddlZe	j                  j!                  d e ee      j&                  j&                  j&                               ddlmZmZmZ  G d d      Z G d d	      Z G d
 d      Zedk(  r ej8                  edg       yy)u)   utils/atomic_write.py 테스트 스위트    N)Path)patch)atomic_json_writeatomic_text_writeatomic_yaml_writec                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestAtomicJsonWriteu   atomic_json_write() 테스트c                 f   |dz  }ddg dd}t        ||       |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                  |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  }dd|iz  }t        t	        j                  |            d	}y	)u"   JSON 데이터를 올바르게 씀output.jsonvalue*            )keynumlistAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}targetpy0py2py4N==z%(py0)s == %(py2)sloadeddatar   r   assert %(py4)sr   )r   exists@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationjsonloads	read_text_call_reprcompare)	selftmp_pathr   r   @py_assert1@py_assert3@py_format5r   @py_format3s	            4/home/jay/workspace/utils/tests/test_atomic_write.pytest_writes_valid_jsonz*TestAtomicJsonWrite.test_writes_valid_json   s    M)r9=&$'}}}vv}F,,./~vvv    c                    |dz  dz  dz  }t        |ddi       |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}}y	)
!   상위 디렉토리 자동 생성nesteddeepr   okTr   r   r   N)	r   r"   r#   r$   r%   r&   r'   r(   r)   r.   r/   r   r0   r1   r2   s         r4   test_creates_parent_directoriesz3TestAtomicJsonWrite.test_creates_parent_directories   s{    H$v-=&4,/}}}vv}r6   c                    |dz  }|j                  d       t        |ddi       t        j                  |j	                               }ddi}||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)   기존 파일 덮어쓰기r   z{"old": "data"}newr   r   z%(py0)s == %(py3)sr   r   py3assert %(py5)spy5N)
write_textr   r*   r+   r,   r%   r-   r#   r$   r&   r'   r(   r)   )r.   r/   r   r   @py_assert2r0   @py_format4@py_format6s           r4   test_overwrites_existing_filez1TestAtomicJsonWrite.test_overwrites_existing_file$   s    M)+,&5&/2F,,./(v((((v((((((v(((v((((((((((r6   c                    t        |dz        }t        |g d       t        j                  }t	        |      }|j
                  } |       } ||      }g d}||k(  }	|	st        j                  d|	fd||f      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                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d	z  }
d	d
|
iz  }t        t        j                  |            dx}x}x}x}x}x}	}y)   문자열 경로 허용r   r   r   )z%(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.loads
}(%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}.read_text
}()
})
} == %(py15)sr*   r   r   )	r   r   rC   r   py6py8py10py12py15zassert %(py17)spy17N)strr   r*   r+   r   r,   r%   r-   r#   r$   r&   r'   r(   r)   )r.   r/   r   r0   @py_assert5@py_assert7@py_assert9@py_assert11@py_assert14@py_assert13@py_format16@py_format18s               r4   test_accepts_string_pathz,TestAtomicJsonWrite.test_accepts_string_path,   s"   X-.&),zz@$v,@,00@02@z23@y@3y@@@@3y@@@@@@t@@@t@@@z@@@@@@$@@@$@@@@@@v@@@v@@@,@@@0@@@2@@@3@@@y@@@@@@@@r6   c                 ~   |dz  }t        |ddi       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)   성공 후 임시 파일 없음r   r;   T*.tmpr   r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen	tmp_filesr   py1rC   rM   assert %(py8)srN   N)r   r   globra   r%   r-   r#   r$   r&   r'   r(   r)   	r.   r/   r   rb   rG   rT   @py_assert4@py_format7@py_format9s	            r4   !test_no_temp_file_left_on_successz5TestAtomicJsonWrite.test_no_temp_file_left_on_success2       M)&4,/w/0	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""r6   c                    |dz  } G d d      }t        j                  t              5  t        |d |       i       ddd       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   5xY w)u0   직렬화 오류 발생 시 임시 파일 정리r   c                       e Zd Zy)KTestAtomicJsonWrite.test_no_temp_file_left_on_error.<locals>.UnserializableN)__name__
__module____qualname__ r6   r4   Unserializablero   =   s    r6   rt   badNr_   r   r   r`   ra   rb   rc   re   rN   )pytestraises	TypeErrorr   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   )
r.   r/   r   rt   rb   rG   rT   rh   ri   rj   s
             r4   test_no_temp_file_left_on_errorz3TestAtomicJsonWrite.test_no_temp_file_left_on_error9   s    M)	 	 ]]9% 	Afun.>&?@	A w/0	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""	A 	As   E00E:c                 z   |dz  }ddd}t        ||       t        j                  |j                  d            }|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)u2   한글 등 유니코드 데이터 올바르게 씀zunicode.jsonu   안녕하세요u   🎉)messageemojiutf-8encodingr{   r   )z%(py1)s == %(py4)s)rd   r   zassert %(py6)srM   N)	r   r*   r+   r,   r%   r-   r'   r(   r)   )
r.   r/   r   r   r   @py_assert0r1   rG   r2   ri   s
             r4   test_utf8_unicode_contentz-TestAtomicJsonWrite.test_utf8_unicode_contentG   s    N*,v>&$'F,,g,>?i 5$55 $55555 $5555 555$55555555r6   c                    |dz  }t        |ddid       |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  }dd|iz  }t        t        j                  |            dx}}y)u   indent 파라미터 적용r   ar      )indentz    )in)z%(py1)s in %(py3)scontent)rd   rC   rD   rE   N)
r   r,   r%   r-   r'   r#   r$   r&   r(   r)   )r.   r/   r   r   r   rG   rH   rI   s           r4   test_custom_indentz&TestAtomicJsonWrite.test_custom_indentO   s    M)&3(15""$ v    v   v                r6   c                 *   |dz  }t        dt              5  t        j                  t              5  t	        |ddi       ddd       ddd       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# 1 sw Y   BxY w)1   KeyboardInterrupt 발생 시 임시 파일 정리r   z	json.dumpside_effectr   r   Nr_   r   r   r`   ra   rb   rc   re   rN   )r   KeyboardInterruptrv   rw   r   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   rg   s	            r4   #test_keyboard_interrupt_cleans_tempz7TestAtomicJsonWrite.test_keyboard_interrupt_cleans_tempV       M);,=> 	<01 <!&5'*:;<	< w/0	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""	< <	< 	<"   FE; F;F	 FFN)rp   rq   rr   __doc__r5   r=   rJ   r\   rk   ry   r   r   r   rs   r6   r4   r	   r	      s3    ')A##6!	#r6   r	   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestAtomicYamlWriteu   atomic_yaml_write() 테스트c                    t        j                  d      }|dz  }dddd}t        ||       |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}}|j                  |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  }	dd|	iz  }t        t        j                  |            d
}y
)u"   YAML 데이터를 올바르게 씀yamloutput.yamlthordev2T)nameteamactiver   r   r   Nr   r   r   r   r    r!   r   )rv   importorskipr   r"   r#   r$   r%   r&   r'   r(   r)   	safe_loadr,   r-   )
r.   r/   r   r   r   r0   r1   r2   r   r3   s
             r4   test_writes_valid_yamlz*TestAtomicYamlWrite.test_writes_valid_yamle   s   ""6*M)$?&$'}}}vv} 0 0 23~vvvr6   c                 |   |dz  dz  }t        |ddi       |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}}y)	r8   r9   config.yamlr;   Tr   r   r   N)	r   r"   r#   r$   r%   r&   r'   r(   r)   r<   s         r4   r=   z3TestAtomicYamlWrite.test_creates_parent_directoriesp   sv    H$}4&4,/}}}vv}r6   c                    t        j                  d      }|dz  }|j                  d       t        |ddi       |j	                  |j                               }ddi}||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)r?   r   r   z
old: data
r@   r   r   rA   r   rB   rD   rE   N)rv   r   rF   r   r   r,   r%   r-   r#   r$   r&   r'   r(   r)   	r.   r/   r   r   r   rG   r0   rH   rI   s	            r4   rJ   z1TestAtomicYamlWrite.test_overwrites_existing_filev   s    ""6*M)-(&5&/2 0 0 23(v((((v((((((v(((v((((((((((r6   c                    t        j                  d      }t        |dz        }t        |ddi       |j	                  t        |      j                               }ddi}||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)rL   r   r   r   valr   rA   r   rB   rD   rE   N)rv   r   rS   r   r   r   r,   r%   r-   r#   r$   r&   r'   r(   r)   r   s	            r4   r\   z,TestAtomicYamlWrite.test_accepts_string_path   s    ""6*X-.&5%.1V 6 6 89'v''''v''''''v'''v''''''''''r6   c                 ~   |dz  }t        |ddi       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)r^   r   r;   Tr_   r   r   r`   ra   rb   rc   re   rN   N)r   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   rg   s	            r4   rk   z5TestAtomicYamlWrite.test_no_temp_file_left_on_success   rl   r6   c                 4   |dz  }t        dt        d            5  t        j                  t              5  t	        |ddi       ddd       ddd       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# 1 sw Y   BxY w)u.   YAML 직렬화 오류 시 임시 파일 정리r   	yaml.dumpz
yaml errorr   r   r   Nr_   r   r   r`   ra   rb   rc   re   rN   )r   RuntimeErrorrv   rw   r   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   rg   s	            r4   ry   z3TestAtomicYamlWrite.test_no_temp_file_left_on_error   s   M);L,FG 	<|, <!&5'*:;<	< w/0	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""	< <	< 	<s"   FF F F
	FFc                 *   |dz  }t        dt              5  t        j                  t              5  t	        |ddi       ddd       ddd       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# 1 sw Y   BxY w)r   r   r   r   r   r   Nr_   r   r   r`   ra   rb   rc   re   rN   )r   r   rv   rw   r   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   rg   s	            r4   r   z7TestAtomicYamlWrite.test_keyboard_interrupt_cleans_temp   r   r   N)rp   rq   rr   r   r   r=   rJ   r\   rk   ry   r   rs   r6   r4   r   r   b   s(    '	)(#	#	#r6   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
)TestAtomicTextWriteu   atomic_text_write() 테스트c                    |dz  }t        |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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u$   텍스트 내용을 올바르게 씀
output.txtzhello world
line 2r   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py7)sr   r   r   r   py7assert %(py9)spy9N
r   r,   r%   r-   r#   r$   r&   r'   r(   r)   	r.   r/   r   r0   r1   @py_assert6rT   @py_format8@py_format10s	            r4   test_writes_text_contentz,TestAtomicTextWrite.test_writes_text_content   s    L(&"78:!:%::!%:::::!%:::::::v:::v::::::!:::%::::::::r6   c                 x   |dz  dz  }t        |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}}y)r8   subr   r   r   r   r   N)	r   r"   r#   r$   r%   r&   r'   r(   r)   r<   s         r4   r=   z3TestAtomicTextWrite.test_creates_parent_directories   sr    E!L0&),}}}vv}r6   c                    |dz  }|j                  d       t        |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                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)r?   r   zold contentznew contentr   r   r   r   r   r   N)rF   r   r,   r%   r-   r#   r$   r&   r'   r(   r)   r   s	            r4   rJ   z1TestAtomicTextWrite.test_overwrites_existing_file   s    L(-(&-02!2]2!]2222!]222222v222v222222!222]2222222r6   c           	         t        |dz        }t        |d       t        |      }|j                  } |       }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                  |      t	        j                  |      dz  }dd	|iz  }	t        t	        j                  |	            d
x}x}x}x}}y
)rL   r   ztext contentr   )zg%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.read_text
}()
} == %(py10)sr   r   )r   rd   rC   rE   r   rO   zassert %(py12)srP   N)rS   r   r   r,   r%   r-   r#   r$   r&   r'   r(   r)   )
r.   r/   r   rG   rh   r   rV   @py_assert8@py_format11@py_format13s
             r4   r\   z,TestAtomicTextWrite.test_accepts_string_path   s    X,-&.1F|9|%%9%'9>9'>9999'>999999t999t999999F999F999|999%999'999>99999999r6   c                 z   |dz  }t        |d       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)r^   r   r   r_   r   r   r`   ra   rb   rc   re   rN   N)r   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   rg   s	            r4   rk   z5TestAtomicTextWrite.test_no_temp_file_left_on_success   s    L(&),w/0	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""r6   c                 $   |dz  }t        |d       |j                  }d} ||      }d}||k(  }|st        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                  |      dz  }d	d
|iz  }	t        t        j                  |	            dx}x}x}x}}y)u2   한글 등 유니코드 텍스트 올바르게 씀zunicode.txtu   안녕하세요 🎉r}   r~   r   )zX%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}(encoding=%(py4)s)
} == %(py9)sr   )r   r   r   rM   r   zassert %(py11)spy11Nr   )
r.   r/   r   r0   r1   rT   r   rU   r   @py_format12s
             r4   test_utf8_unicode_textz*TestAtomicTextWrite.test_utf8_unicode_text   s    M)&"89KK1K5KK15KKKKK15KKKKKKKvKKKvKKKKKKKKK1KKK5KKKKKKKKKr6   c                 &   |dz  }t        dt              5  t        j                  t              5  t	        |d       ddd       ddd       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# 1 sw Y   BxY w)r   r   zos.fsyncr   r   Nr_   r   r   r`   ra   rb   rc   re   rN   )r   r   rv   rw   r   r   rf   ra   r%   r-   r#   r$   r&   r'   r(   r)   rg   s	            r4   r   z7TestAtomicTextWrite.test_keyboard_interrupt_cleans_temp   s    L(:+<= 	501 5!&)45	5 w/0	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""	5 5	5 	5s!   FE9F9F	>FFc                    |dz  }t        |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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u!   빈 문자열도 올바르게 씀z	empty.txt r   r   r   r   r   r   Nr   r   s	            r4   test_empty_stringz%TestAtomicTextWrite.test_empty_string   s    K'&"%'!'R'!R''''!R''''''v'''v''''''!'''R'''''''r6   N)rp   rq   rr   r   r   r=   rJ   r\   rk   r   r   r   rs   r6   r4   r   r      s.    ';3:#L	#(r6   r   __main__z-v)r   builtinsr#   _pytest.assertion.rewrite	assertionrewriter%   r*   ossyspathlibr   unittest.mockr   rv   pathinsertrS   __file__parentutils.atomic_writer   r   r   r	   r   r   rp   mainrs   r6   r4   <module>r      s    /    	 
    3tH~,,33::; < V VN# N#b@# @#F8( 8(v zFKK4 ! r6   