fix: use BigInteger for size_bytes to support files >2 GB

Fixes psycopg2 NumericValueOutOfRange when mock provider returns
size_bytes=4_000_000_000. Adds regression test for >2.15 GB payload.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Paperclip Agent
2026-06-13 20:10:55 +02:00
parent 54c9ece5a0
commit 281ce7f9e4
3 changed files with 49 additions and 4 deletions

View File

@@ -1,6 +1,6 @@
import enum
from datetime import datetime
from sqlalchemy import String, Integer, Float, DateTime, Enum as SAEnum, func
from sqlalchemy import String, Integer, BigInteger, Float, DateTime, Enum as SAEnum, func
from sqlalchemy.orm import Mapped, mapped_column
from .database import Base
@@ -23,7 +23,7 @@ class Download(Base):
provider: Mapped[str] = mapped_column(String(100))
quality: Mapped[str | None] = mapped_column(String(50), nullable=True)
language: Mapped[str | None] = mapped_column(String(50), nullable=True)
size_bytes: Mapped[int | None] = mapped_column(Integer, nullable=True)
size_bytes: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
status: Mapped[DownloadStatus] = mapped_column(
SAEnum(DownloadStatus), default=DownloadStatus.pending
)

View File

@@ -0,0 +1,45 @@
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from src.database import Base
from src.main import app, get_db
engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base.metadata.create_all(bind=engine)
def override_get_db():
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
client = TestClient(app)
def test_create_download_accepts_mock_provider_size_bytes():
response = client.post(
"/api/downloads",
json={
"title": "inception (Mock Result 1)",
"url": "mock://inception/1",
"provider": "mock",
"quality": "1080p",
"language": "en",
"size_bytes": 4_000_000_000,
},
)
assert response.status_code == 201
assert response.json()["size_bytes"] == 4_000_000_000

View File

@@ -7,7 +7,7 @@ import time
import logging
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session, DeclarativeBase, Mapped, mapped_column
from sqlalchemy import String, Integer, Float, DateTime, Enum as SAEnum, func
from sqlalchemy import String, Integer, BigInteger, Float, DateTime, Enum as SAEnum, func
import enum
from pydantic_settings import BaseSettings
@@ -50,7 +50,7 @@ class Download(Base):
provider: Mapped[str] = mapped_column(String(100))
quality: Mapped[str | None] = mapped_column(String(50), nullable=True)
language: Mapped[str | None] = mapped_column(String(50), nullable=True)
size_bytes: Mapped[int | None] = mapped_column(Integer, nullable=True)
size_bytes: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
status: Mapped[DownloadStatus] = mapped_column(
SAEnum(DownloadStatus), default=DownloadStatus.pending
)