
    Si1                      P   d 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j,                  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                     |dz  }ddg dd}t        ||       |j                         sJ t        j                  |j	                               }||k(  sJ y)u"   JSON 데이터를 올바르게 씀output.jsonvalue*            )keynumlistN)r   existsjsonloads	read_textselftmp_pathtargetdataloadeds        N/home/jay/workspace/.worktrees/task-2117-dev1/utils/tests/test_atomic_write.pytest_writes_valid_jsonz*TestAtomicJsonWrite.test_writes_valid_json   sS    M)r9=&$'}}F,,./~~    c                 Z    |dz  dz  dz  }t        |ddi       |j                         sJ y)!   상위 디렉토리 자동 생성nesteddeepr   okTN)r   r   r   r   r   s      r   test_creates_parent_directoriesz3TestAtomicJsonWrite.test_creates_parent_directories   s2    H$v-=&4,/}}r!   c                     |dz  }|j                  d       t        |ddi       t        j                  |j	                               }|ddik(  sJ y)   기존 파일 덮어쓰기r   z{"old": "data"}newr   N)
write_textr   r   r   r   )r   r   r   r   s       r   test_overwrites_existing_filez1TestAtomicJsonWrite.test_overwrites_existing_file$   sR    M)+,&5&/2F,,./%(((r!   c                     t        |dz        }t        |g d       t        j                  t	        |      j                               g dk(  sJ y)   문자열 경로 허용r   r   N)strr   r   r   r   r   r'   s      r   test_accepts_string_pathz,TestAtomicJsonWrite.test_accepts_string_path,   s?    X-.&),zz$v,0023y@@@r!   c                 ~    |dz  }t        |ddi       t        |j                  d            }t        |      dk(  sJ y)   성공 후 임시 파일 없음r   r&   T*.tmpr   N)r   r   globlenr   r   r   	tmp_filess       r   !test_no_temp_file_left_on_successz5TestAtomicJsonWrite.test_no_temp_file_left_on_success2   ?    M)&4,/w/0	9~"""r!   c                     |dz  } G d d      }t        j                  t              5  t        |d |       i       ddd       t	        |j                  d            }t        |      dk(  sJ y# 1 sw Y   4xY w)u0   직렬화 오류 발생 시 임시 파일 정리r   c                       e Zd Zy)KTestAtomicJsonWrite.test_no_temp_file_left_on_error.<locals>.UnserializableN)__name__
__module____qualname__ r!   r   Unserializabler=   =   s    r!   rB   badNr4   r   )pytestraises	TypeErrorr   r   r5   r6   )r   r   r   rB   r8   s        r   test_no_temp_file_left_on_errorz3TestAtomicJsonWrite.test_no_temp_file_left_on_error9   sv    M)	 	 ]]9% 	Afun.>&?@	A w/0	9~"""	A 	As   A00A9c                     |dz  }ddd}t        ||       t        j                  |j                  d            }|d   dk(  sJ y)	u2   한글 등 유니코드 데이터 올바르게 씀zunicode.jsonu   안녕하세요u   🎉)messageemojiutf-8encodingrI   N)r   r   r   r   r   s        r   test_utf8_unicode_contentz-TestAtomicJsonWrite.test_utf8_unicode_contentG   sP    N*,v>&$'F,,g,>?i $5555r!   c                 Z    |dz  }t        |ddid       |j                         }d|v sJ y)u   indent 파라미터 적용r   ar      )indentz    N)r   r   )r   r   r   contents       r   test_custom_indentz&TestAtomicJsonWrite.test_custom_indentO   s8    M)&3(15""$   r!   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(  sJ y# 1 sw Y   <xY w# 1 sw Y   @xY w)	1   KeyboardInterrupt 발생 시 임시 파일 정리r   z	json.dumpside_effectr   r   Nr4   r   )r   KeyboardInterruptrD   rE   r   r   r5   r6   r7   s       r   #test_keyboard_interrupt_cleans_tempz7TestAtomicJsonWrite.test_keyboard_interrupt_cleans_tempV       M);,=> 	<01 <!&5'*:;<	< w/0	9~"""	< <	< 	<"   BA; B;B	 BBN)r>   r?   r@   __doc__r    r(   r-   r1   r9   rG   rN   rT   rZ   rA   r!   r   r	   r	      s3    ')A##6!	#r!   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                         sJ |j	                  |j                               }||k(  sJ y)u"   YAML 데이터를 올바르게 씀yamloutput.yamlthordev2T)nameteamactiveN)rD   importorskipr   r   	safe_loadr   )r   r   ra   r   r   r   s         r   test_writes_valid_yamlz*TestAtomicYamlWrite.test_writes_valid_yamle   sc    ""6*M)$?&$'}} 0 0 23~~r!   c                 T    |dz  dz  }t        |ddi       |j                         sJ y)r#   r$   config.yamlr&   TN)r   r   r'   s      r   r(   z3TestAtomicYamlWrite.test_creates_parent_directoriesp   s-    H$}4&4,/}}r!   c                     t        j                  d      }|dz  }|j                  d       t        |ddi       |j	                  |j                               }|ddik(  sJ y)r*   ra   rl   z
old: data
r+   r   N)rD   rh   r,   r   ri   r   r   r   ra   r   r   s        r   r-   z1TestAtomicYamlWrite.test_overwrites_existing_filev   sa    ""6*M)-(&5&/2 0 0 23%(((r!   c                     t        j                  d      }t        |dz        }t        |ddi       |j	                  t        |      j                               }|ddik(  sJ y)r/   ra   rb   r   valN)rD   rh   r0   r   ri   r   r   rn   s        r   r1   z,TestAtomicYamlWrite.test_accepts_string_path   s\    ""6*X-.&5%.1V 6 6 89%'''r!   c                 ~    |dz  }t        |ddi       t        |j                  d            }t        |      dk(  sJ y)r3   rb   r&   Tr4   r   N)r   r   r5   r6   r7   s       r   r9   z5TestAtomicYamlWrite.test_no_temp_file_left_on_success   r:   r!   c                 0   |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(  sJ y# 1 sw Y   <xY w# 1 sw Y   @xY w)
u.   YAML 직렬화 오류 시 임시 파일 정리rb   	yaml.dumpz
yaml errorrW   r   r   Nr4   r   )r   RuntimeErrorrD   rE   r   r   r5   r6   r7   s       r   rG   z3TestAtomicYamlWrite.test_no_temp_file_left_on_error   s    M);L,FG 	<|, <!&5'*:;<	< w/0	9~"""	< <	< 	<s"   BB B B		BB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(  sJ y# 1 sw Y   <xY w# 1 sw Y   @xY w)	rV   rb   rs   rW   r   r   Nr4   r   )r   rY   rD   rE   r   r   r5   r6   r7   s       r   rZ   z7TestAtomicYamlWrite.test_keyboard_interrupt_cleans_temp   r[   r\   N)r>   r?   r@   r]   rj   r(   r-   r1   r9   rG   rZ   rA   r!   r   r_   r_   b   s(    '	)(#	#	#r!   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                 P    |dz  }t        |d       |j                         dk(  sJ y)u$   텍스트 내용을 올바르게 씀
output.txtzhello world
line 2Nr   r   r'   s      r   test_writes_text_contentz,TestAtomicTextWrite.test_writes_text_content   s/    L(&"78!%::::r!   c                 P    |dz  dz  }t        |d       |j                         sJ y)r#   subry   rS   N)r   r   r'   s      r   r(   z3TestAtomicTextWrite.test_creates_parent_directories   s)    E!L0&),}}r!   c                 r    |dz  }|j                  d       t        |d       |j                         dk(  sJ y)r*   ry   zold contentznew contentN)r,   r   r   r'   s      r   r-   z1TestAtomicTextWrite.test_overwrites_existing_file   s;    L(-(&-0!]222r!   c                 t    t        |dz        }t        |d       t        |      j                         dk(  sJ y)r/   ry   ztext contentN)r0   r   r   r   r'   s      r   r1   z,TestAtomicTextWrite.test_accepts_string_path   s6    X,-&.1F|%%'>999r!   c                 z    |dz  }t        |d       t        |j                  d            }t        |      dk(  sJ y)r3   ry   rS   r4   r   N)r   r   r5   r6   r7   s       r   r9   z5TestAtomicTextWrite.test_no_temp_file_left_on_success   s;    L(&),w/0	9~"""r!   c                 T    |dz  }t        |d       |j                  d      dk(  sJ y)u2   한글 등 유니코드 텍스트 올바르게 씀zunicode.txtu   안녕하세요 🎉rK   rL   Nrz   r'   s      r   test_utf8_unicode_textz*TestAtomicTextWrite.test_utf8_unicode_text   s4    M)&"8915KKKKr!   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(  sJ y# 1 sw Y   <xY w# 1 sw Y   @xY w)rV   ry   zos.fsyncrW   rS   Nr4   r   )r   rY   rD   rE   r   r   r5   r6   r7   s       r   rZ   z7TestAtomicTextWrite.test_keyboard_interrupt_cleans_temp   s    L(:+<= 	501 5!&)45	5 w/0	9~"""	5 5	5 	5s!   BA9B9B	>BBc                 P    |dz  }t        |d       |j                         dk(  sJ y)u!   빈 문자열도 올바르게 씀z	empty.txt Nrz   r'   s      r   test_empty_stringz%TestAtomicTextWrite.test_empty_string   s-    K'&"%!R'''r!   N)r>   r?   r@   r]   r{   r(   r-   r1   r9   r   rZ   r   rA   r!   r   rw   rw      s.    ';3:#L	#(r!   rw   __main__z-v)r]   r   ossyspathlibr   unittest.mockr   rD   pathinsertr0   __file__parentutils.atomic_writer   r   r   r	   r_   rw   r>   mainrA   r!   r   <module>r      s    /  	 
    3tH~,,33::; < V VN# N#b@# @#F8( 8(v zFKK4 ! r!   