From eb55c7d9d18b3b0e1332624385e88fa0fb8a40c0 Mon Sep 17 00:00:00 2001 From: Mathias Date: Thu, 1 Oct 2026 18:42:13 +0200 Subject: [PATCH] test(store): had_video is recorded on creation and survives done/failed (red) Red: CreateUpload takes no hadVideo and the row has no HadVideo. Co-Authored-By: Claude Sonnet 5.5 --- .../store/uploaded_transcripts_test.go | 66 +++++++++++++++---- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/internal/adapters/store/uploaded_transcripts_test.go b/internal/adapters/store/uploaded_transcripts_test.go index 38d3726..a313468 100644 --- a/internal/adapters/store/uploaded_transcripts_test.go +++ b/internal/adapters/store/uploaded_transcripts_test.go @@ -33,7 +33,7 @@ func TestCreateUpload_StartsQueuedAndIsOwnedByTheCreator(t *testing.T) { seedUsers(t, userA) ctx := context.Background() - id, err := s.CreateUpload(ctx, userA, "Teams export") + id, err := s.CreateUpload(ctx, userA, "Teams export", false) require.NoError(t, err) got, err := s.GetUpload(ctx, userA, id) @@ -50,7 +50,7 @@ func TestUploadLifecycle_CompletedKeepsTextSegmentsEndpointAndDuration(t *testin s := newStore(t) seedUsers(t, userA) ctx := context.Background() - id, err := s.CreateUpload(ctx, userA, "m") + id, err := s.CreateUpload(ctx, userA, "m", false) require.NoError(t, err) require.NoError(t, s.StartTranscribing(ctx, userA, id)) @@ -84,7 +84,7 @@ func TestUploadLifecycle_FailedRecordsTypedKindAndNoContent(t *testing.T) { s := newStore(t) seedUsers(t, userA) ctx := context.Background() - id, err := s.CreateUpload(ctx, userA, "m") + id, err := s.CreateUpload(ctx, userA, "m", false) require.NoError(t, err) require.NoError(t, s.StartTranscribing(ctx, userA, id)) @@ -102,7 +102,7 @@ func TestGetUpload_AnotherUsersIDIsNotFound(t *testing.T) { s := newStore(t) seedUsers(t, userA, userB) ctx := context.Background() - id, err := s.CreateUpload(ctx, userA, "A's meeting") + id, err := s.CreateUpload(ctx, userA, "A's meeting", false) require.NoError(t, err) _, err = s.GetUpload(ctx, userB, id) @@ -115,7 +115,7 @@ func TestUploadWrites_ByAnotherUserChangeNothing(t *testing.T) { s := newStore(t) seedUsers(t, userA, userB) ctx := context.Background() - id, err := s.CreateUpload(ctx, userA, "A's meeting") + id, err := s.CreateUpload(ctx, userA, "A's meeting", false) require.NoError(t, err) assert.ErrorIs(t, s.StartTranscribing(ctx, userB, id), store.ErrUploadNotFound) @@ -132,11 +132,11 @@ func TestListUploads_ReturnsOnlyTheCallersNewestFirstWithoutTranscriptText(t *te s := newStore(t) seedUsers(t, userA, userB) ctx := context.Background() - first, err := s.CreateUpload(ctx, userA, "first") + first, err := s.CreateUpload(ctx, userA, "first", false) require.NoError(t, err) - second, err := s.CreateUpload(ctx, userA, "second") + second, err := s.CreateUpload(ctx, userA, "second", false) require.NoError(t, err) - _, err = s.CreateUpload(ctx, userB, "B's") + _, err = s.CreateUpload(ctx, userB, "B's", false) require.NoError(t, err) require.NoError(t, s.StartTranscribing(ctx, userA, first)) require.NoError(t, s.CompleteUpload(ctx, userA, first, domain.Transcription{Text: "long text body", Endpoint: "e"})) @@ -160,12 +160,12 @@ func TestFailInterruptedUploads_FailsOnlyUnfinishedRowsForEveryUser(t *testing.T _, err := super.Exec(ctx, `INSERT INTO user_identities (dex_subject, user_id) VALUES ($1, $2)`, subject, uid) require.NoError(t, err) } - queued, err := s.CreateUpload(ctx, userA, "queued") + queued, err := s.CreateUpload(ctx, userA, "queued", false) require.NoError(t, err) - running, err := s.CreateUpload(ctx, userB, "running") + running, err := s.CreateUpload(ctx, userB, "running", false) require.NoError(t, err) require.NoError(t, s.StartTranscribing(ctx, userB, running)) - done, err := s.CreateUpload(ctx, userA, "done") + done, err := s.CreateUpload(ctx, userA, "done", false) require.NoError(t, err) require.NoError(t, s.StartTranscribing(ctx, userA, done)) require.NoError(t, s.CompleteUpload(ctx, userA, done, domain.Transcription{Text: "kept", Endpoint: "e"})) @@ -186,3 +186,47 @@ func TestFailInterruptedUploads_FailsOnlyUnfinishedRowsForEveryUser(t *testing.T assert.Equal(t, domain.UploadDone, kept.Status, "a finished transcript must survive the sweep") assert.Equal(t, "kept", kept.Content) } + +func TestCreateUpload_RecordsWhetherTheFileHadAVideoTrack(t *testing.T) { + s := newStore(t) + seedUsers(t, userA) + ctx := context.Background() + withVideo, err := s.CreateUpload(ctx, userA, "camera off", true) + require.NoError(t, err) + audioOnly, err := s.CreateUpload(ctx, userA, "voice only", false) + require.NoError(t, err) + + gotVideo, err := s.GetUpload(ctx, userA, withVideo) + require.NoError(t, err) + gotAudio, err := s.GetUpload(ctx, userA, audioOnly) + require.NoError(t, err) + listed, err := s.ListUploads(ctx, userA) + require.NoError(t, err) + + assert.True(t, gotVideo.HadVideo, "the page must be able to say the video was ignored") + assert.False(t, gotAudio.HadVideo) + byID := map[string]bool{} + for _, u := range listed { + byID[u.ID] = u.HadVideo + } + assert.Equal(t, map[string]bool{withVideo: true, audioOnly: false}, byID, "the list carries it too") +} + +func TestUploadHadVideo_SurvivesCompletionAndFailure(t *testing.T) { + s := newStore(t) + seedUsers(t, userA) + ctx := context.Background() + done, err := s.CreateUpload(ctx, userA, "d", true) + require.NoError(t, err) + failed, err := s.CreateUpload(ctx, userA, "f", true) + require.NoError(t, err) + require.NoError(t, s.StartTranscribing(ctx, userA, done)) + require.NoError(t, s.CompleteUpload(ctx, userA, done, domain.Transcription{Text: "x", Endpoint: "e"})) + require.NoError(t, s.FailUpload(ctx, userA, failed, domain.UploadErrTranscriptionFailed)) + + for _, id := range []string{done, failed} { + got, err := s.GetUpload(ctx, userA, id) + require.NoError(t, err) + assert.True(t, got.HadVideo, "completing or failing must not clear it: the notice outlives the job") + } +}