
    i                          d Z ddlZddlZddlZddlmZ ddlZddlmZ ej                  d        Z
dedefdZ G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u%   utils.feature_flags 단위 테스트.    N)PathFeatureFlagLoaderc           	          | dz  }dddddddddd}|j                  t        j                  |dd      d	
       t        |      S )uJ   기본 6개 플래그가 모두 False인 임시 feature_flags.json 반환.zfeature_flags.jsonz1.02026-04-04T00:00:00+09:00Fprogressive_disclosure_enabledrw_isolation_enabledhooks_enforcement_enabledtrust5_tagging_enabledmodel_map_enabledhaiku_ab_enabled)schema_version
updated_atflags   )indentensure_asciiutf-8encoding)
write_textjsondumpsstr)tmp_path
flags_filedatas      I/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_feature_flags.pytmp_flags_filer       s`     00J1.3$)).&+!& %
D $**T!%HSZ[z?    pathreturnc                     t        |       S )u>   절대 경로를 받아 FeatureFlagLoader 인스턴스 생성.r"   r   r%   s    r   make_loaderr&   %   s    $''r!   c                       e Zd Zd Zd Zy)TestBasicLoadingc                 j    t        |      }g d}|D ]  }|j                  |      du rJ | d        y )Nr   Fz should be Falser&   
is_enabled)selfr    loaderexpected_flagsflags        r   test_all_six_flags_are_falsez-TestBasicLoading.test_all_six_flags_are_false0   sL    ^,
 # 	OD$$T*e3Nv=M5NN3	Or!   c                     t        |      }|j                         }t        |      dk(  sJ t        d |j	                         D              sJ y )N   c              3   $   K   | ]  }|d u  
 yw)FN ).0vs     r   	<genexpr>zJTestBasicLoading.test_get_all_flags_returns_six_entries.<locals>.<genexpr>A   s     :!1::s   )r&   get_all_flagslenallvalues)r,   r    r-   	all_flagss       r   &test_get_all_flags_returns_six_entriesz7TestBasicLoading.test_get_all_flags_returns_six_entries=   sI    ^,((*	9~""":y'7'7'9::::r!   N)__name__
__module____qualname__r0   r=   r4   r!   r   r(   r(   /   s    O;r!   r(   c                       e Zd Zd Zd Zy)TestMtimeCachec                     t        |      }ddi|j                  fd}||_        |j                          |j                          |j                          d   dk(  sJ d       y )Ncountr   c                  .     dxx   dz  cc<            y )NrD      r4   )load_call_countoriginal_loads   r   counting_loadzITestMtimeCache.test_no_reload_when_mtime_unchanged.<locals>.counting_loadP   s    G$)$Or!   u1   mtime 미변경 시 _load가 호출되면 안 됨)r&   _loadreload)r,   r    r-   rI   rG   rH   s       @@r   #test_no_reload_when_mtime_unchangedz2TestMtimeCache.test_no_reload_when_mtime_unchangedJ   sc    ^,"A,	 % 	w'1,a.aa,r!   c                 \   t        |      }t        j                  d       t        j                  t        |      j                  d            }d|d   d<   t        |      j                  t        j                  |d      d       |j                          |j                  d      du sJ y )	N{Gz?r   r   Tr   r	   r   )r   )r&   timesleepr   loadsr   	read_textr   r   rK   r+   )r,   r    r-   r   s       r   (test_reload_triggered_when_mtime_changesz7TestMtimeCache.test_reload_triggered_when_mtime_changes]   s    ^, 	

4zz$~.88'8JK:>W67^''

4(BW'U 	  !ABdJJJr!   N)r>   r?   r@   rL   rS   r4   r!   r   rB   rB   I   s    b&Kr!   rB   c                   $    e Zd Zd Zd Zd Zd Zy)TestAtomicWritec                     t        |      }|j                  dd       t        j                  t	        |      j                  d            }|d   d   du sJ y )Nr
   Tr   r   r   r&   set_flagr   rQ   r   rR   r,   r    r-   on_disks       r   test_set_flag_persists_to_filez.TestAtomicWrite.test_set_flag_persists_to_fileq   sW    ^,.5 **T.1;;W;MNw 674???r!   c                 h    t        |      }|j                  dd       |j                  d      du sJ y )Nr   T)r&   rX   r+   r,   r    r-   s      r   test_set_flag_updates_in_memoryz/TestAtomicWrite.test_set_flag_updates_in_memoryy   s5    ^,3T:  !<=EEEr!   c                     t        |      }|j                  dd       t        j                  t	        |      j                  d            }d|v sJ |d   dk7  sJ y )Nr   Tr   r   r   r   rW   rY   s       r    test_set_flag_updates_updated_atz0TestAtomicWrite.test_set_flag_updates_updated_at~   s^    ^,+T2**T.1;;W;MNw&&&|$(CCCCr!   c                    t        |      }t        j                  j                  |      }|j	                  dd       t        j
                  |      D cg c]  }|j                  d      s| }}|g k(  s
J d|        y c c}w )Nr   Tz.tmpu   .tmp 파일이 남아있음: )r&   osr"   dirnamerX   listdirendswith)r,   r    r-   dir_pathf	tmp_filess         r   test_set_flag_no_tmp_files_leftz/TestAtomicWrite.test_set_flag_no_tmp_files_left   ss    ^,77??>2*D1 "

8 4K1

68JQK	KBK"?	{ KK Ls   B+BN)r>   r?   r@   r[   r^   r`   ri   r4   r!   r   rU   rU   p   s    @F
DLr!   rU   c                       e Zd Zd Zy)TestJSONDecodeErrorRecoveryc                    t        |      }|j                  dd       |j                  d      du sJ t        j                  d       t        |      j                  dd       |j                          |j                  d      du sJ d       y )Nr   TrN   z{ invalid json !!!r   r   u5   JSONDecodeError 후 이전 캐시를 유지해야 함)r&   rX   r+   rO   rP   r   r   rK   r]   s      r   &test_invalid_json_keeps_previous_cachezBTestJSONDecodeErrorRecovery.test_invalid_json_keeps_previous_cache   s    ^,0$7  !9:dBBB 	

