package services import ( "testing" ) // TestAudioPayloadIsEmpty pins the write-after-success guard on // updateAudioBookItem (2026-10-21 incident: multi-file audiobooks // surfaced as 1 second long because a failed re-extraction overwrote a // populated audio_metadata). An empty payload — nil, or no tracks, no // chapters, no duration — is the signature of a failed extraction and // must never replace existing audio data. func TestAudioPayloadIsEmpty(t *testing.T) { require := func(cond bool, msg string) { if !cond { t.Fatal(msg) } } require(audioPayloadIsEmpty(nil), "nil payload must read as empty") require(audioPayloadIsEmpty(&AudioMetadataPayload{}), "zero-value payload must read as empty") require(audioPayloadIsEmpty(&AudioMetadataPayload{DurationSeconds: 0}), "zero-duration payload must read as empty") // A real book always carries at least one of the audio facts. require(!audioPayloadIsEmpty(&AudioMetadataPayload{DurationSeconds: 302.6}), "duration-only payload (single-track book) is not empty") require(!audioPayloadIsEmpty(&AudioMetadataPayload{ Tracks: []AudioTrack{{Index: 0, Path: "01.mp3"}}, }), "track manifest is not empty") require(!audioPayloadIsEmpty(&AudioMetadataPayload{ Chapters: []AudioChapter{{Index: 0, Title: "Chapter 1"}}, }), "chapters are not empty") }