PASSED
tSQLt SQL E2E
Generated at 2026-04-20T18:55:51.954Z. Raw output: run-tsqlt-output.txt. Structured data: results.json.
Total
419
Passed
419
Failed
0
Skipped
0
Errored
0
Modules
15
Module Summary
| Module | Total | Passed | Failed | Skipped | Errored |
|---|---|---|---|---|---|
| M2_CarrierInstancesPasses_Tests | 31 | 31 | 0 | 0 | 0 |
| M2_CarrierProtection_Tests | 48 | 48 | 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 | 10 | 10 | 0 | 0 | 0 |
| M2_EventErrorHandling_Tests | 10 | 10 | 0 | 0 | 0 |
| M2_EventIntegration_Tests | 35 | 35 | 0 | 0 | 0 |
| M2_PassCampaigns_Tests | 14 | 14 | 0 | 0 | 0 |
| M2_ResolveEventCollisions_Tests | 59 | 59 | 0 | 0 | 0 |
| M2_ScheduleCompaction_Tests | 22 | 22 | 0 | 0 | 0 |
| M2_SwapRollsetsRolls_Tests | 16 | 16 | 0 | 0 | 0 |
| M2_SyncCampaignsToProductionEvents_Tests | 37 | 37 | 0 | 0 | 0 |
| M2_TensileRequirements_Tests | 15 | 15 | 0 | 0 | 0 |
| M2_TrackPassCampaignsJob_Tests | 8 | 8 | 0 | 0 | 0 |
Test Results
| # | Module | Test | Duration (ms) | Result |
|---|---|---|---|---|
| 1 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass deletes non-last record | 85 | Success |
| 2 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails for last record | 57 | Success |
| 3 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails when already deleted | 73 | Success |
| 4 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails with non-existent id | 69 | Success |
| 5 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass fails without id | 48 | Success |
| 6 | M2_CarrierInstancesPasses_Tests | test DeleteCarrierInstancePass removes PassCampaign | 114 | Success |
| 7 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts first record StartedAt | 94 | Success |
| 8 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts only f<...>tedAt to InstalledAt and last EndedAt to UninstalledAt when window changes | 81 | Success |
| 9 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes adjusts only first StartedAt to InstalledAt when window shifts keeping same duration | 85 | Success |
| 10 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes chains EndedAt for multiple records | 98 | Success |
| 11 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes does not scale single pass | 81 | Success |
| 12 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes does not scale when window unchanged | 98 | Success |
| 13 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails with non-existent CarrierInstance | 69 | Success |
| 14 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails without CarrierInstanceId | 65 | Success |
| 15 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes fails without EdgerRollPartId | 53 | Success |
| 16 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes recalculates only the specified EdgerRoll leaving other rolls unchanged | 77 | Success |
| 17 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes returns 0 when no records | 49 | Success |
| 18 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes scales passes proportionally when window expands | 98 | Success |
| 19 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes sets EndedAt to UninstalledAt for single record | 73 | Success |
| 20 | M2_CarrierInstancesPasses_Tests | test RecalculatePassTimes sets NULL EndedAt when not uninstalled | 78 | Success |
| 21 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass creates first record with InstalledAt | 126 | Success |
| 22 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass creates with explicit StartedAt | 109 | Success |
| 23 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails changing to same active pass | 69 | Success |
| 24 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails when EdgerRoll not in Rollset | 106 | Success |
| 25 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with non-existent CarrierInstance | 73 | Success |
| 26 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with non-existent pass | 61 | Success |
| 27 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with StartedAt after UninstalledAt | 57 | Success |
| 28 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails with StartedAt before InstalledAt | 81 | Success |
| 29 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails without CarrierInstanceId | 102 | Success |
| 30 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass fails without EdgerRollPartId | 57 | Success |
| 31 | M2_CarrierInstancesPasses_Tests | test UpsertCarrierInstancePass replaces record with same StartedAt | 138 | Success |
| 32 | M2_CarrierProtection_Tests | test DeleteArbor deactivates UniversalRoll Part | 89 | Success |
| 33 | M2_CarrierProtection_Tests | test DeleteArbor fails when carrier status is U | 121 | Success |
| 34 | M2_CarrierProtection_Tests | test DeleteArbor in rollset deactivates UR and rollset | 109 | Success |
| 35 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when arbor not in any universal roll | 85 | Success |
| 36 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when carrier status is X | 118 | Success |
| 37 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when rollset has no carrier | 98 | Success |
| 38 | M2_CarrierProtection_Tests | test DeleteArbor succeeds when universal roll not in rollset | 118 | Success |
| 39 | M2_CarrierProtection_Tests | test DeleteDonut fails when carrier status is C | 101 | Success |
| 40 | M2_CarrierProtection_Tests | test DeleteDonut fails when carrier status is S | 118 | Success |
| 41 | M2_CarrierProtection_Tests | test DeleteDonut in rollset updates UR and deactivates rollset | 89 | Success |
| 42 | M2_CarrierProtection_Tests | test DeleteDonut keeps UniversalRoll active | 85 | Success |
| 43 | M2_CarrierProtection_Tests | test DeleteDonut multiple donuts succeeds when none in active carrier | 98 | Success |
| 44 | M2_CarrierProtection_Tests | test DeleteDonut sets UniversalRoll DonutPartId to NULL | 97 | Success |
| 45 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when carrier status is F | 89 | Success |
| 46 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when donut not in any universal roll | 105 | Success |
| 47 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when rollset has no carrier | 110 | Success |
| 48 | M2_CarrierProtection_Tests | test DeleteDonut succeeds when universal roll not in rollset | 114 | Success |
| 49 | M2_CarrierProtection_Tests | test DeleteRoll deactivates rollset when carrier status is E | 97 | Success |
| 50 | M2_CarrierProtection_Tests | test DeleteRoll deactivates rollset when no carrier instance | 86 | Success |
| 51 | M2_CarrierProtection_Tests | test DeleteRoll edger deactivates rollset when carrier status is F | 110 | Success |
| 52 | M2_CarrierProtection_Tests | test DeleteRoll edger deactivates rollset when no carrier | 130 | Success |
| 53 | M2_CarrierProtection_Tests | test DeleteRoll edger fails when carrier status is A | 89 | Success |
| 54 | M2_CarrierProtection_Tests | test DeleteRoll edger fails when carrier status is I | 77 | Success |
| 55 | M2_CarrierProtection_Tests | test DeleteRoll edger succeeds when not in any rollset | 85 | Success |
| 56 | M2_CarrierProtection_Tests | test DeleteRoll error message contains carrier name | 73 | Success |
| 57 | M2_CarrierProtection_Tests | test DeleteRoll error message contains CarrierInstanceId | 98 | Success |
| 58 | M2_CarrierProtection_Tests | test DeleteRoll error message contains roll name | 77 | Success |
| 59 | M2_CarrierProtection_Tests | test DeleteRoll fails when carrier status is A | 102 | Success |
| 60 | M2_CarrierProtection_Tests | test DeleteRoll fails when carrier status is I | 114 | Success |
| 61 | M2_CarrierProtection_Tests | test DeleteRoll multiple rolls fails if any in active carrier | 78 | Success |
| 62 | M2_CarrierProtection_Tests | test DeleteRoll roll stays active when blocked | 77 | Success |
| 63 | M2_CarrierProtection_Tests | test DeleteRoll succeeds when roll not in any rollset | 81 | Success |
| 64 | M2_CarrierProtection_Tests | test UpsertRollset change rolls fails when in active carrier | 89 | Success |
| 65 | M2_CarrierProtection_Tests | test UpsertRollset deactivate fails when in active carrier | 70 | Success |
| 66 | M2_CarrierProtection_Tests | test UpsertRollset implicit deactivation fails when other in active carrier | 82 | Success |
| 67 | M2_CarrierProtection_Tests | test UpsertRollset implicit deactivation succeeds when no carrier | 204 | Success |
| 68 | M2_CarrierProtection_Tests | test UpsertRollset use roll from active carrier fails | 102 | Success |
| 69 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor fails when in active carrier | 78 | Success |
| 70 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor succeeds when carrier status E | 224 | Success |
| 71 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change arbor succeeds when no rollset | 200 | Success |
| 72 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut fails when in active carrier | 110 | Success |
| 73 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut in rollset deactivates rollset | 216 | Success |
| 74 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut succeeds when carrier status F | 207 | Success |
| 75 | M2_CarrierProtection_Tests | test UpsertUniversalRoll change donut succeeds when no rollset | 195 | Success |
| 76 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove arbor fails when in active carrier | 86 | Success |
| 77 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove arbor succeeds when no rollset | 215 | Success |
| 78 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove donut fails when in active carrier | 289 | Success |
| 79 | M2_CarrierProtection_Tests | test UpsertUniversalRoll remove donut succeeds when no rollset | 207 | Success |
| 80 | M2_DetectRollsetDisruption_Tests | test Broken rollset alert includes roll names | 69 | Success |
| 81 | M2_DetectRollsetDisruption_Tests | test Broken rollset alert uses past tense | 93 | Success |
| 82 | M2_DetectRollsetDisruption_Tests | test Default diameter tolerance is zero | 77 | Success |
| 83 | M2_DetectRollsetDisruption_Tests | test Diameter mismatch alert created when exceeds tolerance | 65 | Success |
| 84 | M2_DetectRollsetDisruption_Tests | test Diameter mismatch alert has no mm unit | 73 | Success |
| 85 | M2_DetectRollsetDisruption_Tests | test Diameter tolerance from catSettings | 81 | Success |
| 86 | M2_DetectRollsetDisruption_Tests | test Disruption created when affected rollsets exist | 114 | Success |
| 87 | M2_DetectRollsetDisruption_Tests | test Handles missing diameter data gracefully | 65 | Success |
| 88 | M2_DetectRollsetDisruption_Tests | test Multiple affected rollsets create multiple alerts | 74 | Success |
| 89 | M2_DetectRollsetDisruption_Tests | test Multiple alert types created in single disruption | 89 | Success |
| 90 | M2_DetectRollsetDisruption_Tests | test No diameter alert when within tolerance | 102 | Success |
| 91 | M2_DetectRollsetDisruption_Tests | test No disruption created when no conflicts exist | 61 | Success |
| 92 | M2_DetectRollsetDisruption_Tests | test No orphans stored for Swap action | 118 | Success |
| 93 | M2_DetectRollsetDisruption_Tests | test No position swap alert for Any position roll | 122 | Success |
| 94 | M2_DetectRollsetDisruption_Tests | test No position swap alert when position matches | 102 | Success |
| 95 | M2_DetectRollsetDisruption_Tests | test Orphaned rolls identified when breaking rollset | 98 | Success |
| 96 | M2_DetectRollsetDisruption_Tests | test Orphans linked to correct RollsetBrokenAlert | 89 | Success |
| 97 | M2_DetectRollsetDisruption_Tests | test Orphans stored for Create action | 93 | Success |
| 98 | M2_DetectRollsetDisruption_Tests | test Orphans stored for Mix action | 102 | Success |
| 99 | M2_DetectRollsetDisruption_Tests | test Position swap alert created for Bottom to Top | 65 | Success |
| 100 | M2_DetectRollsetDisruption_Tests | test Position swap alert created for Top to Bottom | 85 | Success |
| 101 | M2_DetectRollsetDisruption_Tests | test Position swap alert uses past tense | 81 | Success |
| 102 | M2_DetectRollsetDisruption_Tests | test PrevRollsetId adds rollset to affected list | 89 | Success |
| 103 | M2_DetectRollsetDisruption_Tests | test PrevRollsetId creates orphans from previous rollset | 90 | Success |
| 104 | M2_DetectRollsetDisruption_Tests | test RollsetBrokenAlerts populated for affected rollsets | 74 | Success |
| 105 | M2_DetectRollsetDisruption_Tests | test RollshopAlert always created even without alerts | 110 | Success |
| 106 | M2_DetectRollsetDisruption_Tests | test RollshopAlert default StatusCode is P | 65 | Success |
| 107 | M2_DetectRollsetDisruption_Tests | test RollshopAlert has CreatedBy populated | 61 | Success |
| 108 | M2_DisruptionTracking_Tests | test AcknowledgeNotification: Error when already acknowledged | 57 | Success |
| 109 | M2_DisruptionTracking_Tests | test AcknowledgeNotification: Status changes from P to A | 110 | Success |
| 110 | M2_DisruptionTracking_Tests | test Detection: Diameter mismatch alert created when difference exceeds tolerance | 130 | Success |
| 111 | M2_DisruptionTracking_Tests | test Detection: Multiple affected rollsets identified | 187 | Success |
| 112 | M2_DisruptionTracking_Tests | test Detection: Multiple orphaned rolls identified | 150 | Success |
| 113 | M2_DisruptionTracking_Tests | test Detection: No diameter alert when within tolerance | 146 | Success |
| 114 | M2_DisruptionTracking_Tests | test Detection: Position swap alert created for Bottom to Top | 151 | Success |
| 115 | M2_DisruptionTracking_Tests | test Detection: Position swap alert created for Top to Bottom | 150 | Success |
| 116 | M2_DisruptionTracking_Tests | test Detection: Single affected rollset identified | 158 | Success |
| 117 | M2_DisruptionTracking_Tests | test Detection: Single orphaned roll identified | 167 | Success |
| 118 | M2_DisruptionTracking_Tests | test ErrorHandling: Rollset created even if detection fails | 126 | Success |
| 119 | M2_DisruptionTracking_Tests | test Integration: Multiple alert types in one disruption | 150 | Success |
| 120 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode C recorded correctly | 159 | Success |
| 121 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode M recorded correctly | 126 | Success |
| 122 | M2_DisruptionTracking_Tests | test UpsertRollset: ActionTypeCode S recorded correctly | 154 | Success |
| 123 | M2_DisruptionTracking_Tests | test UpsertRollset: Default ActionTypeCode is C | 122 | Success |
| 124 | M2_DraftEvents_Tests | test ConfirmEvents: Deletes Main events not in active Draft | 78 | Success |
| 125 | M2_DraftEvents_Tests | test ConfirmEvents: Error when ConfirmUntilEventId not found | 25 | Success |
| 126 | M2_DraftEvents_Tests | test ConfirmEvents: Inserts new Draft events to Main | 61 | Success |
| 127 | M2_DraftEvents_Tests | test ConfirmEvents: Partial confirmation with ConfirmUntilEventId | 82 | Success |
| 128 | M2_DraftEvents_Tests | test ConfirmEvents: Publishes Draft to Main | 44 | Success |
| 129 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Deletes from both tables | 36 | Success |
| 130 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Error when not found in Draft | 24 | Success |
| 131 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: Error when not found in Main | 48 | Success |
| 132 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: IsMatched in Draft prevents deletion | 53 | Success |
| 133 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Both: IsMatched in Main prevents deletion | 45 | Success |
| 134 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Default: Defaults to Main | 33 | Success |
| 135 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Dilated event handling in Draft | 41 | Success |
| 136 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Error when not found in Draft | 53 | Success |
| 137 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: IsMatched prevents deletion | 61 | Success |
| 138 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Draft: Only deletes from Draft table | 73 | Success |
| 139 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Invalid: Throws error for invalid mode | 24 | Success |
| 140 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Dilated event handling | 40 | Success |
| 141 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Error when not found in Main | 40 | Success |
| 142 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: IsMatched prevents deletion | 29 | Success |
| 143 | M2_DraftEvents_Tests | test DeleteEvent DeleteMode Main: Only deletes from Main table | 33 | Success |
| 144 | M2_DraftEvents_Tests | test DeleteEvent: Both mode syncs delete to Draft | 41 | Success |
| 145 | M2_DraftEvents_Tests | test DeleteEvent: Draft mode does not affect Main | 32 | Success |
| 146 | M2_DraftEvents_Tests | test DeleteEvent: Error when EventId not found in Draft | 20 | Success |
| 147 | M2_DraftEvents_Tests | test DeleteEvent: Error when EventId not found in Main | 21 | Success |
| 148 | M2_DraftEvents_Tests | test DeleteEvent: Error when IsMatched = 1 in Draft mode | 81 | Success |
| 149 | M2_DraftEvents_Tests | test DeleteEvent: Error when IsMatched = 1 | 41 | Success |
| 150 | M2_DraftEvents_Tests | test Edge: ConfirmEvents when already in sync | 57 | Success |
| 151 | M2_DraftEvents_Tests | test Edge: Multiple Production events sync correctly | 49 | Success |
| 152 | M2_DraftEvents_Tests | test Edge: ResetDraft with empty Main clears Draft | 57 | Success |
| 153 | M2_DraftEvents_Tests | test Isolation: Draft and Main can differ | 28 | Success |
| 154 | M2_DraftEvents_Tests | test Isolation: Draft changes do not affect Main | 28 | Success |
| 155 | M2_DraftEvents_Tests | test MergeToDraft: All production fields sync correctly | 49 | Success |
| 156 | M2_DraftEvents_Tests | test MergeToDraft: DELETE soft-deletes in Draft | 32 | Success |
| 157 | M2_DraftEvents_Tests | test MergeToDraft: Error when EventId not found | 24 | Success |
| 158 | M2_DraftEvents_Tests | test MergeToDraft: Fixed event copies Start/End exactly | 45 | Success |
| 159 | M2_DraftEvents_Tests | test MergeToDraft: New Fixed event creates in Draft with cascade | 37 | Success |
| 160 | M2_DraftEvents_Tests | test MergeToDraft: Reactivates inactive Draft event on Main update | 89 | Success |
| 161 | M2_DraftEvents_Tests | test ResetDraft: Deletes Draft-only events | 77 | Success |
| 162 | M2_DraftEvents_Tests | test ResetDraft: Inserts Main-only events to Draft | 48 | Success |
| 163 | M2_DraftEvents_Tests | test ResetDraft: Restores Draft from Main | 69 | Success |
| 164 | M2_DraftEvents_Tests | test Sync Scenario: Different ScheduledRollingHours in Main and Draft | 69 | Success |
| 165 | M2_DraftEvents_Tests | test Sync Scenario: Different Start times preserved until confirmed | 49 | Success |
| 166 | M2_DraftEvents_Tests | test Sync Scenario: Different StatusCode in Main and Draft | 57 | Success |
| 167 | M2_DraftEvents_Tests | test Sync Scenario: Event active in Main but inactive in Draft | 69 | Success |
| 168 | M2_DraftEvents_Tests | test Sync Scenario: Event exists only in Draft | 44 | Success |
| 169 | M2_DraftEvents_Tests | test Sync Scenario: Event exists only in Main | 77 | Success |
| 170 | M2_DraftEvents_Tests | test Sync Scenario: IsMatched in Main but not in Draft | 37 | Success |
| 171 | M2_DraftEvents_Tests | test Sync Scenario: MergeToDraft preserves Draft Start | 85 | Success |
| 172 | M2_DraftEvents_Tests | test SyncCampaigns: Creates event in both Main and Draft | 105 | Success |
| 173 | M2_DraftEvents_Tests | test SyncDelete: Delete Both then resync recreates both | 114 | Success |
| 174 | M2_DraftEvents_Tests | test SyncDelete: Delete Draft preserves Main state | 110 | Success |
| 175 | M2_DraftEvents_Tests | test SyncDelete: Delete Draft then resync restores Draft via MergeToDraft | 126 | Success |
| 176 | M2_DraftEvents_Tests | test SyncDelete: Delete Main preserves Draft state independently | 130 | Success |
| 177 | M2_DraftEvents_Tests | test SyncDelete: Delete Main then resync recreates Main | 94 | Success |
| 178 | M2_DraftEvents_Tests | test SyncDelete: IsMatched prevents delete in all modes | 106 | Success |
| 179 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Downtime in Draft | 49 | Success |
| 180 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Holiday only in Draft | 36 | Success |
| 181 | M2_DraftEvents_Tests | test UpsertDraftEvent: Create Maintenance in Draft | 37 | Success |
| 182 | M2_DraftEvents_Tests | test UpsertDraftEvent: Error when Start is NULL | 21 | Success |
| 183 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: Error when SectionId missing | 28 | Success |
| 184 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: IsMatched allows non-date changes | 41 | Success |
| 185 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: IsMatched prevents date changes | 44 | Success |
| 186 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: New event only in Draft not Main | 94 | Success |
| 187 | M2_DraftEvents_Tests | test UpsertDraftProductionEvent: Update only affects Draft not Main | 69 | Success |
| 188 | M2_DraftEvents_Tests | test UpsertProductionEvent: Anchor logic positions Draft event correctly | 73 | Success |
| 189 | M2_DraftEvents_Tests | test UpsertProductionEvent: IsMatched syncs to Draft | 49 | Success |
| 190 | M2_DraftEvents_Tests | test UpsertProductionEvent: New event creates in both Main and Draft | 73 | Success |
| 191 | M2_DraftEvents_Tests | test UpsertProductionEvent: No anchor uses Main Start for Draft | 97 | Success |
| 192 | M2_DraftEvents_Tests | test UpsertProductionEvent: ScheduledRollingHours change recalculates Draft End | 69 | Success |
| 193 | M2_DraftEvents_Tests | test UpsertProductionEvent: Update syncs fields to Draft but not Start | 400 | Success |
| 194 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds first pass with defaults | 24 | Success |
| 195 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass adds sequential passes up to 4 | 33 | Success |
| 196 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with inactive PartId | 17 | Success |
| 197 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with invalid PassNumber | 16 | Success |
| 198 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with invalid PassStatusCode | 21 | Success |
| 199 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with non-EdgerRoll Part | 21 | Success |
| 200 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass fails with non-existent PartId | 20 | Success |
| 201 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass returns PassNumber on update | 24 | Success |
| 202 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates status to Damaged | 24 | Success |
| 203 | M2_EdgerRollPass_Tests | test UpsertEdgerRollPass updates status to Used | 24 | Success |
| 204 | M2_EventErrorHandling_Tests | test Cascade: Max cascade iterations throws descriptive error | 57 | Success |
| 205 | M2_EventErrorHandling_Tests | test Cascade: Max Fixed resolution iterations throws descriptive error | 29 | Success |
| 206 | M2_EventErrorHandling_Tests | test Compaction: Max iterations throws descriptive error | 20 | Success |
| 207 | M2_EventErrorHandling_Tests | test Defaults: PreProcessEvent uses fallback limit | 21 | Success |
| 208 | M2_EventErrorHandling_Tests | test ErrorMessage: Clean extraction removes technical context | 12 | Success |
| 209 | M2_EventErrorHandling_Tests | test ErrorMessage: Collision errors identify event types | 20 | Success |
| 210 | M2_EventErrorHandling_Tests | test PreProcess: Error message contains context information | 16 | Success |
| 211 | M2_EventErrorHandling_Tests | test PreProcess: Max iterations reached throws descriptive error | 20 | Success |
| 212 | M2_EventErrorHandling_Tests | test Transaction: UpsertEvent rollback on PreProcess error | 48 | Success |
| 213 | M2_EventErrorHandling_Tests | test Transaction: UpsertProductionEvent rollback on validation error | 12 | Success |
| 214 | M2_EventIntegration_Tests | test Cascade: Long chain with intercalated Fixed | 97 | Success |
| 215 | M2_EventIntegration_Tests | test Cascade: Stress test 10 consecutive events | 158 | Success |
| 216 | M2_EventIntegration_Tests | test Compact: Blocked by Fixed event | 98 | Success |
| 217 | M2_EventIntegration_Tests | test Compact: Complete gap closure | 114 | Success |
| 218 | M2_EventIntegration_Tests | test Compact: Preserves dilation downstream | 106 | Success |
| 219 | M2_EventIntegration_Tests | test Complex: BaseDuration preserved through complete cycle | 89 | Success |
| 220 | M2_EventIntegration_Tests | test Complex: Complete production schedule with Fixed events | 110 | Success |
| 221 | M2_EventIntegration_Tests | test Complex: Update triggers cascade and compaction | 98 | Success |
| 222 | M2_EventIntegration_Tests | test Create: Production with minimal fields | 65 | Success |
| 223 | M2_EventIntegration_Tests | test EdgeCase: Production spans midnight | 81 | Success |
| 224 | M2_EventIntegration_Tests | test EdgeCase: Very long BaseDuration 24h | 110 | Success |
| 225 | M2_EventIntegration_Tests | test EdgeCase: Very short BaseDuration 5min | 69 | Success |
| 226 | M2_EventIntegration_Tests | test Insert: Fixed between Productions cascades | 106 | Success |
| 227 | M2_EventIntegration_Tests | test PreProcess: Multiple consecutive Fixed events MOVE | 101 | Success |
| 228 | M2_EventIntegration_Tests | test PreProcess: Overlapping Fixed events smart dilation | 73 | Success |
| 229 | M2_EventIntegration_Tests | test PreProcess: Production vs Production MOVE | 65 | Success |
| 230 | M2_EventIntegration_Tests | test STEP4: Shrinking Fixed readjusts dilated Production | 90 | Success |
| 231 | M2_EventIntegration_Tests | test Update: Change Production SectionId | 69 | Success |
| 232 | M2_EventIntegration_Tests | test Update: Moving Fixed triggers cascade | 94 | Success |
| 233 | M2_EventIntegration_Tests | test Update: Multiple modifications preserve BaseDuration | 74 | Success |
| 234 | M2_EventIntegration_Tests | test Update: Multiple Production fields batch | 65 | Success |
| 235 | M2_EventIntegration_Tests | test Update: Start moves into collision zone | 101 | Success |
| 236 | M2_EventIntegration_Tests | test UpsertEvent: Create compatible Downtime and Maintenance | 65 | Success |
| 237 | M2_EventIntegration_Tests | test UpsertEvent: Update Fixed event adjusts affected Production | 118 | Success |
| 238 | M2_EventIntegration_Tests | test UpsertProductionEvent: Auto-moves after Holiday | 94 | Success |
| 239 | M2_EventIntegration_Tests | test UpsertProductionEvent: Create with all fields populated | 65 | Success |
| 240 | M2_EventIntegration_Tests | test UpsertProductionEvent: Dilates around Downtime | 97 | Success |
| 241 | M2_EventIntegration_Tests | test UpsertProductionEvent: Update preserves BaseDuration | 69 | Success |
| 242 | M2_EventIntegration_Tests | test Validation: Downtime vs Downtime collision error | 45 | Success |
| 243 | M2_EventIntegration_Tests | test Validation: Downtime vs Holiday collision error | 45 | Success |
| 244 | M2_EventIntegration_Tests | test Validation: End before Start throws error | 45 | Success |
| 245 | M2_EventIntegration_Tests | test Validation: Holiday vs Holiday collision error | 45 | Success |
| 246 | M2_EventIntegration_Tests | test Validation: Invalid EventTypeCode error | 37 | Success |
| 247 | M2_EventIntegration_Tests | test Validation: Invalid SectionId throws error | 20 | Success |
| 248 | M2_EventIntegration_Tests | test Workflow: StatusCode P to I to C progression | 69 | Success |
| 249 | M2_PassCampaigns_Tests | test GetPassCampaignData fails with invalid time range | 57 | Success |
| 250 | M2_PassCampaigns_Tests | test GetPassCampaignData fails without EdgerRollPartId | 77 | Success |
| 251 | M2_PassCampaigns_Tests | test GetPassCampaignData filters by PassNumber | 93 | Success |
| 252 | M2_PassCampaigns_Tests | test GetPassCampaignData returns calculated totals | 74 | Success |
| 253 | M2_PassCampaigns_Tests | test GetPassCampaignData returns data for EdgerRoll | 73 | Success |
| 254 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails with deleted pass | 89 | Success |
| 255 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails with non-existent id | 73 | Success |
| 256 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails without any offset | 93 | Success |
| 257 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets fails without id | 57 | Success |
| 258 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets returns correct id | 90 | Success |
| 259 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates multiple offsets | 90 | Success |
| 260 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetBillets | 118 | Success |
| 261 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetLength | 102 | Success |
| 262 | M2_PassCampaigns_Tests | test UpdatePassCampaignOffsets updates OffsetWeight | 85 | Success |
| 263 | M2_ResolveEventCollisions_Tests | test Cascade: Five event cascade chain | 33 | Success |
| 264 | M2_ResolveEventCollisions_Tests | test Cascade: Last event collides with Fixed | 20 | Success |
| 265 | M2_ResolveEventCollisions_Tests | test Cascade: Middle event already dilated | 37 | Success |
| 266 | M2_ResolveEventCollisions_Tests | test Cascade: Moving Production pushes subsequent Production events | 29 | Success |
| 267 | M2_ResolveEventCollisions_Tests | test Cascade: Production cascade blocked by Fixed wall | 20 | Success |
| 268 | M2_ResolveEventCollisions_Tests | test Cascade: Production pushes another Production around Fixed event | 29 | Success |
| 269 | M2_ResolveEventCollisions_Tests | test Cascade: Productions with large gaps between them | 29 | Success |
| 270 | M2_ResolveEventCollisions_Tests | test Complex: Production DILATE then CASCADE another dilated Production | 40 | Success |
| 271 | M2_ResolveEventCollisions_Tests | test Complex: Production DILATE through overlapping Downtime and Maintenance | 32 | Success |
| 272 | M2_ResolveEventCollisions_Tests | test D1: Downtime vs Downtime throws error | 8 | Success |
| 273 | M2_ResolveEventCollisions_Tests | test D1: Downtime vs Holiday partial overlap throws error | 12 | Success |
| 274 | M2_ResolveEventCollisions_Tests | test D3: Downtime vs Maintenance is compatible | 13 | Success |
| 275 | M2_ResolveEventCollisions_Tests | test Edge: Event with minimum duration one minute | 12 | Success |
| 276 | M2_ResolveEventCollisions_Tests | test Edge: Event with very long duration spans days | 20 | Success |
| 277 | M2_ResolveEventCollisions_Tests | test Edge: Multiple events same start different durations | 12 | Success |
| 278 | M2_ResolveEventCollisions_Tests | test Edge: Production ending exactly at Fixed start has no collision | 12 | Success |
| 279 | M2_ResolveEventCollisions_Tests | test Edge: Production one second after Fixed has no collision | 12 | Success |
| 280 | M2_ResolveEventCollisions_Tests | test Edge: Production one second before Fixed has no collision | 33 | Success |
| 281 | M2_ResolveEventCollisions_Tests | test Edge: Production with no collisions remains unchanged | 12 | Success |
| 282 | M2_ResolveEventCollisions_Tests | test H1: Holiday completely containing another Holiday throws error | 12 | Success |
| 283 | M2_ResolveEventCollisions_Tests | test H1: Holiday overlap at end throws error | 12 | Success |
| 284 | M2_ResolveEventCollisions_Tests | test H1: Holiday overlap at start throws error | 13 | Success |
| 285 | M2_ResolveEventCollisions_Tests | test H1: Holiday vs Downtime throws error | 12 | Success |
| 286 | M2_ResolveEventCollisions_Tests | test H1: Holiday vs Holiday throws error | 12 | Success |
| 287 | M2_ResolveEventCollisions_Tests | test H2: Holiday vs Maintenance throws error | 33 | Success |
| 288 | M2_ResolveEventCollisions_Tests | test M1: Maintenance vs Downtime is compatible | 12 | Success |
| 289 | M2_ResolveEventCollisions_Tests | test M1: Maintenance vs Maintenance is compatible | 8 | Success |
| 290 | M2_ResolveEventCollisions_Tests | test M2: Maintenance vs Holiday throws error | 13 | Success |
| 291 | M2_ResolveEventCollisions_Tests | test O1: Multiple Other events can overlap | 33 | Success |
| 292 | M2_ResolveEventCollisions_Tests | test O1: Other does not collide with Holiday | 8 | Success |
| 293 | M2_ResolveEventCollisions_Tests | test O1: Other does not collide with Production | 20 | Success |
| 294 | M2_ResolveEventCollisions_Tests | test O1: Production not affected by Other event | 8 | Success |
| 295 | M2_ResolveEventCollisions_Tests | test P1: Multiple Productions overlapping simultaneously | 12 | Success |
| 296 | M2_ResolveEventCollisions_Tests | test P1: Production completely contained moves after | 17 | Success |
| 297 | M2_ResolveEventCollisions_Tests | test P1: Production containing existing moves after | 33 | Success |
| 298 | M2_ResolveEventCollisions_Tests | test P1: Production moves after existing Production when S < NS | 20 | Success |
| 299 | M2_ResolveEventCollisions_Tests | test P1: Production with same start time moves after existing | 12 | Success |
| 300 | M2_ResolveEventCollisions_Tests | test P2: Production completely inside Fixed MOVES after | 20 | Success |
| 301 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE around Fixed when NS < S | 45 | Success |
| 302 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through contiguous Fixed events | 16 | Success |
| 303 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through Fixed events with variable gaps | 12 | Success |
| 304 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through four consecutive Fixed events | 20 | Success |
| 305 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through mixed Fixed event types | 13 | Success |
| 306 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through multiple Holidays | 12 | Success |
| 307 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through overlapping Fixed events without double counting | 20 | Success |
| 308 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE through three Fixed events with gaps | 12 | Success |
| 309 | M2_ResolveEventCollisions_Tests | test P2: Production DILATE with Fixed ending at exact original P_End | 12 | Success |
| 310 | M2_ResolveEventCollisions_Tests | test P2: Production MOVE after Fixed when S <= NS | 21 | Success |
| 311 | M2_ResolveEventCollisions_Tests | test P2: Production MOVE then DILATE in sequence | 29 | Success |
| 312 | M2_ResolveEventCollisions_Tests | test P2: Production starting at Fixed end has no collision | 13 | Success |
| 313 | M2_ResolveEventCollisions_Tests | test P2: Production with Fixed starting at exact P_Start MOVES | 28 | Success |
| 314 | M2_ResolveEventCollisions_Tests | test P2: Short Production DILATE through long Fixed event | 33 | Success |
| 315 | M2_ResolveEventCollisions_Tests | test Stress: High density Fixed events 12 in 2 hours | 16 | Success |
| 316 | M2_ResolveEventCollisions_Tests | test Stress: Multi-day Production through multiple Fixed events | 20 | Success |
| 317 | M2_ResolveEventCollisions_Tests | test Update: Event excludes itself from collision detection | 45 | Success |
| 318 | M2_ResolveEventCollisions_Tests | test Update: Event in middle of dilated chain | 12 | Success |
| 319 | M2_ResolveEventCollisions_Tests | test Update: Fixed event moved away from collision | 32 | Success |
| 320 | M2_ResolveEventCollisions_Tests | test Update: Production BaseDuration increased significantly | 12 | Success |
| 321 | M2_ResolveEventCollisions_Tests | test Update: Production BaseDuration reduced significantly | 12 | Success |
| 322 | M2_ScheduleCompaction_Tests | test Basic: 2-event compaction moves P2 backward | 25 | Success |
| 323 | M2_ScheduleCompaction_Tests | test Basic: 3-event compaction cascades through all events | 44 | Success |
| 324 | M2_ScheduleCompaction_Tests | test Basic: Partial gap elimination completes gracefully | 24 | Success |
| 325 | M2_ScheduleCompaction_Tests | test Edge: Final event encounters Fixed during compaction | 24 | Success |
| 326 | M2_ScheduleCompaction_Tests | test Edge: Gap fully eliminated creates contiguous events | 29 | Success |
| 327 | M2_ScheduleCompaction_Tests | test Edge: No compaction when event not shortened | 20 | Success |
| 328 | M2_ScheduleCompaction_Tests | test Edge: No subsequent events completes immediately | 32 | Success |
| 329 | M2_ScheduleCompaction_Tests | test Fixed: Compaction DILATE around Fixed event | 53 | Success |
| 330 | M2_ScheduleCompaction_Tests | test Fixed: Compaction MOVE after Fixed event | 57 | Success |
| 331 | M2_ScheduleCompaction_Tests | test Fixed: Compaction MOVE then DILATE sequence | 29 | Success |
| 332 | M2_ScheduleCompaction_Tests | test Fixed: Compaction stops when Fixed blocks entire remaining gap | 49 | Success |
| 333 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through mixed Fixed event types | 45 | Success |
| 334 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through multiple consecutive Fixed events | 45 | Success |
| 335 | M2_ScheduleCompaction_Tests | test Fixed: Compaction through overlapping Fixed events without double counting | 37 | Success |
| 336 | M2_ScheduleCompaction_Tests | test Fixed: Fixed event at exact gap boundary causes MOVE | 41 | Success |
| 337 | M2_ScheduleCompaction_Tests | test Gap: Middle event shortening compacts subsequent events | 36 | Success |
| 338 | M2_ScheduleCompaction_Tests | test Gap: Variable gaps between events compact correctly | 41 | Success |
| 339 | M2_ScheduleCompaction_Tests | test Gap: Very large gap 5 hours compacts correctly | 33 | Success |
| 340 | M2_ScheduleCompaction_Tests | test Gap: Very small gap 3 minutes compacts correctly | 61 | Success |
| 341 | M2_ScheduleCompaction_Tests | test Integration: CompactSchedule disabled skips compaction | 32 | Success |
| 342 | M2_ScheduleCompaction_Tests | test Integration: UpsertEvent skips compaction with blocking events | 48 | Success |
| 343 | M2_ScheduleCompaction_Tests | test Integration: UpsertEvent triggers compaction on shortening | 40 | Success |
| 344 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId1 is required | 28 | Success |
| 345 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId2 does not exist in Rolls table | 37 | Success |
| 346 | M2_SwapRollsetsRolls_Tests | test Error: BottomRollId2 required when RollsetId2 provided | 32 | Success |
| 347 | M2_SwapRollsetsRolls_Tests | test Error: Cannot swap rollsets in different sections | 85 | Success |
| 348 | M2_SwapRollsetsRolls_Tests | test Error: Cannot swap rollsets in different stands | 37 | Success |
| 349 | M2_SwapRollsetsRolls_Tests | test Error: Rollset1 must have both rolls assigned | 36 | Success |
| 350 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 and RollsetId2 must be different | 33 | Success |
| 351 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 does not exist | 29 | Success |
| 352 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId1 is required | 49 | Success |
| 353 | M2_SwapRollsetsRolls_Tests | test Error: RollsetId2 does not exist | 28 | Success |
| 354 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId1 does not exist in Rolls table | 33 | Success |
| 355 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId1 is required | 32 | Success |
| 356 | M2_SwapRollsetsRolls_Tests | test Error: TopRollId2 required when RollsetId2 provided | 56 | Success |
| 357 | M2_SwapRollsetsRolls_Tests | test Success: Create new rollset with specified rolls | 143 | Success |
| 358 | M2_SwapRollsetsRolls_Tests | test Success: Swap rolls between two rollsets | 118 | Success |
| 359 | M2_SwapRollsetsRolls_Tests | test Success: Use any valid rolls | 114 | Success |
| 360 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Chain stops at matched barrier | 73 | Success |
| 361 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Matched events are immovable barriers | 49 | Success |
| 362 | M2_SyncCampaignsToProductionEvents_Tests | test CASCADE: Updating IsMatched prevents future cascade | 94 | Success |
| 363 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: Multiple section changes create multiple events | 61 | Success |
| 364 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: ResolveEventCascade called for each group | 57 | Success |
| 365 | M2_SyncCampaignsToProductionEvents_Tests | test COMPLEX: StatusCode K preserved when updating | 86 | Success |
| 366 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: Date filters work correctly | 65 | Success |
| 367 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: Empty campaigns table produces no events | 61 | Success |
| 368 | M2_SyncCampaignsToProductionEvents_Tests | test EDGE CASE: No campaigns returns gracefully | 45 | Success |
| 369 | M2_SyncCampaignsToProductionEvents_Tests | test FIXED: Dilates unmatched but not matched | 73 | Success |
| 370 | M2_SyncCampaignsToProductionEvents_Tests | test FIXED: Does not dilate matched events | 48 | Success |
| 371 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Consecutive campaigns same section create single event | 61 | Success |
| 372 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Section change creates separate events | 89 | Success |
| 373 | M2_SyncCampaignsToProductionEvents_Tests | test GROUPING: Single campaign creates single event | 93 | Success |
| 374 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Last group updates status P to I when matched | 52 | Success |
| 375 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Matched event updated with IsMatched = 1 | 62 | Success |
| 376 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: New event created with IsMatched = 1 | 61 | Success |
| 377 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Prevents duplicate events on resync | 102 | Success |
| 378 | M2_SyncCampaignsToProductionEvents_Tests | test ISMATCHED: Unmatched future event matched in next run | 61 | Success |
| 379 | M2_SyncCampaignsToProductionEvents_Tests | test LINKING: All campaigns in group linked to same event | 86 | Success |
| 380 | M2_SyncCampaignsToProductionEvents_Tests | test LINKING: EventId preserved for already-linked campaigns | 89 | Success |
| 381 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Closest match selected when multiple exist | 106 | Success |
| 382 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Event expands with campaigns | 118 | Success |
| 383 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Event times adjust to campaigns | 98 | Success |
| 384 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Exact temporal overlap matches event | 73 | Success |
| 385 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Fallback respects section | 56 | Success |
| 386 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Fallback to next unmatched same section | 82 | Success |
| 387 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Inactive events not matched | 57 | Success |
| 388 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: New event created when no match found | 61 | Success |
| 389 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Proximity window 48h enforced | 90 | Success |
| 390 | M2_SyncCampaignsToProductionEvents_Tests | test MATCHING: Proximity window matches close event | 57 | Success |
| 391 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: First sync detects production run start | 90 | Success |
| 392 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: Mixed matched and unmatched timeline | 97 | Success |
| 393 | M2_SyncCampaignsToProductionEvents_Tests | test SMART START: Second sync continues from last matched event | 77 | Success |
| 394 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: Continuity maintained between groups | 69 | Success |
| 395 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: FirstBilletTimestamp is first campaign start | 77 | Success |
| 396 | M2_SyncCampaignsToProductionEvents_Tests | test TIMESTAMPS: TrackedEnd is last campaign end | 77 | Success |
| 397 | M2_TensileRequirements_Tests | test CorrectHeatGrades updates GradeId when swv-mes has different grade | 28 | Success |
| 398 | M2_TensileRequirements_Tests | test Disposition fails if any retest sample fails | 33 | Success |
| 399 | M2_TensileRequirements_Tests | test Disposition returns P when all samples pass | 33 | Success |
| 400 | M2_TensileRequirements_Tests | test Disposition returns U when any sample fails | 37 | Success |
| 401 | M2_TensileRequirements_Tests | test Disposition returns U when one of multiple samples fails | 45 | Success |
| 402 | M2_TensileRequirements_Tests | test Disposition uses corrected grade after grade correction | 37 | Success |
| 403 | M2_TensileRequirements_Tests | test Disposition uses latest sequence only - retest supersedes | 36 | Success |
| 404 | M2_TensileRequirements_Tests | test Disposition uses version effective at report time | 37 | Success |
| 405 | M2_TensileRequirements_Tests | test UpsertTensileRequirements creates new version | 69 | Success |
| 406 | M2_TensileRequirements_Tests | test UpsertTensileRequirements throws error when EffectiveDate is NULL | 20 | Success |
| 407 | M2_TensileRequirements_Tests | test UpsertTensileRequirements throws error when Rev is NULL | 24 | Success |
| 408 | M2_TensileRequirements_Tests | test UpsertTensileRequirements throws error when Rows is invalid JSON | 21 | Success |
| 409 | M2_TensileRequirements_Tests | test YieldPassed returns 0 when value above max | 32 | Success |
| 410 | M2_TensileRequirements_Tests | test YieldPassed returns 0 when value below min | 28 | Success |
| 411 | M2_TensileRequirements_Tests | test YieldPassed returns 1 when value in range | 37 | Success |
| 412 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob calculates cumulative start values | 65 | Success |
| 413 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob calculates metrics from billets | 114 | Success |
| 414 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob creates new campaign | 89 | Success |
| 415 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob only counts billets in time range | 110 | Success |
| 416 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob preserves offset values | 94 | Success |
| 417 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob skips deleted carriers | 85 | Success |
| 418 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob skips inactive passes | 65 | Success |
| 419 | M2_TrackPassCampaignsJob_Tests | test TrackPassCampaignsJob updates existing campaign | 69 | Success |
Raw Output Tail
|344|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId1 is required] | 28|Success| |345|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId2 does not exist in Rolls table] | 37|Success| |346|[M2_SwapRollsetsRolls_Tests].[test Error: BottomRollId2 required when RollsetId2 provided] | 32|Success| |347|[M2_SwapRollsetsRolls_Tests].[test Error: Cannot swap rollsets in different sections] | 85|Success| |348|[M2_SwapRollsetsRolls_Tests].[test Error: Cannot swap rollsets in different stands] | 37|Success| |349|[M2_SwapRollsetsRolls_Tests].[test Error: Rollset1 must have both rolls assigned] | 36|Success| |350|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 and RollsetId2 must be different] | 33|Success| |351|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 does not exist] | 29|Success| |352|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId1 is required] | 49|Success| |353|[M2_SwapRollsetsRolls_Tests].[test Error: RollsetId2 does not exist] | 28|Success| |354|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId1 does not exist in Rolls table] | 33|Success| |355|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId1 is required] | 32|Success| |356|[M2_SwapRollsetsRolls_Tests].[test Error: TopRollId2 required when RollsetId2 provided] | 56|Success| |357|[M2_SwapRollsetsRolls_Tests].[test Success: Create new rollset with specified rolls] | 143|Success| |358|[M2_SwapRollsetsRolls_Tests].[test Success: Swap rolls between two rollsets] | 118|Success| |359|[M2_SwapRollsetsRolls_Tests].[test Success: Use any valid rolls] | 114|Success| |360|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Chain stops at matched barrier] | 73|Success| |361|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Matched events are immovable barriers] | 49|Success| |362|[M2_SyncCampaignsToProductionEvents_Tests].[test CASCADE: Updating IsMatched prevents future cascade] | 94|Success| |363|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: Multiple section changes create multiple events] | 61|Success| |364|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: ResolveEventCascade called for each group] | 57|Success| |365|[M2_SyncCampaignsToProductionEvents_Tests].[test COMPLEX: StatusCode K preserved when updating] | 86|Success| |366|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: Date filters work correctly] | 65|Success| |367|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: Empty campaigns table produces no events] | 61|Success| |368|[M2_SyncCampaignsToProductionEvents_Tests].[test EDGE CASE: No campaigns returns gracefully] | 45|Success| |369|[M2_SyncCampaignsToProductionEvents_Tests].[test FIXED: Dilates unmatched but not matched] | 73|Success| |370|[M2_SyncCampaignsToProductionEvents_Tests].[test FIXED: Does not dilate matched events] | 48|Success| |371|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Consecutive campaigns same section create single event] | 61|Success| |372|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Section change creates separate events] | 89|Success| |373|[M2_SyncCampaignsToProductionEvents_Tests].[test GROUPING: Single campaign creates single event] | 93|Success| |374|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Last group updates status P to I when matched] | 52|Success| |375|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Matched event updated with IsMatched = 1] | 62|Success| |376|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: New event created with IsMatched = 1] | 61|Success| |377|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Prevents duplicate events on resync] | 102|Success| |378|[M2_SyncCampaignsToProductionEvents_Tests].[test ISMATCHED: Unmatched future event matched in next run] | 61|Success| |379|[M2_SyncCampaignsToProductionEvents_Tests].[test LINKING: All campaigns in group linked to same event] | 86|Success| |380|[M2_SyncCampaignsToProductionEvents_Tests].[test LINKING: EventId preserved for already-linked campaigns] | 89|Success| |381|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Closest match selected when multiple exist] | 106|Success| |382|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Event expands with campaigns] | 118|Success| |383|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Event times adjust to campaigns] | 98|Success| |384|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Exact temporal overlap matches event] | 73|Success| |385|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Fallback respects section] | 56|Success| |386|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Fallback to next unmatched same section] | 82|Success| |387|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Inactive events not matched] | 57|Success| |388|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: New event created when no match found] | 61|Success| |389|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Proximity window 48h enforced] | 90|Success| |390|[M2_SyncCampaignsToProductionEvents_Tests].[test MATCHING: Proximity window matches close event] | 57|Success| |391|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: First sync detects production run start] | 90|Success| |392|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: Mixed matched and unmatched timeline] | 97|Success| |393|[M2_SyncCampaignsToProductionEvents_Tests].[test SMART START: Second sync continues from last matched event] | 77|Success| |394|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: Continuity maintained between groups] | 69|Success| |395|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: FirstBilletTimestamp is first campaign start] | 77|Success| |396|[M2_SyncCampaignsToProductionEvents_Tests].[test TIMESTAMPS: TrackedEnd is last campaign end] | 77|Success| |397|[M2_TensileRequirements_Tests].[test CorrectHeatGrades updates GradeId when swv-mes has different grade] | 28|Success| |398|[M2_TensileRequirements_Tests].[test Disposition fails if any retest sample fails] | 33|Success| |399|[M2_TensileRequirements_Tests].[test Disposition returns P when all samples pass] | 33|Success| |400|[M2_TensileRequirements_Tests].[test Disposition returns U when any sample fails] | 37|Success| |401|[M2_TensileRequirements_Tests].[test Disposition returns U when one of multiple samples fails] | 45|Success| |402|[M2_TensileRequirements_Tests].[test Disposition uses corrected grade after grade correction] | 37|Success| |403|[M2_TensileRequirements_Tests].[test Disposition uses latest sequence only - retest supersedes] | 36|Success| |404|[M2_TensileRequirements_Tests].[test Disposition uses version effective at report time] | 37|Success| |405|[M2_TensileRequirements_Tests].[test UpsertTensileRequirements creates new version] | 69|Success| |406|[M2_TensileRequirements_Tests].[test UpsertTensileRequirements throws error when EffectiveDate is NULL] | 20|Success| |407|[M2_TensileRequirements_Tests].[test UpsertTensileRequirements throws error when Rev is NULL] | 24|Success| |408|[M2_TensileRequirements_Tests].[test UpsertTensileRequirements throws error when Rows is invalid JSON] | 21|Success| |409|[M2_TensileRequirements_Tests].[test YieldPassed returns 0 when value above max] | 32|Success| |410|[M2_TensileRequirements_Tests].[test YieldPassed returns 0 when value below min] | 28|Success| |411|[M2_TensileRequirements_Tests].[test YieldPassed returns 1 when value in range] | 37|Success| |412|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob calculates cumulative start values] | 65|Success| |413|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob calculates metrics from billets] | 114|Success| |414|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob creates new campaign] | 89|Success| |415|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob only counts billets in time range] | 110|Success| |416|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob preserves offset values] | 94|Success| |417|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob skips deleted carriers] | 85|Success| |418|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob skips inactive passes] | 65|Success| |419|[M2_TrackPassCampaignsJob_Tests].[test TrackPassCampaignsJob updates existing campaign] | 69|Success| -------------------------------------------------------------------------------------------- Test Case Summary: 419 test case(s) executed, 419 succeeded, 0 skipped, 0 failed, 0 errored. --------------------------------------------------------------------------------------------