@@ -1005,6 +1005,7 @@ def test_compare_test_runs_happy_path(
10051005 diff = MagicMock ()
10061006 diff .total_baseline = 100
10071007 diff .total_target = 100
1008+ diff .stable_passes = 98
10081009 diff .regressions = [
10091010 _mock_diff_row (
10101011 TestResultStatus .Passed ,
@@ -1025,6 +1026,8 @@ def test_compare_test_runs_happy_path(
10251026 out = compare_test_runs (str (uuid4 ()), str (uuid4 ()))
10261027
10271028 assert "Test Run Comparison" in out
1029+ assert "Stable passes (Baseline passed → Target passed)" in out
1030+ assert "| Stable passes (Baseline passed → Target passed) | 98 |" in out
10281031 assert "Regressions" in out
10291032 assert "Pattern Match" in out
10301033 assert "Passed → Failed" in out
@@ -1034,6 +1037,51 @@ def test_compare_test_runs_happy_path(
10341037 mock_result .diff_with_details .assert_called_once_with (baseline_run .id , target_run .id )
10351038
10361039
1040+ def _fetch_row (test_definition_id , status ):
1041+ row = MagicMock ()
1042+ row .test_definition_id = test_definition_id
1043+ row .test_type = "Pattern_Match"
1044+ row .test_name_short = "Pattern Match"
1045+ row .table_name = "orders"
1046+ row .column_names = "customer_id"
1047+ row .status = status
1048+ row .result_measure = "0"
1049+ row .threshold_value = "0"
1050+ return row
1051+
1052+
1053+ def test_diff_with_details_counts_stable_passes ():
1054+ from testgen .common .models .test_result import TestResult
1055+
1056+ stable_1 , stable_2 , regressed , improved = uuid4 (), uuid4 (), uuid4 (), uuid4 ()
1057+ baseline_rows = [
1058+ _fetch_row (stable_1 , TestResultStatus .Passed ),
1059+ _fetch_row (stable_2 , TestResultStatus .Passed ),
1060+ _fetch_row (regressed , TestResultStatus .Passed ),
1061+ _fetch_row (improved , TestResultStatus .Failed ),
1062+ ]
1063+ target_rows = [
1064+ _fetch_row (stable_1 , TestResultStatus .Passed ),
1065+ _fetch_row (stable_2 , TestResultStatus .Passed ),
1066+ _fetch_row (regressed , TestResultStatus .Failed ),
1067+ _fetch_row (improved , TestResultStatus .Passed ),
1068+ ]
1069+ session = MagicMock ()
1070+ session .execute .side_effect = [baseline_rows , target_rows ]
1071+
1072+ with patch ("testgen.common.models.test_result.get_current_session" , return_value = session ):
1073+ diff = TestResult .diff_with_details (uuid4 (), uuid4 ())
1074+
1075+ assert diff .stable_passes == 2
1076+ assert len (diff .regressions ) == 1
1077+ assert len (diff .improvements ) == 1
1078+ assert len (diff .persistent_failures ) == 0
1079+ # Internal consistency: with no out-of-bucket statuses (Error/Log) in the fixture, the four
1080+ # named buckets account for every shared test definition.
1081+ shared = diff .total_target - len (diff .new_tests )
1082+ assert diff .stable_passes + len (diff .regressions ) + len (diff .improvements ) + len (diff .persistent_failures ) == shared
1083+
1084+
10371085@patch ("testgen.mcp.tools.test_results.TestSuite" )
10381086@patch ("testgen.mcp.tools.test_results.TestResult" )
10391087@patch ("testgen.mcp.tools.test_results.TestRun" )
0 commit comments