
    i\F                     V   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mZ ddlZej                   j#                  d e ee      j(                  j(                               ddl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)z@Tests for health-score.py - TDD approach (RED first, then GREEN)    N)Path)	MagicMockpatchc                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestGradeCalculationzTest grade boundariesc                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	NZ   A==zT%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.score_to_grade
}(%(py4)s)
} == %(py9)shspy0py2py4py6py9assert %(py11)spy11
r   score_to_grade
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationself@py_assert1@py_assert3@py_assert5@py_assert8@py_assert7@py_format10@py_format12s           6/home/jay/workspace/scripts/tests/test_health_score.pytest_grade_A_at_90z'TestGradeCalculation.test_grade_A_at_90         ++ $++$++++$++++++r+++r+++ ++++++$+++++++++++    c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	Nd   r
   r   r   r   r   r   r   r   r!   s           r*   test_grade_A_at_100z(TestGradeCalculation.test_grade_A_at_100   s      ,, %,,%,,,,%,,,,,,r,,,r,,, ,,,,,,%,,,,,,,,,,,r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	NY   Br   r   r   r   r   r   r   r!   s           r*   test_grade_B_at_89z'TestGradeCalculation.test_grade_B_at_89   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	NP   r3   r   r   r   r   r   r   r   r!   s           r*   test_grade_B_at_80z'TestGradeCalculation.test_grade_B_at_80   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	NO   Cr   r   r   r   r   r   r   r!   s           r*   test_grade_C_at_79z'TestGradeCalculation.test_grade_C_at_79!   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	NF   r:   r   r   r   r   r   r   r   r!   s           r*   test_grade_C_at_70z'TestGradeCalculation.test_grade_C_at_70$   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	NE   Dr   r   r   r   r   r   r   r!   s           r*   test_grade_D_at_69z'TestGradeCalculation.test_grade_D_at_69'   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	N<   rA   r   r   r   r   r   r   r   r!   s           r*   test_grade_D_at_60z'TestGradeCalculation.test_grade_D_at_60*   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	N;   Fr   r   r   r   r   r   r   r!   s           r*   test_grade_F_at_59z'TestGradeCalculation.test_grade_F_at_59-   r,   r-   c                    t         j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               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 )	Nr   rH   r   r   r   r   r   r   r   r!   s           r*   test_grade_F_at_0z&TestGradeCalculation.test_grade_F_at_00   s      ** #*s*#s****#s******r***r*** ******#***s********r-   N)__name__
__module____qualname____doc__r+   r0   r4   r7   r;   r>   rB   rE   rI   rK    r-   r*   r   r      s7    ,-,,,,,,,+r-   r   c                   "    e Zd ZdZd Zd Zd Zy)TestWeightedScorez!Test weighted average calculationc                    ddiddiddiddiddiddiddid}t        j                  |      }d}||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 )
Nscorer/   test_pass_ratepyright_errorscode_coverage	tech_debtsecuritydocumentationdeploy_stability      Y@r   z%(py0)s == %(py3)sr   py3assert %(py5)spy5
r   calculate_weighted_scorer   r   r   r   r   r   r   r    r"   
categoriesrT   @py_assert2r#   @py_format4@py_format6s          r*   test_weighted_score_all_100z-TestWeightedScore.test_weighted_score_all_1007   s    &n&n%s^!3 #%s^!(#

 ++J7u~uuur-   c                    ddiddiddiddiddiddiddid}t        j                  |      }d}||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 )
