feat(discovery): persist video duration_s instead of discarding it (ADR-028)
ADR-023's filterLowValue already fetches each candidate's duration via the cheap videos.list quota call to drop Shorts/live, then threw it away — the videos.duration_s column (migration 001) was never written. Carry it onto the kept domain.Video and have UpsertVideo persist it, COALESCE-preserving a known value so an unknown (0) re-upsert never clobbers it (the channel_title backfill stance, migration 014). This is the enabling change for length-aware burst selection. No new migration — the column already exists.
This commit is contained in:
@@ -52,6 +52,36 @@ func TestUpsertVideo_ReturnsStableID(t *testing.T) {
|
||||
require.Equal(t, 1, count, "must not duplicate the row")
|
||||
}
|
||||
|
||||
func TestUpsertVideo_PersistsAndPreservesDuration(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
s := newStore(t)
|
||||
resetDB(t, rawPool(t))
|
||||
|
||||
// First upsert carries a known duration (ADR-028: discovery enriches it).
|
||||
v := ytVideo(userA, "dur0000001x", "with duration")
|
||||
v.DurationSeconds = 750
|
||||
id, err := s.UpsertVideo(ctx, v)
|
||||
require.NoError(t, err)
|
||||
|
||||
p := rawPool(t)
|
||||
readDuration := func() *int {
|
||||
var d *int
|
||||
require.NoError(t, p.QueryRow(ctx, `SELECT duration_s FROM videos WHERE id = $1`, id).Scan(&d))
|
||||
return d
|
||||
}
|
||||
require.NotNil(t, readDuration())
|
||||
require.Equal(t, 750, *readDuration(), "duration must persist")
|
||||
|
||||
// A later upsert that does NOT know the duration (0) must not clobber it —
|
||||
// the channel_title backfill stance (migration 014): COALESCE-preserve.
|
||||
v2 := ytVideo(userA, "dur0000001x", "title updated, duration unknown")
|
||||
v2.DurationSeconds = 0
|
||||
_, err = s.UpsertVideo(ctx, v2)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, readDuration(), "a 0/unknown re-upsert must not erase a known duration")
|
||||
require.Equal(t, 750, *readDuration())
|
||||
}
|
||||
|
||||
func TestUpsertVideo_IDMatchesSummaryDedup(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
s := newStore(t)
|
||||
|
||||
Reference in New Issue
Block a user