
    ii!                     .   d 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z               ddlZej                  d        Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zy)u8   test_collect_metrics.py — collect_metrics.py 테스트    N)date)Pathscriptsc                     dddddddidd	d
dddddddddi}| dz  }|j                  t        j                  |      d       |S )u$   테스트용 task-timers.json 생성taskstask-1	dev1-team	completedz2026-04-16T10:00:00cost_estimate_usd      ?)task_idteam_idstatusend_timetoken_usagetask-2	dev2-teamz2026-04-16T15:00:00)r   r   r   r   task-3runningNr   r   r   ztask-timers.jsonutf-8encoding)
write_textjsondumps)tmp_pathdataps      K/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_collect_metrics.pysample_task_timersr!      s}     	#&%1 3S9 $&%1	 $&# 	
D. 	%%ALLD!GL4H    c                     | j                  t        d|       t        j                         }t        |t              sJ d       t        |      dk(  sJ d       dD ]  }||v rJ | d        y)uI   task-timers.json 파일이 존재할 때 정상 로드 + tasks 키 확인TASK_TIMERS_PATHu1   load_task_timers()는 dict를 반환해야 한다   u*   3개 task가 모두 로드되어야 한다r   u   가 결과에 없다N)setattrcollect_metricsload_task_timers
isinstancedictlen)monkeypatchr!   resultr   s       r    test_load_task_timersr.   2   s    );=OP--/F fd#X%XX#v;!III1 C& BWI-A"BB Cr"   c                 |    | dz  }|j                  t        d|       t        j                         }|i k(  sJ d       y)u4   파일이 없을 때 빈 dict 반환 (에러 없음)zno-such-file.jsonr$   u1   파일 없을 때 빈 dict를 반환해야 한다N)r&   r'   r(   )r   r,   missingr-   s       r    "test_load_task_timers_missing_filer1   A   s@    ,,G);WE--/FR<LLL<r"   c                 "   | j                  t        d|       t        ddd      }t        j                  |      }|d   dk(  sJ d       d|v sJ d	       |d   j	                  d
      dk(  sJ d       |d   j	                  d      dk(  sJ d       y)u:   M-3: 특정 날짜 완료 task 수 + by_team 분류 검증r$           value   u1   2026-04-16에 완료된 task는 2개여야 한다by_teamu   by_team 키가 있어야 한다r	      u   dev1-team task 1개r   u   dev2-team task 1개N)r&   r'   r   collect_daily_completedgetr,   r!   targetr-   s       r    test_collect_daily_completedr>   O   s    );=OP$2F44V<F '?aT!TTA AA)  -2I4II2)  -2I4II2r"   c                     | j                  t        d|       t        ddd      }t        j                  |      }|d   dk(  sJ d       |d   i k(  sJ d	       y
)u   날짜가 다른 경우 count=0r$   r3   r4      r6   r   u8   해당 날짜 완료 task가 없으면 0이어야 한다r8   u"   by_team도 비어 있어야 한다N)r&   r'   r   r:   r<   s       r    %test_collect_daily_completed_no_matchrA   ]   se    );=OP$2F44V<F'?a[![[)"H$HH"r"   c                     | j                  t        d|       t        ddd      }t        j                  |      }|d   t	        j
                  d      k(  sJ d       |d   d	k(  sJ |d
   dk(  sJ d       y)uD   M-7: token_usage 있는 task와 없는 task 혼재 시 정상 합산r$   r3   r4   r5   r6   r   u(   AI 비용 합산이 1.5 USD여야 한다currencyUSD
task_countr9   u-   비용이 기록된 task는 1개여야 한다N)r&   r'   r   collect_ai_costpytestapproxr<   s       r    test_collect_ai_costrI   l   s    );=OP$2F,,V4F '?fmmC00\2\\0*&&&,1$U&UU$r"   c                    dddddddddd	d
i}| dz  }|j                  t        j                  |      d       |j                  t        d|       t        ddd      }t	        j                  |      }|d   dk(  sJ d       |d   dk(  sJ y)u;   token_usage 없는 task만 있을 때 cost=0, 에러 없음r   t-ar
   z2026-04-16T09:00:00)r   r   r   t-bz2026-04-16T11:00:00N)r   r   r   r   )rK   rL   ztask-timers-no-cost.jsonr   r   r$   r3   r4   r5   r6   g        u=   비용 없는 task만 있으면 합산은 0.0이어야 한다rE   r   )r   r   r   r&   r'   r   rF   )r   r,   r   r   r=   r-   s         r    #test_collect_ai_cost_no_token_usagerM   y   s     	 %1 !%1#	
D  	--ALLD!GL4);Q?$2F,,V4F'?c!b#bb!,1$$$r"   c                    |j                  t        d|       |j                  t        dt        |              |j                  t        d| dz  dz         |j                  t        d| dz  dz         |j                  t        dd	        t        d
dd      }t        j                  |      }dD ]  }||v rJ d| d        |d   dk(  sJ d|d   v rd|d   v sJ h d}t        |d   j                               }||k(  sJ d| d|        y)uL   collect_all() 반환 dict의 최상위 키 및 6개 지표 키 존재 확인r$   WORKSPACE_ROOTREPORTS_DIRmemoryreports
EVENTS_DIRevents_run_git_logc                     g S )N )_since_untils     r    <lambda>z,test_collect_all_structure.<locals>.<lambda>   s    PR r"   r3   r4   r5   r   collected_atperiodmetricsu   최상위 키 'u   '가 없다r   
2026-04-16startr]   end>   M-2_revert_countM-5_qc_fail_countM-6_g1_fail_countM-7_total_ai_costM-3_daily_completed_tasksM-1_merge_conflictsr^   u   metrics 키 불일치: 기대=u	   , 실제=N)r&   r'   strr   collect_allsetkeys)r   r,   r!   r=   r-   keyexpected_metric_keysactual_keyss           r    test_collect_all_structurero      sB   );=OP)93x=I88Ki8WXx(7JX7UV 9RS$2F((0F = Af}@uK@@}A &>\)))fX&&5F84D+DDD fY',,./K.. 
()=(>i}U.r"   c                 X   | dz  }|j                  t        d|       ddddddddiid	}t        d
dd      }t        j                  ||      }|j	                         sJ d       |j
                  dk(  sJ t        j                  |j                  d            }|d   dk(  sJ d|v sJ y)uX   save_metrics()가 임시 디렉토리에 유효한 JSON 파일을 생성하는지 검증daily
OUTPUT_DIRr_   z2026-04-16T12:00:00)r`   ra   rg   r6   r   r[   r3   r4   r5   u'   저장된 파일이 존재해야 한다zmetrics-2026-04-16.jsonr   r   r   r^   N)	r&   r'   r   save_metricsexistsnamer   loads	read_text)r   r,   
output_dirsample_datar=   out_pathloadeds          r    test_save_metricsr|      s    G#JzB -(>!GQ<
	K $2F++K@H ??GGG==5555 ZZ**G*<=F&>\)))r"   )__doc__r   sysdatetimer   pathlibr   rG   pathinsertrh   __file__resolveparentr'   fixturer!   r.   r1   r>   rA   rI   rM   ro   r|   rW   r"   r    <module>r      s    >  
    3tH~--/66==	IJ K   DCMJI
V%B!Pr"   