
    i@!                        d Z ddlZddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ ej                  j                  d e e	ej                   j#                  dd                         ddlmZ dd	Z G d
 dej*                        Z G d dej*                        Z G d dej*                        Z G d dej*                        Zedk(  r ej6                          yy)u   
error_alert.py 단위 테스트

테스트 항목:
- check_error_threshold() 정상/비정상 케이스
- format_alert_message() 포맷 검증
- 임계값 미만일 때 False 반환 확인
    N)datetime	timedelta)Path)	MagicMockpatchWORKSPACE_ROOTz/home/jay/workspace)error_alertc                 p    t        j                         t        |       z
  j                         }||||ddS )u.   
    테스트용 에러 레코드 생성
    minutes )tsmodule
error_typemessage	traceback)r   nowr   	isoformat)minutes_agor   r   r   r   s        G/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_error_alert.pymake_error_recordr      s4     ,,.9[9
9	D	D	FBjWceff    c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestCheckErrorThresholdu(   check_error_threshold() 함수 테스트c                     t        j                  t        dd      5  t        j                         }| j	                  |       ddd       y# 1 sw Y   yxY w)u   파일 없을 때 False 반환ERRORS_FILEz!/tmp/nonexistent_file_12345.jsonlN)r   objectr	   check_error_thresholdassertFalse)selfresults     r   test_no_file_returns_falsez2TestCheckErrorThreshold.test_no_file_returns_false$   sD    \\+}6YZ 	% 668FV$	% 	% 	%s   &AAc                 *   t        j                  ddd      5 }t        d      D ]8  }t        d|z         }|j	                  t        j                  |      dz          : |j                  }d	d	d	       	 t        j                  t        d
      5  t        j                  dd      }| j                  |       d	d	d	       t        |      j                  d       y	# 1 sw Y   rxY w# 1 sw Y   1xY w# t              j                  d       w xY w)u%   에러 2개, max_errors=5이면 FalsewF.jsonlmodedeletesuffix      r   
Nr      r   
max_errorsT
missing_oktempfileNamedTemporaryFileranger   writejsondumpsnamer   r   r	   r   r   r   unlinkr    fierror	temp_filer!   s         r   "test_below_threshold_returns_falsez:TestCheckErrorThreshold.test_below_threshold_returns_false*       ((c%Q 	UV1X 2)a!e<

5)D012 I		4k=)D )$::2RST  () O""d"3	 	) ) O""d"30   AC5C5 )C)9C5 C&)C2.C5 5Dc                 *   t        j                  ddd      5 }t        d      D ]8  }t        d|z         }|j	                  t        j                  |      dz          : |j                  }d	d	d	       	 t        j                  t        d
      5  t        j                  dd      }| j                  |       d	d	d	       t        |      j                  d       y	# 1 sw Y   rxY w# 1 sw Y   1xY w# t              j                  d       w xY w)u$   에러 6개, max_errors=5이면 Truer$   Fr%   r&      r+   r,   r-   Nr   r.   r/   Tr1   )r4   r5   r6   r   r7   r8   r9   r:   r   r   r	   r   
assertTruer   r;   r<   s         r   !test_above_threshold_returns_truez9TestCheckErrorThreshold.test_above_threshold_returns_true:   s    ((c%Q 	UV1X 2)a!e<

5)D012 I		4k=)D ($::2RST'( O""d"3	 	( ( O""d"3rC   c                    t        j                  ddd      5 }t        d      D ]8  }t        d|z         }|j	                  t        j                  |      dz          : t        d	      D ]8  }t        d
|z         }|j	                  t        j                  |      dz          : |j                  }ddd       	 t        j                  t        d      5  t        j                  dd      }| j                  |       ddd       t        |      j                  d       y# 1 sw Y   rxY w# 1 sw Y   1xY w# t              j                  d       w xY w)u'   60분 이전 에러는 카운트 제외r$   Fr%   r&      r+   r,   r-      F   Nr   r.   r/   Tr1   r3   r<   s         r   test_old_errors_excludedz0TestCheckErrorThreshold.test_old_errors_excludedJ   s)   ((c%Q 		UV1X 2)a!e<

5)D012 1X 2)b1f=

5)D012 I			4k=)D )$::2RST  ()
 O""d"3#		 		) )
 O""d"3s0   BD#;D; )D/?D; #D,/D84D; ;Ec                 *   t        j                  ddd      5 }t        d      D ]8  }t        d|z         }|j	                  t        j                  |      dz          : |j                  }ddd       	 t        j                  t        d	      5  t        j                  d
d      }| j                  |       ddd       t        |      j                  d       y# 1 sw Y   rxY w# 1 sw Y   1xY w# t              j                  d       w xY w)u5   에러 수 == max_errors이면 False (초과만 True)r$   Fr%   r&   r+   r,   r-   Nr   r.   r/   Tr1   r3   r<   s         r   "test_exact_threshold_returns_falsez:TestCheckErrorThreshold.test_exact_threshold_returns_false_   rB   rC   N)	__name__
__module____qualname____doc__r"   rA   rG   rL   rN    r   r   r   r   !   s    2%4 4 4*4r   r   c                       e Zd ZdZd Zd Zy)TestGetRecentErrorsInWindowu.   get_recent_errors_in_window() 함수 테스트c                    t        j                  ddd      5 }g }t        d      D ]I  }t        d|z         }|j	                  t        j                  |      dz          |j                  |       K t        d	      }|j	                  t        j                  |      dz          |j                  }d
d
d
       	 t        j                  t        d      5  t        j                  d      }| j                  t        |      d       d
d
d
       t        |      j!                  d       y