4^''(<w'O 	  !9:dB{D{{Br!   N)r>   r?   r@   rm   r4   r!   r   rk   rk      s    |r!   rk   c                       e Zd Zd Zd Zy)TestUnknownFlagc                 H    t        |      }|j                  d      }|du sJ y )Nnonexistent_flag_xyzFr*   )r,   r    r-   results       r   test_unknown_flag_returns_falsez/TestUnknownFlag.test_unknown_flag_returns_false   s)    ^,""#9:r!   c                     t        |      }	 |j                  d      }|du sJ y # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w)Ntotally_made_up_flagFu8   존재하지 않는 플래그 조회 시 예외 발생: )r&   r+   	Exceptionpytestfail)r,   r    r-   rr   es        r    test_unknown_flag_does_not_raisez0TestUnknownFlag.test_unknown_flag_does_not_raise   sZ    ^,	X&&'=>FU?"? 	XKKRSTRUVWW	Xs   % 	AAAN)r>   r?   r@   rs   rz   r4   r!   r   ro   ro      s    
Xr!   ro   c                       e Zd Zd Zd Zy)TestFileNotFoundHandlingc                 `    t        |dz        }t        |      }|j                  d      du sJ y )Ndoes_not_exist.jsonr	   F)r   r&   r+   r,   r   non_existentr-   s       r   ,test_missing_file_returns_false_for_any_flagzETestFileNotFoundHandling.test_missing_file_returns_false_for_any_flag   s6    8&;;<\*  !ABeKKKr!   c                 `    t        |dz        }t        |      }|j                         i k(  sJ y )Nr~   )r   r&   r8   r   s       r   -test_missing_file_get_all_flags_returns_emptyzFTestFileNotFoundHandling.test_missing_file_get_all_flags_returns_empty   s3    8&;;<\*##%+++r!   N)r>   r?   r@   r   r   r4   r!   r   r|   r|      s    L
,r!   r|   c                       e Zd Zd Zy)TestRealWorkspaceFilec                     d}t         j                  j                  |      st        j                  d       t        |      }|j                  d      du sJ y)u0   실제 .claude/feature_flags.json 기준 검증.z./home/jay/workspace/.claude/feature_flags.jsonu*   실제 feature_flags.json 파일이 없음r	   TN)rb   r"   existsrw   skipr&   r+   )r,   	real_pathr-   s      r   1test_progressive_disclosure_is_false_in_real_filezGTestRealWorkspaceFile.test_progressive_disclosure_is_false_in_real_file   sH    D	ww~~i(KKDEY'  !ABdJJJr!   N)r>   r?   r@   r   r4   r!   r   r   r      s    Kr!   r   )__doc__r   rb   rO   pathlibr   rw   utils.feature_flagsr   fixturer    r   r&   r(   rB   rU   rk   ro   r|   r   r4   r!   r   <module>r      s    +  	    1  &(c (/ (; ;4K KNL LJ| |*X X*	, 	,"K Kr!   