The fixture's pad_until_exact targeted 10:00, which the 15- and 30-minute items reached exactly, so the engine's trim branch never ran and mutating `engine.PadUntilExact(..., request.Trim, ...)` to `false` left every controller test green -- measured on the pre-change fixture, `Passed! - Failed: 0, Passed: 9`. The target moves to 09:55, off every content boundary: Movie 01 is now trimmed from 30 minutes to 25, the snapshot is re-pinned around it, and the same mutant fails Committed_Script_Fixture_Produces_The_Pinned_Snapshot while the sibling add_duration mutant still does. The trimmed span and OutPoint are asserted directly rather than resting on the snapshot alone, and the fixture and the snapshot comment both record that landing a trimming instruction on a content boundary is what silences its trim flag. ApiJsonSettings.Create() was documented as a standalone serializer configured the way MVC's is, which measurement refutes: Apply runs against a bare JsonSerializerSettings rather than the one MvcNewtonsoftJsonOptions pre-configures, so MaxDepth stays at Newtonsoft's 64 instead of MVC's 32 and ProblemDetailsConverter and ValidationProblemDetailsConverter are absent (MissingMemberHandling, TypeNameHandling and DateParseHandling do match). Neither gap can reach a scripted request body -- two levels of nesting, never a ProblemDetails -- so this was overstated prose, not a broken test. Restating the delta everywhere parity was claimed would leave four copies to rot, so ApiJsonSettingsTests pins it in both directions and the prose points at the pin. Also clears the three nullable warnings the replayer helpers introduced (CS8600/CS8604 on the action string, CS8603 on Bind<T>) and corrects the ExpectedSnapshot comment, whose last column is built from MediaItemId rather than looked up from the seeded title. Refs #563 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015QqCpYFsKgnAnx6jVwrKiV
53 lines
1.7 KiB
JSON
53 lines
1.7 KiB
JSON
{
|
|
"description": "Committed stand-in for a user-authored scripted schedule: the ordered sequence of calls such a script makes against /api/v1/scripted/playout/build/{buildId}, replayed through the real ScriptedScheduleController by ScriptedScheduleControllerTests. Field names and casing match what the HTTP body binder accepts \u2014 the replay deserializes each body with ApiJsonSettings, the configuration Startup applies to AddNewtonsoftJson. Deliberately avoids wait_until / pad_until / pad_to_next (local day and time-of-day) and shuffle order, which would make the pinned snapshot machine-timezone- or seed-dependent. add_duration and pad_until_exact both end BETWEEN two content boundaries on purpose: an instruction that happens to end on one never reaches the engine's trim branch, and its trim flag is then witnessed by nothing.",
|
|
"script": [
|
|
{
|
|
"action": "add_collection",
|
|
"body": {
|
|
"key": "content",
|
|
"collection": "Test Collection",
|
|
"order": "chronological"
|
|
}
|
|
},
|
|
{
|
|
"action": "start_epg_group",
|
|
"body": {
|
|
"advance": true,
|
|
"customTitle": "Morning Block"
|
|
}
|
|
},
|
|
{
|
|
"action": "add_count",
|
|
"body": {
|
|
"content": "content",
|
|
"count": 2
|
|
}
|
|
},
|
|
{
|
|
"action": "stop_epg_group"
|
|
},
|
|
{
|
|
"action": "add_duration",
|
|
"body": {
|
|
"content": "content",
|
|
"duration": "2:00:00",
|
|
"trim": true
|
|
}
|
|
},
|
|
{
|
|
"action": "pad_until_exact",
|
|
"body": {
|
|
"content": "content",
|
|
"when": "2026-01-15T09:55:00+00:00",
|
|
"trim": true
|
|
}
|
|
},
|
|
{
|
|
"action": "add_all",
|
|
"body": {
|
|
"content": "content"
|
|
}
|
|
}
|
|
]
|
|
}
|