PASSED
tSQLt SQL E2E
Generated at 2026-10-05T19:44:23.527Z. Raw output: run-tsqlt-output.txt. Structured data: results.json.
Total
500
Passed
500
Failed
0
Skipped
0
Errored
0
Modules
23
Module Summary
| Module | Total | Passed | Failed | Skipped | Errored |
|---|---|---|---|---|---|
| DIM_Dimensions_Tests | 8 | 8 | 0 | 0 | 0 |
| DIM_ProfileInspections_Tests | 14 | 14 | 0 | 0 | 0 |
| DIM_ProfileSpecs_Tests | 29 | 29 | 0 | 0 | 0 |
| LAB_EvaluateMechanicalResult_Tests | 13 | 13 | 0 | 0 | 0 |
| LAB_TensileRequirements_Tests | 15 | 15 | 0 | 0 | 0 |
| M2_CarrierInstancesPasses_Tests | 31 | 31 | 0 | 0 | 0 |
| M2_CarrierProtection_Tests | 48 | 48 | 0 | 0 | 0 |
| M2_DeleteEvent_Tests | 4 | 4 | 0 | 0 | 0 |
| M2_DetectRollsetDisruption_Tests | 28 | 28 | 0 | 0 | 0 |
| M2_DisruptionTracking_Tests | 16 | 16 | 0 | 0 | 0 |
| M2_DraftEvents_Tests | 70 | 70 | 0 | 0 | 0 |
| M2_EdgerRollPass_Tests | 15 | 15 | 0 | 0 | 0 |
| M2_EventErrorHandling_Tests | 9 | 9 | 0 | 0 | 0 |
| M2_EventIntegration_Tests | 35 | 35 | 0 | 0 | 0 |
| M2_GetCampaignsByEventId_Tests | 2 | 2 | 0 | 0 | 0 |
| M2_GetProductionMonth_Tests | 6 | 6 | 0 | 0 | 0 |
| M2_NonProductiveOverlap_Tests | 10 | 10 | 0 | 0 | 0 |
| M2_PassCampaigns_Tests | 14 | 14 | 0 | 0 | 0 |
| M2_ResolveEventCollisions_Tests | 48 | 48 | 0 | 0 | 0 |
| M2_ScheduleCompaction_Tests | 22 | 22 | 0 | 0 | 0 |
| M2_SwapRollsetsRolls_Tests | 16 | 16 | 0 | 0 | 0 |
| M2_SyncCampaignsToProductionEvents_Tests | 39 | 39 | 0 | 0 | 0 |
| M2_TrackPassCampaignsJob_Tests | 8 | 8 | 0 | 0 | 0 |
Test Results
| # | Module | Test | Duration (ms) | Result |
|---|---|---|---|---|
| 1 | DIM_Dimensions_Tests | test DeleteDimension amends a scheduled revision keeping its date and deactivates the original | 110 | Success |
| 2 | DIM_Dimensions_Tests | test DeleteDimension amends the revision in force from now on without the dimension | 98 | Success |
| 3 | DIM_Dimensions_Tests | test DeleteDimension leaves older published revisions untouched | 106 | Success |
| 4 | DIM_Dimensions_Tests | test DeleteDimension numbers a second retirement after the previous amendment | 118 | Success |
| 5 | DIM_Dimensions_Tests | test DeleteDimension removes the dimension from drafts without numbering them | 122 | Success |
| 6 | DIM_Dimensions_Tests | test PublishSpecsWithoutDimensions rejects leaving a revision without bands | 61 | Success |
| 7 | DIM_Dimensions_Tests | test UpsertDimension reactivates a retired dimension when its code is created again | 90 | Success |
| 8 | DIM_Dimensions_Tests | test UpsertDimension rejects a code used by an active dimension | 61 | Success |
| 9 | DIM_ProfileInspections_Tests | test GetProfileInspections grades each reading against the band of its revision | 90 | Success |
| 10 | DIM_ProfileInspections_Tests | test GetProfileInspections uses the revision the sample was judged against | 147 | Success |
| 11 | DIM_ProfileInspections_Tests | test UpsertProfileInspection does not judge against a scheduled revision | 86 | Success |
| 12 | DIM_ProfileInspections_Tests | test UpsertProfileInspection ignores a campaign that starts after the sample | 118 | Success |
| 13 | DIM_ProfileInspections_Tests | test UpsertProfileInspection judges against a scheduled revision as soon as its date passes | 110 | Success |
| 14 | DIM_ProfileInspections_Tests | test UpsertProfileInspection pins again when an edit moves SampledAt | 126 | Success |
| 15 | DIM_ProfileInspections_Tests | test UpsertProfileInspection pins the revision in force when the sample was taken | 93 | Success |
| 16 | DIM_ProfileInspections_Tests | test UpsertProfileInspection rejects a dimension the revision does not measure | 73 | Success |
| 17 | DIM_ProfileInspections_Tests | test UpsertProfileInspection rejects a heat id that does not exist | 98 | Success |
| 18 | DIM_ProfileInspections_Tests | test UpsertProfileInspection rejects a heat name of neither year | 122 | Success |
| 19 | DIM_ProfileInspections_Tests | test UpsertProfileInspection resolves a heat with no campaign from the previous year | 126 | Success |
| 20 | DIM_ProfileInspections_Tests | test UpsertProfileInspection stores a heat rolled on another section without its campaign | 151 | Success |
| 21 | DIM_ProfileInspections_Tests | test UpsertProfileInspection takes the campaign of a heat sent by id | 163 | Success |
| 22 | DIM_ProfileInspections_Tests | test UpsertProfileInspection takes the heat and campaign from the campaign that was running | 90 | Success |
| 23 | DIM_ProfileSpecs_Tests | test CK_DIM_ProfileSpecDimensions_Band accepts null limits | 221 | Success |
| 24 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec accepts an explicit Rev only above the last one | 123 | Success |
| 25 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec accepts the same date as a previous revision without inspections | 114 | Success |
| 26 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec numbers the revision after the last confirmed one | 106 | Success |
| 27 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec rejects a date before a previous revision without inspections | 102 | Success |
| 28 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec rejects a date equal to the last inspection of the previous revision | 94 | Success |
| 29 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec rejects a revision already confirmed | 73 | Success |
| 30 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec with a future EffectiveDate leaves the revision scheduled | 81 | Success |
| 31 | DIM_ProfileSpecs_Tests | test ConfirmProfileSpec without EffectiveDate publishes the revision now | 94 | Success |
| 32 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec amends the revision back in force when it has a retired dimension | 106 | Success |
| 33 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec brings the previous revision back in force | 82 | Success |
| 34 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec deletes a published Rev with all its sub-revisions | 70 | Success |
| 35 | DIM_ProfileSpecs_Tests | test DeleteProfileSpec rejects a Rev while one of its sub-revisions has active inspections | 81 | Success |
| 36 | DIM_ProfileSpecs_Tests | test GetProfileSpec returns a scheduled revision by id as S and SCHEDULED | 78 | Success |
| 37 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec rejects a published revision | 135 | Success |
| 38 | DIM_ProfileSpecs_Tests | test UnscheduleProfileSpec sends a scheduled revision back to draft with its bands | 106 | Success |
| 39 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec accepts a band with null limits | 81 | Success |
| 40 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec creates a draft without Rev or EffectiveDate | 110 | Success |
| 41 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec opens a draft when a published revision is edited | 118 | Success |
| 42 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects a band out of order | 61 | Success |
| 43 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects a new draft when the section already has one | 212 | Success |
| 44 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects a new draft while a revision is scheduled | 81 | Success |
| 45 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects an unknown or retired dimension code | 45 | Success |
| 46 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec rejects editing a scheduled revision | 81 | Success |
| 47 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec with null id creates a draft without changing the published revision | 184 | Success |
| 48 | DIM_ProfileSpecs_Tests | test UpsertProfileSpec writes a first drawing onto the published revision | 85 | Success |
| 49 | DIM_ProfileSpecs_Tests | test vProfileSpecs shows a confirmed revision whose EffectiveDate has passed as P | 78 | Success |
| 50 | DIM_ProfileSpecs_Tests | test vProfileSpecs shows a confirmed revision with a future EffectiveDate as S | 98 | Success |
| 51 | DIM_ProfileSpecs_Tests | test vProfileSpecs shows a draft as D | 45 | Success |
| 52 | LAB_EvaluateMechanicalResult_Tests | test Elongation is never converted | 0 | Success |
| 53 | LAB_EvaluateMechanicalResult_Tests | test ksi limits are not converted | 0 | Success |
| 54 | LAB_EvaluateMechanicalResult_Tests | test missing Yield fails when a min is required | 0 | Success |
| 55 | LAB_EvaluateMechanicalResult_Tests | test Passed is NULL when there is nothing to check | 0 | Success |
| 56 | LAB_EvaluateMechanicalResult_Tests | test RA missing with section but no grade limit does not fail | 0 | Success |
| 57 | LAB_EvaluateMechanicalResult_Tests | test RA missing with section demanding it fails | 5 | Success |
| 58 | LAB_EvaluateMechanicalResult_Tests | test RA missing without section does not fail | 4 | Success |
| 59 | LAB_EvaluateMechanicalResult_Tests | test RA present below min is judged regardless of section | 4 | Success |
| 60 | LAB_EvaluateMechanicalResult_Tests | test RA present in range with section and grade passes | 4 | Success |
| 61 | LAB_EvaluateMechanicalResult_Tests | test Tensile max in N per mm2 fails above converted max | 0 | Success |
| 62 | LAB_EvaluateMechanicalResult_Tests | test Yield in N per mm2 fails below converted min | 4 | Success |
| 63 | LAB_EvaluateMechanicalResult_Tests | test Yield in N per mm2 passes after conversion | 0 | Success |
| 64 | LAB_EvaluateMechanicalResult_Tests | test Yield in PSI fails below converted min | 4 | Success |
| 65 | LAB_TensileRequirements_Tests | test CorrectHeatGrades updates GradeId when swv-mes has different grade | 65 | Success |
| 66 | LAB_TensileRequirements_Tests | test Disposition fails if any retest sample fails | 57 | Success |
| 67 | LAB_TensileRequirements_Tests | test Disposition returns P when all samples pass | 65 | Success |
| 68 | LAB_TensileRequirements_Tests | test Disposition returns U when any sample fails | 69 | Success |
| 69 | LAB_TensileRequirements_Tests | test Disposition returns U when one of multiple samples fails | 102 | Success |
| 70 | LAB_TensileRequirements_Tests | test Disposition uses corrected grade after grade correction | 70 | Success |
| 71 | LAB_TensileRequirements_Tests | test Disposition uses latest run only - retest supersedes | 69 | Success |
| 72 | LAB_TensileRequirements_Tests | test Disposition uses version effective at report time | 61 | Success |
| 73 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements creates new version | 101 | Success |
| 74 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements throws error when EffectiveDate is NULL | 28 | Success |
| 75 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements throws error when Rev is NULL | 45 | Success |
| 76 | LAB_TensileRequirements_Tests | test UpsertTensileRequirements throws error when Rows is invalid JSON | 44 | Success |
| 77 | LAB_TensileRequirements_Tests | test YieldPassed returns 0 when value above max | 57 | Success |
| 78 | LAB_TensileRequirements_Tests | test YieldPassed returns 0 when value below min | 61 | Success |
| 79 | LAB_TensileRequirements_Tests | test YieldPassed returns 1 when value in range | 49 | Success |
| 80 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass deletes non-last record | 98 | Success |
| 81 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails for last record | 56 | Success |
| 82 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails when already deleted | 48 | Success |
| 83 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails with non-existent id | 66 | Success |
| 84 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails without id | 61 | Success |
| 85 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass removes PassCampaign | 143 | Success |
| 86 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts first record StartedAt | 122 | Success |
| 87 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts only f<...>tedAt to InstalledAt and last EndedAt to UninstalledAt when window changes | 101 | Success |
| 88 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts only first StartedAt to InstalledAt when window shifts keeping same duration | 118 | Success |
| 89 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes chains EndedAt for multiple records | 126 | Success |
| 90 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes does not scale single pass | 77 | Success |
| 91 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes does not scale when window unchanged | 102 | Success |
| 92 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails with non-existent CarrierInstance | 45 | Success |
| 93 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails without CarrierInstanceId | 57 | Success |
| 94 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails without EdgerRollPartId | 44 | Success |
| 95 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes recalculates only the specified EdgerRoll leaving other rolls unchanged | 179 | Success |
| 96 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes returns 0 when no records | 45 | Success |
| 97 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes scales passes proportionally when window expands | 110 | Success |
| 98 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes sets EndedAt to UninstalledAt for single record | 78 | Success |
| 99 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes sets NULL EndedAt when not uninstalled | 134 | Success |
| 100 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass creates first record with InstalledAt | 126 | Success |
| 101 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass creates with explicit StartedAt | 122 | Success |
| 102 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails changing to same active pass | 69 | Success |
| 103 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails when EdgerRoll not in Rollset | 109 | Success |
| 104 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with non-existent CarrierInstance | 48 | Success |
| 105 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with non-existent pass | 81 | Success |
| 106 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with StartedAt after UninstalledAt | 82 | Success |
| 107 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with StartedAt before InstalledAt | 118 | Success |
| 108 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails without CarrierInstanceId | 106 | Success |
| 109 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails without EdgerRollPartId | 45 | Success |
| 110 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass replaces record with same StartedAt | 106 | Success |
| 111 | M2_CarrierProtection_Tests | test DeleteArbor deactivates UniversalRoll Part | 144 | Success |
| 112 | M2_CarrierProtection_Tests | test DeleteArbor fails when carrier status is U | 130 | Success |
| 113 | M2_CarrierProtection_Tests | test DeleteArbor in rollset deactivates UR and rollset | 138 | Success |
| 114 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when arbor not in any universal roll | 325 | Success |
| 115 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when carrier status is X | 121 | Success |
| 116 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when rollset has no carrier | 127 | Success |
| 117 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when universal roll not in rollset | 159 | Success |
| 118 | M2_CarrierProtection_Tests | test DeleteDonut fails when carrier status is C | 130 | Success |
| 119 | M2_CarrierProtection_Tests | test DeleteDonut fails when carrier status is S | 122 | Success |
| 120 | M2_CarrierProtection_Tests | test DeleteDonut in rollset updates UR and deactivates rollset | 143 | Success |
| 121 | M2_CarrierProtection_Tests | test DeleteDonut keeps UniversalRoll active | 162 | Success |
| 122 | M2_CarrierProtection_Tests | test DeleteDonut multiple donuts succeeds when none in active carrier | 138 | Success |
| 123 | M2_CarrierProtection_Tests | test DeleteDonut sets UniversalRoll DonutPartId to NULL | 146 | Success |
| 124 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when carrier status is F | 106 | Success |
| 125 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when donut not in any universal roll | 232 | Success |
| 126 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when rollset has no carrier | 126 | Success |
| 127 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when universal roll not in rollset | 142 | Success |
| 128 | M2_CarrierProtection_Tests | test DeleteRoll deactivates rollset when carrier status is E | 138 | Success |
| 129 | M2_CarrierProtection_Tests | test DeleteRoll deactivates rollset when no carrier instance | 114 | Success |
| 130 | M2_CarrierProtection_Tests | test DeleteRoll edger deactivates rollset when carrier status is F | 93 | Success |
| 131 | M2_CarrierProtection_Tests | test DeleteRoll edger deactivates rollset when no carrier | 163 | Success |
| 132 | M2_CarrierProtection_Tests | test DeleteRoll edger fails when carrier status is A | 134 | Success |
| 133 | M2_CarrierProtection_Tests | test DeleteRoll edger fails when carrier status is I | 106 | Success |
| 134 | M2_CarrierProtection_Tests | test DeleteRoll edger succeeds when not in any rollset | 204 | Success |
| 135 | M2_CarrierProtection_Tests | test DeleteRoll error message contains carrier name | 93 | Success |
| 136 | M2_CarrierProtection_Tests | test DeleteRoll error message contains CarrierInstanceId | 110 | Success |
| 137 | M2_CarrierProtection_Tests | test DeleteRoll error message contains roll name | 167 | Success |
| 138 | M2_CarrierProtection_Tests | test DeleteRoll fails when carrier status is A | 98 | Success |
| 139 | M2_CarrierProtection_Tests | test DeleteRoll fails when carrier status is I | 122 | Success |
| 140 | M2_CarrierProtection_Tests | test DeleteRoll multiple rolls fails if any in active carrier | 150 | Success |
| 141 | M2_CarrierProtection_Tests | test DeleteRoll roll stays active when blocked | 94 | Success |
| 142 | M2_CarrierProtection_Tests | test DeleteRoll succeeds when roll not in any rollset | 126 | Success |
| 143 | M2_CarrierProtection_Tests | test UpsertRollset change rolls fails when in active carrier | 450 | Success |
| 144 | M2_CarrierProtection_Tests | test UpsertRollset deactivate fails when in active carrier | 138 | Success |
| 145 | M2_CarrierProtection_Tests | test UpsertRollset implicit deactivation fails when other in active carrier | 122 | Success |
| 146 | M2_CarrierProtection_Tests | test UpsertRollset implicit deactivation succeeds when no carrier | 306 | Success |
| 147 | M2_CarrierProtection_Tests | test UpsertRollset use roll from active carrier fails | 106 | Success |
| 148 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor fails when in active carrier | 109 | Success |
| 149 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor succeeds when carrier status E | 232 | Success |
| 150 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor succeeds when no rollset | 249 | Success |
| 151 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut fails when in active carrier | 105 | Success |
| 152 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut in rollset deactivates rollset | 264 | Success |
| 153 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut succeeds when carrier status F | 240 | Success |
| 154 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut succeeds when no rollset | 232 | Success |
| 155 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove arbor fails when in active carrier | 151 | Success |
| 156 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove arbor succeeds when no rollset | 474 | Success |
| 157 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove donut fails when in active carrier | 147 | Success |
| 158 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove donut succeeds when no rollset | 273 | Success |
| 159 | M2_DeleteEvent_Tests | test Delete: matched delete leaves no Production overlap | 61 | Success |
| 160 | M2_DeleteEvent_Tests | test Delete: matched Production event keeps its End | 37 | Success |
| 161 | M2_DeleteEvent_Tests | test Delete: unmatched Production event is recomputed | 53 | Success |
| 162 | M2_DeleteEvent_Tests | test Draft: matched Production event keeps its End | 45 | Success |
| 163 | M2_DetectRollsetDisruption_Tests | test Broken rollset alert includes roll names | 122 | Success |
| 164 | M2_DetectRollsetDisruption_Tests | test Broken rollset alert uses past tense | 127 | Success |
| 165 | M2_DetectRollsetDisruption_Tests | test Default diameter tolerance is zero | 69 | Success |
| 166 | M2_DetectRollsetDisruption_Tests | test Diameter mismatch alert created when exceeds tolerance | 78 | Success |
| 167 | M2_DetectRollsetDisruption_Tests | test Diameter mismatch alert has no mm unit | 115 | Success |
| 168 | M2_DetectRollsetDisruption_Tests | test Diameter tolerance from catSettings | 97 | Success |
| 169 | M2_DetectRollsetDisruption_Tests | test Disruption created when affected rollsets exist | 94 | Success |
| 170 | M2_DetectRollsetDisruption_Tests | test Handles missing diameter data gracefully | 82 | Success |
| 171 | M2_DetectRollsetDisruption_Tests | test Multiple affected rollsets create multiple alerts | 126 | Success |
| 172 | M2_DetectRollsetDisruption_Tests | test Multiple alert types created in single disruption | 179 | Success |
| 173 | M2_DetectRollsetDisruption_Tests | test No diameter alert when within tolerance | 147 | Success |
| 174 | M2_DetectRollsetDisruption_Tests | test No disruption created when no conflicts exist | 106 | Success |
| 175 | M2_DetectRollsetDisruption_Tests | test No orphans stored for Swap action | 98 | Success |
| 176 | M2_DetectRollsetDisruption_Tests | test No position swap alert for Any position roll | 77 | Success |
| 177 | M2_DetectRollsetDisruption_Tests | test No position swap alert when position matches | 77 | Success |
| 178 | M2_DetectRollsetDisruption_Tests | test Orphaned rolls identified when breaking rollset | 102 | Success |
| 179 | M2_DetectRollsetDisruption_Tests | test Orphans linked to correct RollsetBrokenAlert | 110 | Success |
| 180 | M2_DetectRollsetDisruption_Tests | test Orphans stored for Create action | 94 | Success |
| 181 | M2_DetectRollsetDisruption_Tests | test Orphans stored for Mix action | 175 | Success |
| 182 | M2_DetectRollsetDisruption_Tests | test Position swap alert created for Bottom to Top | 81 | Success |
| 183 | M2_DetectRollsetDisruption_Tests | test Position swap alert created for Top to Bottom | 200 | Success |
| 184 | M2_DetectRollsetDisruption_Tests | test Position swap alert uses past tense | 122 | Success |
| 185 | M2_DetectRollsetDisruption_Tests | test PrevRollsetId adds rollset to affected list | 126 | Success |
| 186 | M2_DetectRollsetDisruption_Tests | test PrevRollsetId creates orphans from previous rollset | 102 | Success |
| 187 | M2_DetectRollsetDisruption_Tests | test RollsetBrokenAlerts populated for affected rollsets | 98 | Success |
| 188 | M2_DetectRollsetDisruption_Tests | test RollshopAlert always created even without alerts | 74 | Success |
| 189 | M2_DetectRollsetDisruption_Tests | test RollshopAlert default StatusCode is P | 150 | Success |
| 190 | M2_DetectRollsetDisruption_Tests | test RollshopAlert has CreatedBy populated | 85 | Success |
| 191 | M2_DisruptionTracking_Tests | test AcknowledgeNotification: Error when already acknowledged | 102 | Success |
| 192 | M2_DisruptionTracking_Tests | test AcknowledgeNotification: Status changes from P to A | 102 | Success |
| 193 | M2_DisruptionTracking_Tests | test Detection: Diameter mismatch alert created when difference exceeds tolerance | 171 | Success |
| 194 | M2_DisruptionTracking_Tests | test Detection: Multiple affected rollsets identified | 298 | Success |
| 195 | M2_DisruptionTracking_Tests | test Detection: Multiple orphaned rolls identified | 290 | Success |
| 196 | M2_DisruptionTracking_Tests | test Detection: No diameter alert when within tolerance | 204 | Success |
| 197 | M2_DisruptionTracking_Tests | test Detection: Position swap alert created for Bottom to Top | 287 | Success |
| 198 | M2_DisruptionTracking_Tests | test Detection: Position swap alert created for Top to Bottom | 248 | Success |
| 199 | M2_DisruptionTracking_Tests | test Detection: Single affected rollset identified | 224 | Success |
| 200 | M2_DisruptionTracking_Tests | test Detection: Single orphaned roll identified | 272 | Success |
| 201 | M2_DisruptionTracking_Tests | test ErrorHandling: Rollset created even if detection fails | 299 | Success |
| 202 | M2_DisruptionTracking_Tests | test Integration: Multiple alert types in one disruption | 266 | Success |
| 203 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode C recorded correctly | 256 | Success |
| 204 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode M recorded correctly | 400 | Success |
| 205 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode S recorded correctly | 444 | Success |
| 206 | M2_DisruptionTracking_Tests | test UpsertRollset: Default ActionTypeCode is C | 212 | Success |
| 207 | M2_DraftEvents_Tests | test ConfirmEvents: Deletes Main events not in active Draft | 86 | Success |
| 208 | M2_DraftEvents_Tests | test ConfirmEvents: Error when ConfirmUntilEventId not found | 52 | Success |
| 209 | M2_DraftEvents_Tests | test ConfirmEvents: Inserts new Draft events to Main | 85 | Success |
| 210 | M2_DraftEvents_Tests | test ConfirmEvents: Partial confirmation with ConfirmUntilEventId | 118 | Success |
| 211 | M2_DraftEvents_Tests | test ConfirmEvents: Publishes Draft to Main | 82 | Success |
| 212 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Deletes from both tables | 60 | Success |
| 213 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Error when not found in Draft | 32 | Success |
| 214 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Error when not found in Main | 99 | Success |
| 215 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: IsMatched in Draft prevents deletion | 82 | Success |
| 216 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: IsMatched in Main prevents deletion | 49 | Success |
| 217 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Default: Defaults to Main | 61 | Success |
| 218 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Dilated event handling in Draft | 65 | Success |
| 219 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Error when not found in Draft | 36 | Success |
| 220 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: IsMatched prevents deletion | 102 | Success |
| 221 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Only deletes from Draft table | 90 | Success |
| 222 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Invalid: Throws error for invalid mode | 73 | Success |
| 223 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Dilated event handling | 101 | Success |
| 224 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Error when not found in Main | 37 | Success |
| 225 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: IsMatched prevents deletion | 65 | Success |
| 226 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Only deletes from Main table | 53 | Success |
| 227 | M2_DraftEvents_Tests | test DeleteEvent: Both mode syncs delete to Draft | 106 | Success |
| 228 | M2_DraftEvents_Tests | test DeleteEvent: Draft mode does not affect Main | 429 | Success |
| 229 | M2_DraftEvents_Tests | test DeleteEvent: Error when EventId not found in Draft | 36 | Success |
| 230 | M2_DraftEvents_Tests | test DeleteEvent: Error when EventId not found in Main | 89 | Success |
| 231 | M2_DraftEvents_Tests | test DeleteEvent: Error when IsMatched = 1 in Draft mode | 45 | Success |
| 232 | M2_DraftEvents_Tests | test DeleteEvent: Error when IsMatched = 1 | 61 | Success |
| 233 | M2_DraftEvents_Tests | test Edge: ConfirmEvents when already in sync | 172 | Success |
| 234 | M2_DraftEvents_Tests | test Edge: Multiple Production events sync correctly | 126 | Success |
| 235 | M2_DraftEvents_Tests | test Edge: ResetDraft with empty Main clears Draft | 65 | Success |
| 236 | M2_DraftEvents_Tests | test Isolation: Draft and Main can differ | 82 | Success |
| 237 | M2_DraftEvents_Tests | test Isolation: Draft changes do not affect Main | 61 | Success |
| 238 | M2_DraftEvents_Tests | test MergeToDraft: All production fields sync correctly | 146 | Success |
| 239 | M2_DraftEvents_Tests | test MergeToDraft: DELETE soft-deletes in Draft | 90 | Success |
| 240 | M2_DraftEvents_Tests | test MergeToDraft: Error when EventId not found | 37 | Success |
| 241 | M2_DraftEvents_Tests | test MergeToDraft: Fixed event copies Start/End exactly | 77 | Success |
| 242 | M2_DraftEvents_Tests | test MergeToDraft: New Fixed event creates in Draft with cascade | 57 | Success |
| 243 | M2_DraftEvents_Tests | test MergeToDraft: Reactivates inactive Draft event on Main update | 159 | Success |
| 244 | M2_DraftEvents_Tests | test ResetDraft: Deletes Draft-only events | 69 | Success |
| 245 | M2_DraftEvents_Tests | test ResetDraft: Inserts Main-only events to Draft | 69 | Success |
| 246 | M2_DraftEvents_Tests | test ResetDraft: Restores Draft from Main | 147 | Success |
| 247 | M2_DraftEvents_Tests | test Sync Scenario: Different ScheduledRollingHours in Main and Draft | 105 | Success |
| 248 | M2_DraftEvents_Tests | test Sync Scenario: Different Start times preserved until confirmed | 78 | Success |
| 249 | M2_DraftEvents_Tests | test Sync Scenario: Different StatusCode in Main and Draft | 326 | Success |
| 250 | M2_DraftEvents_Tests | test Sync Scenario: Event active in Main but inactive in Draft | 113 | Success |
| 251 | M2_DraftEvents_Tests | test Sync Scenario: Event exists only in Draft | 118 | Success |
| 252 | M2_DraftEvents_Tests | test Sync Scenario: Event exists only in Main | 73 | Success |
| 253 | M2_DraftEvents_Tests | test Sync Scenario: IsMatched in Main but not in Draft | 65 | Success |
| 254 | M2_DraftEvents_Tests | test Sync Scenario: MergeToDraft preserves Draft Start | 94 | Success |
| 255 | M2_DraftEvents_Tests | test SyncCampaigns: Creates event in both Main and Draft | 167 | Success |
| 256 | M2_DraftEvents_Tests | test SyncDelete: Delete Both then resync recreates both | 200 | Success |
| 257 | M2_DraftEvents_Tests | test SyncDelete: Delete Draft preserves Main state | 126 | Success |
| 258 | M2_DraftEvents_Tests | test SyncDelete: Delete Draft then resync restores Draft via MergeToDraft | 404 | Success |
| 259 | M2_DraftEvents_Tests | test SyncDelete: Delete Main preserves Draft state independently | 142 | Success |
| 260 | M2_DraftEvents_Tests | test SyncDelete: Delete Main then resync recreates Main | 171 | Success |
| 261 | M2_DraftEvents_Tests | test SyncDelete: IsMatched prevents delete in all modes | 200 | Success |
| 262 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Downtime in Draft | 65 | Success |
| 263 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Holiday only in Draft | 89 | Success |
| 264 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Maintenance in Draft | 86 | Success |
| 265 | M2_DraftEvents_Tests | test UpsertDraftEvent: Error when Start is NULL | 33 | Success |
| 266 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: Error when SectionId missing | 89 | Success |
| 267 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: IsMatched allows non-date changes | 61 | Success |
| 268 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: IsMatched prevents date changes | 89 | Success |
| 269 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: New event only in Draft not Main | 139 | Success |
| 270 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: Update only affects Draft not Main | 184 | Success |
| 271 | M2_DraftEvents_Tests | test UpsertProductionEvent: Anchor logic positions Draft event correctly | 237 | Success |
| 272 | M2_DraftEvents_Tests | test UpsertProductionEvent: IsMatched syncs to Draft | 212 | Success |
| 273 | M2_DraftEvents_Tests | test UpsertProductionEvent: New event creates in both Main and Draft | 167 | Success |
| 274 | M2_DraftEvents_Tests | test UpsertProductionEvent: No anchor uses Main Start for Draft | 126 | Success |
| 275 | M2_DraftEvents_Tests | test UpsertProductionEvent: ScheduledRollingHours change recalculates Draft End | 236 | Success |
| 276 | M2_DraftEvents_Tests | test UpsertProductionEvent: Update syncs fields to Draft but not Start | 273 | Success |
| 277 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds first pass with defaults | 33 | Success |
| 278 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds pass as not diagonal by default | 37 | Success |
| 279 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds sequential passes up to 4 | 37 | Success |
| 280 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass clears the diagonal on all the passes | 36 | Success |
| 281 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with inactive PartId | 25 | Success |
| 282 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with invalid PassNumber | 29 | Success |
| 283 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with invalid PassStatusCode | 21 | Success |
| 284 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with non-EdgerRoll Part | 77 | Success |
| 285 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with non-existent PartId | 53 | Success |
| 286 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass keeps IsDiagonal when not provided | 49 | Success |
| 287 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass marks all the passes as diagonal | 32 | Success |
| 288 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass returns PassNumber on update | 28 | Success |
| 289 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates IsDiagonal on a single pass | 41 | Success |
| 290 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates status to Damaged | 33 | Success |
| 291 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates status to Used | 32 | Success |
| 292 | M2_EventErrorHandling_Tests | test Cascade: Max cascade iterations throws descriptive error | 49 | Success |
| 293 | M2_EventErrorHandling_Tests | test Cascade: Max Fixed resolution iterations throws descriptive error | 36 | Success |
| 294 | M2_EventErrorHandling_Tests | test Compaction: Max iterations throws descriptive error | 78 | Success |
| 295 | M2_EventErrorHandling_Tests | test Defaults: PreProcessEvent uses fallback limit | 29 | Success |
| 296 | M2_EventErrorHandling_Tests | test ErrorMessage: Clean extraction removes technical context | 21 | Success |
| 297 | M2_EventErrorHandling_Tests | test PreProcess: Error message contains context information | 29 | Success |
| 298 | M2_EventErrorHandling_Tests | test PreProcess: Max iterations reached throws descriptive error | 36 | Success |
| 299 | M2_EventErrorHandling_Tests | test Transaction: UpsertEvent rollback on PreProcess error | 134 | Success |
| 300 | M2_EventErrorHandling_Tests | test Transaction: UpsertProductionEvent rollback on validation error | 24 | Success |
| 301 | M2_EventIntegration_Tests | test Cascade: Long chain with intercalated Fixed | 229 | Success |
| 302 | M2_EventIntegration_Tests | test Cascade: Stress test 10 consecutive events | 257 | Success |
| 303 | M2_EventIntegration_Tests | test Compact: Blocked by Fixed event | 250 | Success |
| 304 | M2_EventIntegration_Tests | test Compact: Complete gap closure | 270 | Success |
| 305 | M2_EventIntegration_Tests | test Compact: Preserves dilation downstream | 234 | Success |
| 306 | M2_EventIntegration_Tests | test Complex: BaseDuration preserved through complete cycle | 236 | Success |
| 307 | M2_EventIntegration_Tests | test Complex: Complete production schedule with Fixed events | 273 | Success |
| 308 | M2_EventIntegration_Tests | test Complex: Update triggers cascade and compaction | 229 | Success |
| 309 | M2_EventIntegration_Tests | test Create: Production with minimal fields | 159 | Success |
| 310 | M2_EventIntegration_Tests | test EdgeCase: Production spans midnight | 139 | Success |
| 311 | M2_EventIntegration_Tests | test EdgeCase: Very long BaseDuration 24h | 134 | Success |
| 312 | M2_EventIntegration_Tests | test EdgeCase: Very short BaseDuration 5min | 163 | Success |
| 313 | M2_EventIntegration_Tests | test Insert: Fixed between Productions cascades | 204 | Success |
| 314 | M2_EventIntegration_Tests | test PreProcess: Multiple consecutive Fixed events MOVE | 184 | Success |
| 315 | M2_EventIntegration_Tests | test PreProcess: Overlapping Fixed events smart dilation | 195 | Success |
| 316 | M2_EventIntegration_Tests | test PreProcess: Production vs Production MOVE | 208 | Success |
| 317 | M2_EventIntegration_Tests | test STEP4: Shrinking Fixed readjusts dilated Production | 310 | Success |
| 318 | M2_EventIntegration_Tests | test Update: Change Production SectionId | 192 | Success |
| 319 | M2_EventIntegration_Tests | test Update: Moving Fixed triggers cascade | 245 | Success |
| 320 | M2_EventIntegration_Tests | test Update: Multiple modifications preserve BaseDuration | 254 | Success |
| 321 | M2_EventIntegration_Tests | test Update: Multiple Production fields batch | 294 | Success |
| 322 | M2_EventIntegration_Tests | test Update: Start moves into collision zone | 250 | Success |
| 323 | M2_EventIntegration_Tests | test UpsertEvent: Create compatible Downtime and Maintenance | 188 | Success |
| 324 | M2_EventIntegration_Tests | test UpsertEvent: Update Fixed event adjusts affected Production | 257 | Success |
| 325 | M2_EventIntegration_Tests | test UpsertProductionEvent: Auto-moves after Holiday | 163 | Success |
| 326 | M2_EventIntegration_Tests | test UpsertProductionEvent: Create with all fields populated | 221 | Success |
| 327 | M2_EventIntegration_Tests | test UpsertProductionEvent: Dilates around Downtime | 257 | Success |
| 328 | M2_EventIntegration_Tests | test UpsertProductionEvent: Update preserves BaseDuration | 200 | Success |
| 329 | M2_EventIntegration_Tests | test Validation: Downtime vs Downtime overlap is allowed | 172 | Success |
| 330 | M2_EventIntegration_Tests | test Validation: Downtime vs Holiday overlap is allowed | 94 | Success |
| 331 | M2_EventIntegration_Tests | test Validation: End before Start throws error | 57 | Success |
| 332 | M2_EventIntegration_Tests | test Validation: Holiday vs Holiday overlap is allowed | 142 | Success |
| 333 | M2_EventIntegration_Tests | test Validation: Invalid EventTypeCode error | 32 | Success |
| 334 | M2_EventIntegration_Tests | test Validation: Invalid SectionId throws error | 74 | Success |
| 335 | M2_EventIntegration_Tests | test Workflow: StatusCode P to I to C progression | 258 | Success |
| 336 | M2_GetCampaignsByEventId_Tests | test RECONCILE #2258: apportioned detail sums to month and campaign totals | 143 | Success |
| 337 | M2_GetCampaignsByEventId_Tests | test RECONCILE #2258: cobbles excluded from length shares but totals reconcile | 69 | Success |
| 338 | M2_GetProductionMonth_Tests | test ASSET ISOLATION: Mill #1 shifts are ignored by M2 | 8 | Success |
| 339 | M2_GetProductionMonth_Tests | test FALLBACK: scalar falls back to calendar month when no shift | 8 | Success |
| 340 | M2_GetProductionMonth_Tests | test HALF-OPEN: boundary instant belongs to the next shift | 13 | Success |
| 341 | M2_GetProductionMonth_Tests | test ITVF: returns no row when no shift covers the instant | 8 | Success |
| 342 | M2_GetProductionMonth_Tests | test SHIFT-ALIGNED: Feb-calendar instant in a Jan-ProductionDate shift returns January | 8 | Success |
| 343 | M2_GetProductionMonth_Tests | test SHIFT-ALIGNED: Jan-calendar instant in a Feb-ProductionDate shift returns February | 8 | Success |
| 344 | M2_NonProductiveOverlap_Tests | test Dilation: Production dilates by the union of D M H | 20 | Success |
| 345 | M2_NonProductiveOverlap_Tests | test Merge: chained events collapse into one island | 16 | Success |
| 346 | M2_NonProductiveOverlap_Tests | test Merge: contained event adds no extra time | 45 | Success |
| 347 | M2_NonProductiveOverlap_Tests | test Merge: disjoint events are summed | 17 | Success |
| 348 | M2_NonProductiveOverlap_Tests | test Merge: inactive events are ignored | 16 | Success |
| 349 | M2_NonProductiveOverlap_Tests | test Merge: intervals are clipped to the window | 16 | Success |
| 350 | M2_NonProductiveOverlap_Tests | test Merge: partial overlap counts the union once | 17 | Success |
| 351 | M2_NonProductiveOverlap_Tests | test Merge: Production events are excluded | 12 | Success |
| 352 | M2_NonProductiveOverlap_Tests | test Merge: two overlapping Holidays count once | 20 | Success |
| 353 | M2_NonProductiveOverlap_Tests | test ScheduledEnd: stretches by the union of D M H | 16 | Success |
| 354 | M2_PassCampaigns_Tests | test GetPassCampaignData fails with invalid time range | 110 | Success |
| 355 | M2_PassCampaigns_Tests | test GetPassCampaignData fails without EdgerRollPartId | 61 | Success |
| 356 | M2_PassCampaigns_Tests | test GetPassCampaignData filters by PassNumber | 122 | Success |
| 357 | M2_PassCampaigns_Tests | test GetPassCampaignData returns calculated totals | 98 | Success |
| 358 | M2_PassCampaigns_Tests | test GetPassCampaignData returns data for EdgerRoll | 110 | Success |
| 359 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails with deleted pass | 118 | Success |
| 360 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails with non-existent id | 154 | Success |
| 361 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails without any offset | 65 | Success |
| 362 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails without id | 85 | Success |
| 363 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets returns correct id | 163 | Success |
| 364 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates multiple offsets | 192 | Success |
| 365 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetBillets | 118 | Success |
| 366 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetLength | 118 | Success |
| 367 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetWeight | 175 | Success |
| 368 | M2_ResolveEventCollisions_Tests | test Cascade: Five event cascade chain | 53 | Success |
| 369 | M2_ResolveEventCollisions_Tests | test Cascade: Last event collides with Fixed | 41 | Success |
| 370 | M2_ResolveEventCollisions_Tests | test Cascade: Middle event already dilated | 65 | Success |
| 371 | M2_ResolveEventCollisions_Tests | test Cascade: Moving Production pushes subsequent Production events | 53 | Success |
| 372 | M2_ResolveEventCollisions_Tests | test Cascade: Production cascade blocked by Fixed wall | 37 | Success |
| 373 | M2_ResolveEventCollisions_Tests | test Cascade: Production pushes another Production around Fixed event | 85 | Success |
| 374 | M2_ResolveEventCollisions_Tests | test Cascade: Productions with large gaps between them | 93 | Success |
| 375 | M2_ResolveEventCollisions_Tests | test Complex: Production DILATE then CASCADE another dilated Production | 49 | Success |
| 376 | M2_ResolveEventCollisions_Tests | test Complex: Production DILATE through overlapping Downtime and Maintenance | 33 | Success |
| 377 | M2_ResolveEventCollisions_Tests | test Edge: Event with minimum duration one minute | 25 | Success |
| 378 | M2_ResolveEventCollisions_Tests | test Edge: Event with very long duration spans days | 21 | Success |
| 379 | M2_ResolveEventCollisions_Tests | test Edge: Multiple events same start different durations | 29 | Success |
| 380 | M2_ResolveEventCollisions_Tests | test Edge: Production ending exactly at Fixed start has no collision | 33 | Success |
| 381 | M2_ResolveEventCollisions_Tests | test Edge: Production one second after Fixed has no collision | 21 | Success |
| 382 | M2_ResolveEventCollisions_Tests | test Edge: Production one second before Fixed has no collision | 17 | Success |
| 383 | M2_ResolveEventCollisions_Tests | test Edge: Production with no collisions remains unchanged | 25 | Success |
| 384 | M2_ResolveEventCollisions_Tests | test Fixed: every D M H overlap combination is allowed | 20 | Success |
| 385 | M2_ResolveEventCollisions_Tests | test O1: Multiple Other events can overlap | 24 | Success |
| 386 | M2_ResolveEventCollisions_Tests | test O1: Other does not collide with Holiday | 17 | Success |
| 387 | M2_ResolveEventCollisions_Tests | test O1: Other does not collide with Production | 41 | Success |
| 388 | M2_ResolveEventCollisions_Tests | test O1: Production not affected by Other event | 17 | Success |
| 389 | M2_ResolveEventCollisions_Tests | test P1: Multiple Productions overlapping simultaneously | 40 | Success |
| 390 | M2_ResolveEventCollisions_Tests | test P1: Production completely contained moves after | 32 | Success |
| 391 | M2_ResolveEventCollisions_Tests | test P1: Production containing existing moves after | 20 | Success |
| 392 | M2_ResolveEventCollisions_Tests | test P1: Production moves after existing Production when S < NS | 98 | Success |
| 393 | M2_ResolveEventCollisions_Tests | test P1: Production with same start time moves after existing | 24 | Success |
| 394 | M2_ResolveEventCollisions_Tests | test P2: Production completely inside Fixed MOVES after | 89 | Success |
| 395 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE around Fixed when NS < S | 86 | Success |
| 396 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through contiguous Fixed events | 20 | Success |
| 397 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through Fixed events with variable gaps | 28 | Success |
| 398 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through four consecutive Fixed events | 29 | Success |
| 399 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through mixed Fixed event types | 16 | Success |
| 400 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through multiple Holidays | 24 | Success |
| 401 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through overlapping Fixed events without double counting | 20 | Success |
| 402 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through three Fixed events with gaps | 24 | Success |
| 403 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE with Fixed ending at exact original P_End | 28 | Success |
| 404 | M2_ResolveEventCollisions_Tests | test P2: Production MOVE after Fixed when S <= NS | 33 | Success |
| 405 | M2_ResolveEventCollisions_Tests | test P2: Production MOVE then DILATE in sequence | 20 | Success |
| 406 | M2_ResolveEventCollisions_Tests | test P2: Production starting at Fixed end has no collision | 24 | Success |
| 407 | M2_ResolveEventCollisions_Tests | test P2: Production with Fixed starting at exact P_Start MOVES | 20 | Success |
| 408 | M2_ResolveEventCollisions_Tests | test P2: Short Production DILATE through long Fixed event | 25 | Success |
| 409 | M2_ResolveEventCollisions_Tests | test Stress: High density Fixed events 12 in 2 hours | 25 | Success |
| 410 | M2_ResolveEventCollisions_Tests | test Stress: Multi-day Production through multiple Fixed events | 41 | Success |
| 411 | M2_ResolveEventCollisions_Tests | test Update: Event excludes itself from collision detection | 37 | Success |
| 412 | M2_ResolveEventCollisions_Tests | test Update: Event in middle of dilated chain | 36 | Success |
| 413 | M2_ResolveEventCollisions_Tests | test Update: Fixed event moved away from collision | 77 | Success |
| 414 | M2_ResolveEventCollisions_Tests | test Update: Production BaseDuration increased significantly | 25 | Success |
| 415 | M2_ResolveEventCollisions_Tests | test Update: Production BaseDuration reduced significantly | 29 | Success |
| 416 | M2_ScheduleCompaction_Tests | test Basic: 2-event compaction moves P2 backward | 33 | Success |
| 417 | M2_ScheduleCompaction_Tests | test Basic: 3-event compaction cascades through all events | 94 | Success |
| 418 | M2_ScheduleCompaction_Tests | test Basic: Partial gap elimination completes gracefully | 44 | Success |
| 419 | M2_ScheduleCompaction_Tests | test Edge: Final event encounters Fixed during compaction | 62 | Success |
| 420 | M2_ScheduleCompaction_Tests | test Edge: Gap fully eliminated creates contiguous events | 57 | Success |
| 421 | M2_ScheduleCompaction_Tests | test Edge: No compaction when event not shortened | 33 | Success |
| 422 | M2_ScheduleCompaction_Tests | test Edge: No subsequent events completes immediately | 70 | Success |
| 423 | M2_ScheduleCompaction_Tests | test Fixed: Compaction DILATE around Fixed event | 69 | Success |
| 424 | M2_ScheduleCompaction_Tests | test Fixed: Compaction MOVE after Fixed event | 106 | Success |
| 425 | M2_ScheduleCompaction_Tests | test Fixed: Compaction MOVE then DILATE sequence | 57 | Success |
| 426 | M2_ScheduleCompaction_Tests | test Fixed: Compaction stops when Fixed blocks entire remaining gap | 139 | Success |
| 427 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through mixed Fixed event types | 53 | Success |
| 428 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through multiple consecutive Fixed events | 40 | Success |
| 429 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through overlapping Fixed events without double counting | 152 | Success |
| 430 | M2_ScheduleCompaction_Tests | test Fixed: Fixed event at exact gap boundary causes MOVE | 37 | Success |
| 431 | M2_ScheduleCompaction_Tests | test Gap: Middle event shortening compacts subsequent events | 69 | Success |
| 432 | M2_ScheduleCompaction_Tests | test Gap: Variable gaps between events compact correctly | 102 | Success |
| 433 | M2_ScheduleCompaction_Tests | test Gap: Very large gap 5 hours compacts correctly | 61 | Success |
| 434 | M2_ScheduleCompaction_Tests | test Gap: Very small gap 3 minutes compacts correctly | 37 | Success |
| 435 | M2_ScheduleCompaction_Tests | test Integration: CompactSchedule disabled skips compaction | 69 | Success |
| 436 | M2_ScheduleCompaction_Tests | test Integration: UpsertEvent skips compaction with blocking events | 61 | Success |
| 437 | M2_ScheduleCompaction_Tests | test Integration: UpsertEvent triggers compaction on shortening | 61 | Success |
| 438 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId1 is required | 49 | Success |
| 439 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId2 does not exist in Rolls table | 53 | Success |
| 440 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId2 required when RollsetId2 provided | 53 | Success |
| 441 | M2_SwapRollsetsRolls_Tests | test Error: Cannot swap rollsets in different sections | 61 | Success |
| 442 | M2_SwapRollsetsRolls_Tests | test Error: Cannot swap rollsets in different stands | 93 | Success |
| 443 | M2_SwapRollsetsRolls_Tests | test Error: Rollset1 must have both rolls assigned | 53 | Success |
| 444 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 and RollsetId2 must be different | 45 | Success |
| 445 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 does not exist | 53 | Success |
| 446 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 is required | 93 | Success |
| 447 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId2 does not exist | 53 | Success |
| 448 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId1 does not exist in Rolls table | 48 | Success |
| 449 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId1 is required | 65 | Success |
| 450 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId2 required when RollsetId2 provided | 53 | Success |
| 451 | M2_SwapRollsetsRolls_Tests | test Success: Create new rollset with specified rolls | 299 | Success |
| 452 | M2_SwapRollsetsRolls_Tests | test Success: Swap rolls between two rollsets | 175 | Success |
| 453 | M2_SwapRollsetsRolls_Tests | test Success: Use any valid rolls | 159 | Success |
| 454 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Chain stops at matched barrier | 151 | Success |
| 455 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Matched events are immovable barriers | 155 | Success |
| 456 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Updating IsMatched prevents future cascade | 118 | Success |
| 457 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: Multiple section changes create multiple events | 176 | Success |
| 458 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: ResolveEventCascade called for each group | 127 | Success |
| 459 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: StatusCode K preserved when updating | 89 | Success |
| 460 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: Date filters work correctly | 184 | Success |
| 461 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: Empty campaigns table produces no events | 69 | Success |
| 462 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: No campaigns returns gracefully | 61 | Success |
| 463 | M2_SyncCampaignsToProductionEvents_Tests | test FIXED: Dilates unmatched but not matched | 130 | Success |
| 464 | M2_SyncCampaignsToProductionEvents_Tests | test FIXED: Does not dilate matched events | 93 | Success |
| 465 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Consecutive campaigns same section create single event | 122 | Success |
| 466 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Section change creates separate events | 224 | Success |
| 467 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Single campaign creates single event | 110 | Success |
| 468 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Last group updates status P to I when matched | 102 | Success |
| 469 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Matched event updated with IsMatched = 1 | 372 | Success |
| 470 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: New event created with IsMatched = 1 | 130 | Success |
| 471 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Prevents duplicate events on resync | 176 | Success |
| 472 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Unmatched future event matched in next run | 147 | Success |
| 473 | M2_SyncCampaignsToProductionEvents_Tests | test LINKING: All campaigns in group linked to same event | 209 | Success |
| 474 | M2_SyncCampaignsToProductionEvents_Tests | test LINKING: EventId preserved for already-linked campaigns | 86 | Success |
| 475 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Closest match selected when multiple exist | 172 | Success |
| 476 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Event expands with campaigns | 118 | Success |
| 477 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Event times adjust to campaigns | 143 | Success |
| 478 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Exact temporal overlap matches event | 119 | Success |
| 479 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Fallback respects section | 163 | Success |
| 480 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Fallback to next unmatched same section | 191 | Success |
| 481 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Inactive events not matched | 179 | Success |
| 482 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: New event created when no match found | 163 | Success |
| 483 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Proximity window 48h enforced | 114 | Success |
| 484 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Proximity window matches close event | 163 | Success |
| 485 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: First sync detects production run start | 163 | Success |
| 486 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: Mixed matched and unmatched timeline | 192 | Success |
| 487 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: Second sync continues from last matched event | 216 | Success |
| 488 | M2_SyncCampaignsToProductionEvents_Tests | test SPLIT #2258: cross-month event gets one PEA row per production month | 196 | Success |
| 489 | M2_SyncCampaignsToProductionEvents_Tests | test SPLIT #2258: resync does not duplicate PEA EventMonth rows | 201 | Success |
| 490 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: Continuity maintained between groups | 180 | Success |
| 491 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: FirstBilletTimestamp is first campaign start | 195 | Success |
| 492 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: TrackedEnd is last campaign end | 106 | Success |
| 493 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob calculates cumulative start values | 138 | Success |
| 494 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob calculates metrics from billets | 85 | Success |
| 495 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob creates new campaign | 159 | Success |
| 496 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob only counts billets in time range | 94 | Success |
| 497 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob preserves offset values | 134 | Success |
| 498 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob skips deleted carriers | 101 | Success |
| 499 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob skips inactive passes | 86 | Success |
| 500 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob updates existing campaign | 97 | Success |
Raw Output Tail
|425|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction MOVE then DILATE sequence] | 57|Success| |426|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction stops when Fixed blocks entire remaining gap] | 139|Success| |427|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction through mixed Fixed event types] | 53|Success| |428|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction through multiple consecutive Fixed events] | 40|Success| |429|[M2_ScheduleCompaction_Tests].[test Fixed: Compaction through overlapping Fixed events without double counting] | 152|Success| |430|[M2_ScheduleCompaction_Tests].[test Fixed: Fixed event at exact gap boundary causes MOVE] | 37|Success| |431|[M2_ScheduleCompaction_Tests].[test Gap: Middle event shortening compacts subsequent events] | 69|Success| |432|[M2_ScheduleCompaction_Tests].[test Gap: Variable gaps between events compact correctly] | 102|Success| |433|[M2_ScheduleCompaction_Tests].[test Gap: Very large gap 5 hours compacts correctly] | 61|Success| |434|[M2_ScheduleCompaction_Tests].[test Gap: Very small gap 3 minutes compacts correctly] | 37|Success| |435|[M2_ScheduleCompaction_Tests].[test Integration: CompactSchedule disabled skips compaction] | 69|Success| |436|[M2_ScheduleCompaction_Tests].[test Integration: UpsertEvent skips compaction with blocking events] | 61|Success| |437|[M2_ScheduleCompaction_Tests].[test Integration: UpsertEvent triggers compaction on shortening] | 61|Success| |438|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId1 is required] | 49|Success| |439|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId2 does not exist in Rolls table] | 53|Success| |440|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId2 required when RollsetId2 provided] | 53|Success| |441|[M2_SwapRollsetsRolls_Tests].[test Error: Cannot swap rollsets in different sections] | 61|Success| |442|[M2_SwapRollsetsRolls_Tests].[test Error: Cannot swap rollsets in different stands] | 93|Success| |443|[M2_SwapRollsetsRolls_Tests].[test Error: Rollset1 must have both rolls assigned] | 53|Success| |444|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 and RollsetId2 must be different] | 45|Success| |445|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 does not exist] | 53|Success| |446|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 is required] | 93|Success| |447|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId2 does not exist] | 53|Success| |448|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId1 does not exist in Rolls table] | 48|Success| |449|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId1 is required] | 65|Success| |450|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId2 required when RollsetId2 provided] | 53|Success| |451|[M2_SwapRollsetsRolls_Tests].[test Success: Create new rollset with specified rolls] | 299|Success| |452|[M2_SwapRollsetsRolls_Tests].[test Success: Swap rolls between two rollsets] | 175|Success| |453|[M2_SwapRollsetsRolls_Tests].[test Success: Use any valid rolls] | 159|Success| |454|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Chain stops at matched barrier] | 151|Success| |455|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Matched events are immovable barriers] | 155|Success| |456|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Updating IsMatched prevents future cascade] | 118|Success| |457|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: Multiple section changes create multiple events] | 176|Success| |458|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: ResolveEventCascade called for each group] | 127|Success| |459|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: StatusCode K preserved when updating] | 89|Success| |460|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: Date filters work correctly] | 184|Success| |461|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: Empty campaigns table produces no events] | 69|Success| |462|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: No campaigns returns gracefully] | 61|Success| |463|[M2_SyncCampaignsToProductionEvents_Tests].[test FIXED: Dilates unmatched but not matched] | 130|Success| |464|[M2_SyncCampaignsToProductionEvents_Tests].[test FIXED: Does not dilate matched events] | 93|Success| |465|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Consecutive campaigns same section create single event] | 122|Success| |466|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Section change creates separate events] | 224|Success| |467|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Single campaign creates single event] | 110|Success| |468|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Last group updates status P to I when matched] | 102|Success| |469|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Matched event updated with IsMatched = 1] | 372|Success| |470|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: New event created with IsMatched = 1] | 130|Success| |471|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Prevents duplicate events on resync] | 176|Success| |472|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Unmatched future event matched in next run] | 147|Success| |473|[M2_SyncCampaignsToProductionEvents_Tests].[test LINKING: All campaigns in group linked to same event] | 209|Success| |474|[M2_SyncCampaignsToProductionEvents_Tests].[test LINKING: EventId preserved for already-linked campaigns] | 86|Success| |475|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Closest match selected when multiple exist] | 172|Success| |476|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Event expands with campaigns] | 118|Success| |477|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Event times adjust to campaigns] | 143|Success| |478|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Exact temporal overlap matches event] | 119|Success| |479|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Fallback respects section] | 163|Success| |480|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Fallback to next unmatched same section] | 191|Success| |481|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Inactive events not matched] | 179|Success| |482|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: New event created when no match found] | 163|Success| |483|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Proximity window 48h enforced] | 114|Success| |484|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Proximity window matches close event] | 163|Success| |485|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: First sync detects production run start] | 163|Success| |486|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: Mixed matched and unmatched timeline] | 192|Success| |487|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: Second sync continues from last matched event] | 216|Success| |488|[M2_SyncCampaignsToProductionEvents_Tests].[test SPLIT #2258: cross-month event gets one PEA row per production month] | 196|Success| |489|[M2_SyncCampaignsToProductionEvents_Tests].[test SPLIT #2258: resync does not duplicate PEA EventMonth rows] | 201|Success| |490|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: Continuity maintained between groups] | 180|Success| |491|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: FirstBilletTimestamp is first campaign start] | 195|Success| |492|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: TrackedEnd is last campaign end] | 106|Success| |493|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob calculates cumulative start values] | 138|Success| |494|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob calculates metrics from billets] | 85|Success| |495|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob creates new campaign] | 159|Success| |496|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob only counts billets in time range] | 94|Success| |497|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob preserves offset values] | 134|Success| |498|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob skips deleted carriers] | 101|Success| |499|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob skips inactive passes] | 86|Success| |500|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob updates existing campaign] | 97|Success| -------------------------------------------------------------------------------------------- Test Case Summary: 500 test case(s) executed, 500 succeeded, 0 skipped, 0 failed, 0 errored. --------------------------------------------------------------------------------------------