- FastAPI + PostgreSQL + Alembic + React/Vite skeleton, Docker Compose, healthcheck - Google OAuth (single allowed account), encrypted refresh token storage - Subscriptions sync with pagination, uploads playlist batch fetch - Categories CRUD, many-to-many channel assignment, category filtering - Video sync (playlistItems + videos.list batching), cached feed with cursor pagination, background scheduler (APScheduler) - Video detail page with YouTube embed player - SPA fallback routing, optimistic UI updates, client-side query caching 40 backend tests covering OAuth allow-list, sync idempotency, cascade deletes, cursor pagination, and category filtering. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
20 lines
459 B
Python
20 lines
459 B
Python
import pytest
|
|
|
|
from app.core.duration import parse_iso8601_duration
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"value,expected",
|
|
[
|
|
("PT18M42S", 18 * 60 + 42),
|
|
("PT1H2M3S", 3600 + 120 + 3),
|
|
("PT45S", 45),
|
|
("PT5M", 300),
|
|
("P1DT2H", 86400 + 7200),
|
|
(None, None),
|
|
("", None),
|
|
("garbage", None),
|
|
],
|
|
)
|
|
def test_parse_iso8601_duration(value, expected):
|
|
assert parse_iso8601_duration(value) == expected
|