NrT   r   rU           r   r^   r_   ra   rb   rc   re   s          r*   test_weighted_score_all_zeroz.TestWeightedScore.test_weighted_score_all_zeroD   s    &l&l%q\!1 !%q\!(!

 ++J7u|uuur-   c                    ddiddiddiddiddiddiddid}t        j                  |      }d}||z
  }t        |      }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                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}x}x}}y )NrT   r/   r   2   rU   g     @J@g{Gz?)<)z;%(py6)s
{%(py6)s = %(py0)s((%(py1)s - %(py3)s))
} < %(py9)sabs)r   py1r`   r   r   r   r   )r   rd   rq   r   r   r   r   r   r   r   r    )
r"   rf   rT   rg   @py_assert4r%   r&   r'   r(   r)   s
             r*   test_weighted_score_mixedz+TestWeightedScore.test_weighted_score_mixedQ   s      'n&l%r]!2 "%r]!("

 ++J7  '54<'s< '4' 4'''' 4''''''s'''s''''''5'''5'''4''' '''4''''''''r-   N)rL   rM   rN   rO   rj   rm   rt   rP   r-   r*   rR   rR   4   s    +(r-   rR   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestOutputSchemazTest JSON output schemac                 L   t        j                  ddddddddddddddddddddddd d       }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}}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}}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 )Nr6    rT   detailsrU   rf   baselinefix_pct_resultrT   inz%(py1)s in %(py3)sresultrr   r`   ra   rb   graderf   
r   build_resultr   r   r   r   r   r   r   r    )r"   r   @py_assert0rg   rh   ri   s         r*   test_output_has_scorez&TestOutputSchema.test_output_has_scoree   sb   ,.2">,.2">+-"!=')b9&(R8+-"!=.0R$@ 
  w&    w&   w      &   &        w&    w&   w      &   &       %|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%r-   c                    ddddd}t        j                  dddddddddddddddddddddd	d |
      }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}}|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}}|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 )N
            >@F)total	fix_countpctwarningr6   rx   ry   rU   r{   fix_pctr~   r   r   r   ra   rb   r   r   z%(py1)s == %(py4)srr   r   assert %(py6)sr   r   r   )
