diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..023f20b --- /dev/null +++ b/app/models.py @@ -0,0 +1,48 @@ +import secrets +from datetime import datetime, timezone +from enum import Enum + +from pydantic import BaseModel, Field + + +class JobStatus(str, Enum): + QUEUED = "queued" + RUNNING = "running" + COMPLETED = "completed" + FAILED = "failed" + + +class Progress(BaseModel): + frame: int = 0 + fps: float = 0.0 + time: str = "00:00:00.00" + bitrate: str = "0kbits/s" + percent: float | None = None + + +class Job(BaseModel): + id: str = Field(default_factory=lambda: f"job_{secrets.token_hex(8)}") + status: JobStatus = JobStatus.QUEUED + command: str + created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + started_at: datetime | None = None + completed_at: datetime | None = None + progress: Progress | None = None + output_files: list[str] = Field(default_factory=list) + error: str | None = None + + +class CreateJobRequest(BaseModel): + command: str + + +class JobResponse(BaseModel): + id: str + status: JobStatus + command: str + created_at: datetime + started_at: datetime | None = None + completed_at: datetime | None = None + progress: Progress | None = None + output_files: list[str] = Field(default_factory=list) + error: str | None = None diff --git a/requirements.txt b/requirements.txt index 165ed8a..b98e9b1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -fastapi==0.115.0 -uvicorn[standard]==0.32.0 -pydantic==2.9.0 +fastapi==0.123.0 +uvicorn[standard]==0.38.0 +pydantic==2.12.5 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-314.pyc b/tests/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..41aae9a Binary files /dev/null and b/tests/__pycache__/__init__.cpython-314.pyc differ diff --git a/tests/__pycache__/test_models.cpython-314-pytest-9.0.1.pyc b/tests/__pycache__/test_models.cpython-314-pytest-9.0.1.pyc new file mode 100644 index 0000000..79eeefe Binary files /dev/null and b/tests/__pycache__/test_models.cpython-314-pytest-9.0.1.pyc differ diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..0189ca7 --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,31 @@ +from datetime import datetime + +from app.models import Job, JobStatus, CreateJobRequest, JobResponse + + +def test_job_creation(): + job = Job(command="-i input.mp4 output.mp4") + + assert job.id.startswith("job_") + assert len(job.id) == 20 # job_ + 16 hex chars + assert job.status == JobStatus.QUEUED + assert job.command == "-i input.mp4 output.mp4" + assert isinstance(job.created_at, datetime) + assert job.started_at is None + assert job.completed_at is None + assert job.progress is None + assert job.output_files == [] + assert job.error is None + + +def test_create_job_request(): + request = CreateJobRequest(command="-i test.mp4 out.mp4") + assert request.command == "-i test.mp4 out.mp4" + + +def test_job_response_from_job(): + job = Job(command="-i input.mp4 output.mp4") + response = JobResponse.model_validate(job.model_dump()) + + assert response.id == job.id + assert response.status == JobStatus.QUEUED