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:
@@ -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
|
||||
)
|
||||
|
||||
45
backend/tests/test_downloads.py
Normal file
45
backend/tests/test_downloads.py
Normal 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
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user