r"   r   r   r   rg   rh   ri   r$   @py_format5@py_format7s
             r*   test_output_has_fix_pct_sectionz0TestOutputSchema.test_output_has_fix_pct_sectionw   sl   QtN,.2">,.2">+-"!=')b9&(R8+-"!=.0R$@ "
 "yF""""yF"""y""""""F"""F"""""""i )/R/)R////)R///)///R///////i -22-2222-222-2222222222r-   c                 `   t        j                  ddddddddddddddddddddddd d       }|d   }t        |t              }|sd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	t        j                  |      d
z  }t        t        j                  |            d x}}y )NU   rx   ry   rU   r{   rT   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstanceint)r   r   r`   rb   )r   r   r   r   r   r   r   r   r   r   r    )r"   r   r#   rs   ri   s        r*   test_output_score_is_intz)TestOutputSchema.test_output_score_is_int   s    ,.2">,.2">+-"!=')b9&(R8+-"!=.0R$@ 
 !//z/3////////z///z//////////3///3//////////r-   c                    t        j                  ddddddddddddddddddddddd d       }t        j                  |      }t        j                  |      }|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 )Nr6   okry   rU   r{   rT   r   r   r   r   r   )
r   r   jsondumpsloadsr   r   r   r   r    )	r"   r   json_strparsedr   r$   rg   r   r   s	            r*    test_output_is_json_serializablez1TestOutputSchema.test_output_is_json_serializable   s    ,.4"@,.4"@+-$!?')d;&(T:+-$!?.0T$B 
 ::f%H%g1&/1/1111/111111/1111111r-   N)rL   rM   rN   rO   r   r   r   r   rP   r-   r*   rv   rv   b   s    !&$3&0 2r-   rv   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestBaselineComparisonzTest baseline comparison logicc           	         dddddddddddddddddddddd}dddiddiddiddiddiddiddidi}t        j                  ||d 	      }|d   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}}|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 )Nr	   rx   ry   r6   r=   rU   rf   rT   r|   r}   rV   deltar   r   r   r   r   r   	directionimprovedr   r   r   r   r   r   r    
r"   current_categoriesr|   r   catr   r$   rg   r   r   s
             r*   !test_baseline_comparison_improvedz8TestBaselineComparison.test_baseline_comparison_improved   sJ   (*r:(*r:')b9#%"5"$4')b9*, <
 #*B-#*B-")2%r]$bM")2%,bM

 !3hW[\\"#347|!r!|r!!!!|r!!!|!!!r!!!!!!!;-:-:----:------:-------r-   c           	         dddddddddddddddddddddd}dddiddiddiddiddiddiddidi}t        j                  ||d       }|d   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}x}}|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 )Nr=   rx   ry   r6   rU   rf   rT   r   rV   r   r   r   )z%(py1)s == -%(py4)sr   zassert %(py7)spy7r   degradedr   r   r   r   )r"   r   r|   r   r   r   r$   r%   rg   ri   @py_format8r   r   s                r*   !test_baseline_comparison_degradedz8TestBaselineComparison.test_baseline_comparison_degraded   sQ   (*r:(*r:')b9#%"5"$4')b9*, <
 #*B-#*B-")2%r]$bM")2%,bM

 !3hW[\\"#347|""s"|s""""|s"""|"""""""""";-:-:----:------:-------r-   c           	         dddddddddddddddddddddd}dddiddiddiddiddiddiddidi}t        j                  ||d       }|d   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}}|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 )Nr6   rx   ry   r=   rU   rf   rT   r   rV   r   r   r   r   r   r   r   r   stabler   r   s
             r*   test_baseline_comparison_stablez6TestBaselineComparison.test_baseline_comparison_stable   sJ   (*r:(*r:')b9#%"5"$4')b9*, <
 #*B-#*B-")2%r]$bM")2%,bM

 !3hW[\\"#347| q |q    |q   |   q       ;+8+8++++8++++++8+++++++r-   c                    t        j                  dddddddddddddddddddddddd      }|d   d   }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}}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)z9When baseline file doesn't exist, no comparison, no errorr6   rx   ry   rU   Nr{   rf   rV   r   )not in)z%(py1)s not in %(py3)sr   r   ra   rb   r   r   )r"   r   r   r   rg   rh   ri   s          r*   #test_baseline_file_missing_gracefulz:TestBaselineComparison.test_baseline_file_missing_graceful   s   ,.2">,.2">+-"!=')b9&(R8+-"!=.0R$@ 
 \"#34!wc!!!!wc!!!w!!!!!!c!!!c!!!!!!!%{#%%%%{#%%%{%%%%%%#%%%#%%%%%%%r-   c                 x   t        j                  d      }d}||u }|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)	z6load_baseline returns None for missing file gracefullyz"/nonexistent/path/qa-baseline.jsonNis)z%(py0)s is %(py3)sr   r_   ra   rb   )
r   load_baseliner   r   r   r   r   r   r   r    r"   r   rg   r#   rh   ri   s         r*   test_load_baseline_missing_filez6TestBaselineComparison.test_load_baseline_missing_file  sk    !!"FGv~vvvr-   c                 :   t        j                  ddd      5 }t        j                  di d|       |j	                          t        j                  |j                        }ddd       d}|u}|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}}|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# 1 sw Y   0xY w)z+load_baseline reads JSON from existing filew.jsonFmodesuffixdeleter   )rT   rf   N)is not)z%(py0)s is not %(py3)sr   r_   ra   rb   rT   r   r   r   r   r   )tempfileNamedTemporaryFiler   dumpflushr   r   namer   r   r   r   r   r   r   r    )r"   fr   rg   r#   rh   ri   r   r$   r   r   s              r*   test_load_baseline_valid_filez4TestBaselineComparison.test_load_baseline_valid_file  s   ((c'%P 	.TUII"5q9GGI%%aff-F	. "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!g$"$"$$$$"$$$$$$"$$$$$$$	. 	.s   A	FFN)
rL   rM   rN   rO   r   r   r   r   r   r   rP   r-   r*   r   r      s#    (.4.4,4&(
%r-   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)
TestFixPctzTest fix percentage calculationc                 F   ddddddddd}t        j                  |      }|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}}|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}}|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}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Ntask-1u   새 기능 추가	completedtask_iddescriptionstatustask-2u   리팩토링r   r   r      r   r   r   r   r   r   r   r   rl   r   Fr   z%(py1)s is %(py4)sr   calculate_fix_pctr   r   r   r   r    r"   tasksr   r   r$   rg   r   r   s           r*   test_fix_pct_no_fix_tasksz$TestFixPct.test_fix_pct_no_fix_tasks%  sr   "*;NZef"*>U`a
 %%e,g#!#!####!######!#######k"'a'"a''''"a'''"'''a'''''''e}##}####}###}##########i )E) E)))) E))) )))E)))))))r-   c                 F   ddddddddd}t        j                  |      }|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}}|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}}|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}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr   u   버그 수정 작업r   r   r   zfix login errorr   r   r   r   r   r   r   r   r   r   r]   r   Tr   r   r   r   s           r*   test_fix_pct_all_fix_tasksz%TestFixPct.test_fix_pct_all_fix_tasks0  ss   "*;Q]hi"*;LXcd
 %%e,g#!#!####!######!#######k"'a'"a''''"a'''"'''a'''''''e}%%}%%%%}%%%}%%%%%%%%%%i (D( D(((( D((( (((D(((((((r-   c                    i }t        d      D ]  }d| ddd|d| <    t        dd      D ]  }d| ddd|d| <    t        j                  |      }|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}}|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}}|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}}|d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z31% should trigger warningr@   task-   일반 작업r   r   r/   fix somethingr   r   r   r   r   r   Nr      r   g      ?@r   Tr   r   ranger   r   r   r   r   r   r    	r"   r   ir   r   r$   rg   r   r   s	            r*   $test_fix_pct_30pct_threshold_warningz/TestFixPct.test_fix_pct_30pct_threshold_warning;  s   r 	qA/4QC[do!pEE!+	qr3 	qA/4QC[do!pEE!+	q%%e,g%#%#%%%%#%%%%%%#%%%%%%%k"(b("b(((("b((("(((b(((((((e}$$}$$$$}$$$}$$$$$$$$$$i (D( D(((( D((( (((D(((((((r-   c                    i }t        d      D ]  }d| ddd|d| <    t        dd      D ]  }d| ddd|d| <    t        j                  |      }|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}}|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}}|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}}|d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z&Exactly 30% should NOT trigger warningr=   r   r   r   r   r/   r   r   r   r   r   r   r   Nr      r   r   r   Fr   r   r   r   s	            r*   #test_fix_pct_30pct_exact_no_warningz.TestFixPct.test_fix_pct_30pct_exact_no_warningH  s   r 	qA/4QC[do!pEE!+	qr3 	qA/4QC[do!pEE!+	q%%e,g%#%#%%%%#%%%%%%#%%%%%%%k"(b("b(((("b((("(((b(((((((e}$$}$$$$}$$$}$$$$$$$$$$i )E) E)))) E))) )))E)))))))r-   c                 >   dddddi}t        j                  |      }|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 )Nt1zfix the broken pipeliner   r   r      r   r   r   r   r   r   r   s           r*   test_fix_pct_keywords_fixz$TestFixPct.test_fix_pct_keywords_fixU  sw    48Q]hij%%e,k"'a'"a''''"a'''"'''a'''''''r-   c                 >   dddddi}t        j                  |      }|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 )Nr   u   코드 수정 필요r   r   r   r   r   r   r   r   r   r   r   s           r*      test_fix_pct_keywords_수정u'   TestFixPct.test_fix_pct_keywords_수정Z  sw    48NZefg%%e,k"'a'"a''''"a'''"'''a'''''''r-   c                 >   dddddi}t        j                  |      }|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 )Nr   u   버그 발견 및 처리r   r   r   r   r   r   r   r   r   r   r   s           r*      test_fix_pct_keywords_버그u'   TestFixPct.test_fix_pct_keywords_버그_  sw    48R^ijk%%e,k"'a'"a''''"a'''"'''a'''''''r-   c                 ,   t        j                  i       }|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}}|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}}|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}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z/Empty tasks dict should return pct=0 gracefullyr   r   r   r   r   r   r   Nr   r   rl   r   Fr   r   r   )r"   r   r   r$   rg   r   r   s          r*   test_fix_pct_empty_tasksz#TestFixPct.test_fix_pct_empty_tasksd  sR   %%b)g#!#!####!######!#######k"'a'"a''''"a'''"'''a'''''''e}##}####}###}##########i )E) E)))) E))) )))E)))))))r-   c                 z   t        j                  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)	z?load_task_timers returns empty dict for missing file gracefullyz/nonexistent/task-timers.jsonr   r^   r   r_   ra   rb   N)
r   load_task_timersr   r   r   r   r   r   r   r    r   s         r*   "test_load_task_timers_missing_filez-TestFixPct.test_load_task_timers_missing_filel  sk    $$%DEv|vvvr-   c                 N   ddddddii}t        j                  ddd	      5 }t        j                  ||       |j	                          t        j                  |j                        }d
d
d
       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}}|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
# 1 sw Y   3xY w)z1load_task_timers reads tasks from valid JSON filer   r   z	test taskr   r   r   r   Fr   Nr~   r   r   r   ra   rb   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    )r"   datar   r   r   rg   rh   ri   r$   r   r   s              r*    test_load_task_timers_valid_filez+TestFixPct.test_load_task_timers_valid_fileq  s)    h{Vab

 ((c'%P 	1TUIIdAGGI((0F	1 !x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!h.=+=.+====.+===.===+=======	1 	1s   AFF$N)rL   rM   rN   rO   r   r   r   r   r   r   r   r   r   r   rP   r-   r*   r   r   "  s7    )	*	))*(
(
(
*
>r-   r   c                   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)TestCollectorFunctionsz!Test category collector functionsc           	      Z   t        j                         5 }t        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}}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}}d
}|d   }||k  }d}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}x}	x}}ddd       y# 1 sw Y   yxY w)z6Each collector must return dict with score and detailsrT   r~   r   r   r   ra   rb   Nrz   r   r/   <=r  z%(py1)s <= %(py5)sz%(py5)s <= %(py7)srr   rb   r   assert %(py9)sr   )r   TemporaryDirectoryr   collect_test_pass_rater   r   r   r   r   r   r   r    r"   tmpdirr   r   rg   rh   ri   rs   @py_assert6r$   r   r(   s               r*   &test_collect_returns_score_and_detailsz=TestCollectorFunctions.test_collect_returns_score_and_details  sT   ((* 	/f..v6F$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$&9&&&&9&&&9&&&&&&&&&&&&&&&&.w.1..3.3.....13...1......3.......		/ 	/ 	/   HH!!H*c           	      Z   t        j                         5 }t        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}}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}}d	}|d   }||k  }d
}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}	x}}d d d        y # 1 sw Y   y xY wNrT   r~   r   r   r   ra   rb   rz   r   r/   r  r  r  r  r   )r   r	  r   collect_pyright_errorsr   r   r   r   r   r   r   r    r  s               r*   5test_collect_pyright_errors_returns_score_and_detailszLTestCollectorFunctions.test_collect_pyright_errors_returns_score_and_details  sT   ((* 	/f..v6F$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$&9&&&&9&&&9&&&&&&&&&&&&&&&&.w.1..3.3.....13...1......3.......		/ 	/ 	/r  c           	      Z   t        j                         5 }t        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}}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}}d	}|d   }||k  }d
}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}	x}}d d d        y # 1 sw Y   y xY wr  )r   r	  r   collect_code_coverager   r   r   r   r   r   r   r    r  s               r*   4test_collect_code_coverage_returns_score_and_detailszKTestCollectorFunctions.test_collect_code_coverage_returns_score_and_details  T   ((* 	/f--f5F$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$&9&&&&9&&&9&&&&&&&&&&&&&&&&.w.1..3.3.....13...1......3.......		/ 	/ 	/r  c           	      Z   t        j                         5 }t        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}}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}}d	}|d   }||k  }d
}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}	x}}d d d        y # 1 sw Y   y xY wr  )r   r	  r   collect_tech_debtr   r   r   r   r   r   r   r    r  s               r*   0test_collect_tech_debt_returns_score_and_detailszGTestCollectorFunctions.test_collect_tech_debt_returns_score_and_details  sT   ((* 	/f))&1F$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$&9&&&&9&&&9&&&&&&&&&&&&&&&&.w.1..3.3.....13...1......3.......		/ 	/ 	/r  c           	      Z   t        j                         5 }t        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}}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}}d	}|d   }||k  }d
}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}	x}}d d d        y # 1 sw Y   y xY wr  )r   r	  r   collect_securityr   r   r   r   r   r   r   r    r  s               r*   /test_collect_security_returns_score_and_detailszFTestCollectorFunctions.test_collect_security_returns_score_and_details  sT   ((* 	/f((0F$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$&9&&&&9&&&9&&&&&&&&&&&&&&&&.w.1..3.3.....13...1......3.......		/ 	/ 	/r  c           	      Z   t        j                         5 }t        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}}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}}d	}|d   }||k  }d
}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}	x}}d d d        y # 1 sw Y   y xY wr  )r   r	  r   collect_documentationr   r   r   r   r   r   r   r    r  s               r*   4test_collect_documentation_returns_score_and_detailszKTestCollectorFunctions.test_collect_documentation_returns_score_and_details  r  r  c           	      Z   t        j                         5 }t        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}}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}}d	}|d   }||k  }d
}||k  }	|r|	st	        j
                  d||	fd|||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            d x}x}x}	x}}d d d        y # 1 sw Y   y xY wr  )r   r	  r   collect_deploy_stabilityr   r   r   r   r   r   r   r    r  s               r*   7test_collect_deploy_stability_returns_score_and_detailszNTestCollectorFunctions.test_collect_deploy_stability_returns_score_and_details  sT   ((* 	/f008F$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$&9&&&&9&&&9&&&&&&&&&&&&&&&&.w.1..3.3.....13...1......3.......		/ 	/ 	/r  c                    t        j                         5 }t        j                  |      }|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}}|d	   }d
}||k7  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}ddd       y# 1 sw Y   yxY w)z0Empty directory should return score=0 gracefullyrT   r   r   r   r   r   r   Nrz   rx   )!=)z%(py1)s != %(py4)s)	r   r	  r   r
  r   r   r   r   r    )r"   r  r   r   r$   rg   r   r   s           r*   %test_collect_test_pass_rate_empty_dirz<TestCollectorFunctions.test_collect_test_pass_rate_empty_dir  s    ((* 	+f..v6F'?'a'?a''''?a'''?'''a''''''')$**$****$***$**********	+ 	+ 	+s   DD44D=c           
      z   t        j                         5 }t        j                  |      }h d}|j                  } |       }t        |      }||k(  }|sKt        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                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }	t        t        j                  |	            d
x}x}x}}d
d
d
       y
# 1 sw Y   y
xY w)z/collect_all_categories returns all 7 categories>   rZ   rY   rX   r[   rW   rV   r\   r   )za%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.keys
}()
})
} == %(py9)ssetrf   expected_keys)r   rr   r`   rb   r   r   r   r   N)r   r	  r   collect_all_categorieskeysr(  r   r   r   r   r   r   r   r    )
r"   r  rf   r)  rg   rs   r  r&   r(   r)   s
             r*   test_collect_all_categoriesz2TestCollectorFunctions.test_collect_all_categories  s   ((* 	;f226:JM ":(:3():)]::::)]::::::3:::3::::::z:::z::::::(:::)::::::]:::]:::::::	; 	; 	;s   FF11F:N)rL   rM   rN   rO   r  r  r  r  r  r   r#  r&  r,  rP   r-   r*   r  r    s2    +///////+;r-   r  )rO   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   sysr   pathlibr   unittest.mockr   r   pytestpathinsertstr__file__parenthealth_scorer   r   rR   rv   r   r   r  rP   r-   r*   <module>r;     s    F    
   *  3tH~,,334 5 + +D+( +(\I2 I2Xq% q%h[> [>|I; I;r-   