# 1 sw Y   {xY w# 1 sw Y   1xY w# t              j!                  d       w xY w)u   30분 이내 에러만 반환r$   Fr%   r&   r*   r+   r,   r-   rK   Nr   r.   r   Tr1   )r4   r5   r6   r   r7   r8   r9   appendr:   r   r   r	   get_recent_errors_in_windowassertEquallenr   r;   )r    r=   recent_errorsr>   r?   	old_errorr@   r!   s           r   test_returns_recent_onlyz4TestGetRecentErrorsInWindow.test_returns_recent_onlys   s&   ((c%Q 
	UVM1X ,)a!e<

5)D01$$U+,
 *b9IGGDJJy)D01I
		4k=)D 1$@@L  Va01 O""d"3#
	 
	1 1 O""d"3s0   BD,;E 2D8E ,D58E=E E!c                    t        j                  ddd      5 }|j                  }ddd       	 t        j                  t
        d      5  t        j                  d      }| j                  |g        ddd       t        |      j                  d	
       y# 1 sw Y   rxY w# 1 sw Y   1xY w# t              j                  d	
       w xY w)u   빈 파일이면 []r$   Fr%   r&   Nr   r.   r   Tr1   )
r4   r5   r:   r   r   r	   rX   rY   r   r;   )r    r=   r@   r!   s       r   test_empty_file_returns_emptyz9TestGetRecentErrorsInWindow.test_empty_file_returns_empty   s    ((c%Q 	UVI		4k=)D -$@@L  ,- O""d"3	 	- - O""d"3s.   BB/ 
)B#3B/ B #B,(B/ /CN)rO   rP   rQ   rR   r]   r_   rS   r   r   rU   rU   p   s    84*
4r   rU   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestFormatAlertMessageu'   format_alert_message() 함수 테스트c                 l    t        d      g}t        j                  |      }| j                  d|       y)u   [에러 알림] 포함r+   r,      [에러 알림]N)r   r	   format_alert_messageassertInr    errorsr!   s      r   !test_format_contains_alert_headerz8TestFormatAlertMessage.test_format_contains_alert_header   s.    #2311&9'0r   c                     t        d      D cg c]  }t        d       }}t        j                  |      }| j	                  d|       yc c}w )u   에러 수 포함rI   r+   r,   u   3건Nr6   r   r	   rd   re   )r    _rg   r!   s       r   test_format_shows_countz.TestFormatAlertMessage.test_format_shows_count   sC    <A!HEq#2EE11&9ff% Fs   Ac                 >   t        d      D cg c]  }t        d|z   d|        }}t        j                  |      }| j	                  d|       | j	                  d|       | j	                  d|       | j                  d|       | j                  d|       y	c c}w )
u"   5개 에러 중 최대 3개 표시r+   zerror )r   r   zerror 0zerror 1zerror 2zerror 3zerror 4N)r6   r   r	   rd   re   assertNotInr    r>   rg   r!   s       r   test_format_max_3_itemsz.TestFormatAlertMessage.test_format_max_3_items   s    V[\]V^_QR#As|L__11&9i(i(i(F+F+ `s   Bc                     t        d      D cg c]  }t        d|z          }}t        j                  |      }| j	                  d|       yc c}w )u!   3개 초과 시 "외 N건" 포함r+   r,   u   외 2건Nrj   ro   s       r    test_format_shows_more_indicatorz7TestFormatAlertMessage.test_format_shows_more_indicator   sG    @EaI1#A6II11&9j&) Js   Ac                     g }t        j                  |      }| j                  d|       | j                  |t               y)u   빈 리스트도 처리 가능rc   N)r	   rd   re   assertIsInstancestrrf   s      r   test_empty_errors_handledz0TestFormatAlertMessage.test_empty_errors_handled   s6    11&9'0fc*r   N)	rO   rP   rQ   rR   rh   rl   rp   rr   rv   rS   r   r   ra   ra      s    11&
,*+r   ra   c                   d    e Zd ZdZ ed      d        Z ed      d        Z ed      d        Zy)TestSendAlertu   send_alert() 함수 테스트z utils.error_alert.subprocess.runc                     t        d      |_        t        j                  d      }| j	                  |       |j                          y)u   subprocess.run 성공 시 Truer   
returncodetest messageN)r   return_valuer	   
send_alertrF   assert_called_oncer    mock_runr!   s      r   test_send_successzTestSendAlert.test_send_success   s9     !*Q 7''7##%r   c                 r    t        d      |_        t        j                  d      }| j	                  |       y)u/   subprocess.run 실패 시 False (예외 없이)   rz   r|   N)r   r}   r	   r~   r   r   s      r   test_send_failurezTestSendAlert.test_send_failure   s/     !*Q 7''7 r   c                 p    t        d      |_        t        j                  d      }| j	                  |       y)u&   subprocess.run 예외 발생 시 FalsezConnection failedr|   N)	Exceptionside_effectr	   r~   r   r   s      r   !test_send_exception_returns_falsez/TestSendAlert.test_send_exception_returns_false   s0      ))<=''7 r   N)rO   rP   rQ   rR   r   r   r   r   rS   r   r   rx   rx      sQ    '
-.& /& -.! /! -.! /!r   rx   __main__)r+   test
ValueErrorz
test error)rR   r8   ossysr4   unittestr   r   pathlibr   unittest.mockr   r   pathinsertru   environgetutilsr	   r   TestCaser   rU   ra   rx   rO   mainrS   r   r   <module>r      s     	 
   (  * 3tBJJNN+;=RSTU V gL4h// L4^"4("3"3 "4J&+X.. &+R!H%% !4 zHMMO r   