Removed async
This commit is contained in:
@@ -6,9 +6,8 @@ using mongomock for better integration testing.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import pytest_asyncio
|
||||
from bson import ObjectId
|
||||
from mongomock_motor import AsyncMongoMockClient
|
||||
from mongomock.mongo_client import MongoClient
|
||||
|
||||
from app.exceptions.job_exceptions import InvalidStatusTransitionError
|
||||
from app.models.job import ProcessingStatus
|
||||
@@ -16,17 +15,17 @@ from app.models.types import PyObjectId
|
||||
from app.services.job_service import JobService
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def in_memory_database():
|
||||
@pytest.fixture
|
||||
def in_memory_database():
|
||||
"""Create an in-memory database for testing."""
|
||||
client = AsyncMongoMockClient()
|
||||
client = MongoClient()
|
||||
return client.test_database
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def job_service(in_memory_database):
|
||||
@pytest.fixture
|
||||
def job_service(in_memory_database):
|
||||
"""Create JobService with in-memory repositories."""
|
||||
service = await JobService(in_memory_database).initialize()
|
||||
service = JobService(in_memory_database).initialize()
|
||||
return service
|
||||
|
||||
|
||||
@@ -45,8 +44,7 @@ def sample_task_id():
|
||||
class TestCreateJob:
|
||||
"""Tests for create_job method."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_create_job_with_task_id(
|
||||
def test_i_can_create_job_with_task_id(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -54,7 +52,7 @@ class TestCreateJob:
|
||||
):
|
||||
"""Test creating job with task ID."""
|
||||
# Execute
|
||||
result = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
result = job_service.create_job(sample_document_id, sample_task_id)
|
||||
|
||||
# Verify job creation
|
||||
assert result is not None
|
||||
@@ -66,22 +64,21 @@ class TestCreateJob:
|
||||
assert result.error_message is None
|
||||
|
||||
# Verify job exists in database
|
||||
job_in_db = await job_service.get_job_by_id(result.id)
|
||||
job_in_db = job_service.get_job_by_id(result.id)
|
||||
assert job_in_db is not None
|
||||
assert job_in_db.id == result.id
|
||||
assert job_in_db.document_id == sample_document_id
|
||||
assert job_in_db.task_id == sample_task_id
|
||||
assert job_in_db.status == ProcessingStatus.PENDING
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_create_job_without_task_id(
|
||||
def test_i_can_create_job_without_task_id(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id
|
||||
):
|
||||
"""Test creating job without task ID."""
|
||||
# Execute
|
||||
result = await job_service.create_job(sample_document_id)
|
||||
result = job_service.create_job(sample_document_id)
|
||||
|
||||
# Verify job creation
|
||||
assert result is not None
|
||||
@@ -96,8 +93,7 @@ class TestCreateJob:
|
||||
class TestGetJobMethods:
|
||||
"""Tests for job retrieval methods."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_get_job_by_id(
|
||||
def test_i_can_get_job_by_id(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -105,10 +101,10 @@ class TestGetJobMethods:
|
||||
):
|
||||
"""Test retrieving job by ID."""
|
||||
# Create a job first
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
|
||||
# Execute
|
||||
result = await job_service.get_job_by_id(created_job.id)
|
||||
result = job_service.get_job_by_id(created_job.id)
|
||||
|
||||
# Verify
|
||||
assert result is not None
|
||||
@@ -117,25 +113,24 @@ class TestGetJobMethods:
|
||||
assert result.task_id == created_job.task_id
|
||||
assert result.status == created_job.status
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_get_jobs_by_status(
|
||||
def test_i_can_get_jobs_by_status(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id
|
||||
):
|
||||
"""Test retrieving jobs by status."""
|
||||
# Create jobs with different statuses
|
||||
pending_job = await job_service.create_job(sample_document_id, "pending-task")
|
||||
pending_job = job_service.create_job(sample_document_id, "pending-task")
|
||||
|
||||
processing_job = await job_service.create_job(ObjectId(), "processing-task")
|
||||
await job_service.mark_job_as_started(processing_job.id)
|
||||
processing_job = job_service.create_job(ObjectId(), "processing-task")
|
||||
job_service.mark_job_as_started(processing_job.id)
|
||||
|
||||
completed_job = await job_service.create_job(ObjectId(), "completed-task")
|
||||
await job_service.mark_job_as_started(completed_job.id)
|
||||
await job_service.mark_job_as_completed(completed_job.id)
|
||||
completed_job = job_service.create_job(ObjectId(), "completed-task")
|
||||
job_service.mark_job_as_started(completed_job.id)
|
||||
job_service.mark_job_as_completed(completed_job.id)
|
||||
|
||||
# Execute - get pending jobs
|
||||
pending_results = await job_service.get_jobs_by_status(ProcessingStatus.PENDING)
|
||||
pending_results = job_service.get_jobs_by_status(ProcessingStatus.PENDING)
|
||||
|
||||
# Verify
|
||||
assert len(pending_results) == 1
|
||||
@@ -143,12 +138,12 @@ class TestGetJobMethods:
|
||||
assert pending_results[0].status == ProcessingStatus.PENDING
|
||||
|
||||
# Execute - get processing jobs
|
||||
processing_results = await job_service.get_jobs_by_status(ProcessingStatus.PROCESSING)
|
||||
processing_results = job_service.get_jobs_by_status(ProcessingStatus.PROCESSING)
|
||||
assert len(processing_results) == 1
|
||||
assert processing_results[0].status == ProcessingStatus.PROCESSING
|
||||
|
||||
# Execute - get completed jobs
|
||||
completed_results = await job_service.get_jobs_by_status(ProcessingStatus.COMPLETED)
|
||||
completed_results = job_service.get_jobs_by_status(ProcessingStatus.COMPLETED)
|
||||
assert len(completed_results) == 1
|
||||
assert completed_results[0].status == ProcessingStatus.COMPLETED
|
||||
|
||||
@@ -156,8 +151,7 @@ class TestGetJobMethods:
|
||||
class TestUpdateStatus:
|
||||
"""Tests for mark_job_as_started method."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_mark_pending_job_as_started(
|
||||
def test_i_can_mark_pending_job_as_started(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -165,11 +159,11 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test marking pending job as started (PENDING → PROCESSING)."""
|
||||
# Create a pending job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
assert created_job.status == ProcessingStatus.PENDING
|
||||
|
||||
# Execute
|
||||
result = await job_service.mark_job_as_started(created_job.id)
|
||||
result = job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Verify status transition
|
||||
assert result is not None
|
||||
@@ -177,11 +171,10 @@ class TestUpdateStatus:
|
||||
assert result.status == ProcessingStatus.PROCESSING
|
||||
|
||||
# Verify in database
|
||||
updated_job = await job_service.get_job_by_id(created_job.id)
|
||||
updated_job = job_service.get_job_by_id(created_job.id)
|
||||
assert updated_job.status == ProcessingStatus.PROCESSING
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_processing_job_as_started(
|
||||
def test_i_cannot_mark_processing_job_as_started(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -189,19 +182,18 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that processing job cannot be marked as started."""
|
||||
# Create and start a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Try to start it again
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.PROCESSING
|
||||
assert exc_info.value.target_status == ProcessingStatus.PROCESSING
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_completed_job_as_started(
|
||||
def test_i_cannot_mark_completed_job_as_started(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -209,20 +201,19 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that completed job cannot be marked as started."""
|
||||
# Create, start, and complete a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
await job_service.mark_job_as_completed(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Try to start it again
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.COMPLETED
|
||||
assert exc_info.value.target_status == ProcessingStatus.PROCESSING
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_failed_job_as_started(
|
||||
def test_i_cannot_mark_failed_job_as_started(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -230,20 +221,19 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that failed job cannot be marked as started."""
|
||||
# Create, start, and fail a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
await job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
|
||||
# Try to start it again
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.FAILED
|
||||
assert exc_info.value.target_status == ProcessingStatus.PROCESSING
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_mark_processing_job_as_completed(
|
||||
def test_i_can_mark_processing_job_as_completed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -251,11 +241,11 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test marking processing job as completed (PROCESSING → COMPLETED)."""
|
||||
# Create and start a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
started_job = await job_service.mark_job_as_started(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
started_job = job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Execute
|
||||
result = await job_service.mark_job_as_completed(created_job.id)
|
||||
result = job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Verify status transition
|
||||
assert result is not None
|
||||
@@ -263,11 +253,10 @@ class TestUpdateStatus:
|
||||
assert result.status == ProcessingStatus.COMPLETED
|
||||
|
||||
# Verify in database
|
||||
updated_job = await job_service.get_job_by_id(created_job.id)
|
||||
updated_job = job_service.get_job_by_id(created_job.id)
|
||||
assert updated_job.status == ProcessingStatus.COMPLETED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_pending_job_as_completed(
|
||||
def test_i_cannot_mark_pending_job_as_completed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -275,18 +264,17 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that pending job cannot be marked as completed."""
|
||||
# Create a pending job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
|
||||
# Try to complete it directly
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_completed(created_job.id)
|
||||
job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.PENDING
|
||||
assert exc_info.value.target_status == ProcessingStatus.COMPLETED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_completed_job_as_completed(
|
||||
def test_i_cannot_mark_completed_job_as_completed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -294,20 +282,19 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that completed job cannot be marked as completed again."""
|
||||
# Create, start, and complete a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
await job_service.mark_job_as_completed(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Try to complete it again
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_completed(created_job.id)
|
||||
job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.COMPLETED
|
||||
assert exc_info.value.target_status == ProcessingStatus.COMPLETED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_failed_job_as_completed(
|
||||
def test_i_cannot_mark_failed_job_as_completed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -315,20 +302,19 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that failed job cannot be marked as completed."""
|
||||
# Create, start, and fail a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
await job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
|
||||
# Try to complete it
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_completed(created_job.id)
|
||||
job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.FAILED
|
||||
assert exc_info.value.target_status == ProcessingStatus.COMPLETED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_mark_processing_job_as_failed_with_error_message(
|
||||
def test_i_can_mark_processing_job_as_failed_with_error_message(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -336,13 +322,13 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test marking processing job as failed with error message."""
|
||||
# Create and start a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
started_job = await job_service.mark_job_as_started(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
started_job = job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
error_message = "Processing failed due to invalid file format"
|
||||
|
||||
# Execute
|
||||
result = await job_service.mark_job_as_failed(created_job.id, error_message)
|
||||
result = job_service.mark_job_as_failed(created_job.id, error_message)
|
||||
|
||||
# Verify status transition
|
||||
assert result is not None
|
||||
@@ -351,12 +337,11 @@ class TestUpdateStatus:
|
||||
assert result.error_message == error_message
|
||||
|
||||
# Verify in database
|
||||
updated_job = await job_service.get_job_by_id(created_job.id)
|
||||
updated_job = job_service.get_job_by_id(created_job.id)
|
||||
assert updated_job.status == ProcessingStatus.FAILED
|
||||
assert updated_job.error_message == error_message
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_mark_processing_job_as_failed_without_error_message(
|
||||
def test_i_can_mark_processing_job_as_failed_without_error_message(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -364,19 +349,18 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test marking processing job as failed without error message."""
|
||||
# Create and start a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
|
||||
# Execute without error message
|
||||
result = await job_service.mark_job_as_failed(created_job.id)
|
||||
result = job_service.mark_job_as_failed(created_job.id)
|
||||
|
||||
# Verify status transition
|
||||
assert result is not None
|
||||
assert result.status == ProcessingStatus.FAILED
|
||||
assert result.error_message is None
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_pending_job_as_failed(
|
||||
def test_i_cannot_mark_pending_job_as_failed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -384,18 +368,17 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that pending job cannot be marked as failed."""
|
||||
# Create a pending job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
|
||||
# Try to fail it directly
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.PENDING
|
||||
assert exc_info.value.target_status == ProcessingStatus.FAILED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_completed_job_as_failed(
|
||||
def test_i_cannot_mark_completed_job_as_failed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -403,20 +386,19 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that completed job cannot be marked as failed."""
|
||||
# Create, start, and complete a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
await job_service.mark_job_as_completed(created_job.id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_completed(created_job.id)
|
||||
|
||||
# Try to fail it
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
job_service.mark_job_as_failed(created_job.id, "Test error")
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.COMPLETED
|
||||
assert exc_info.value.target_status == ProcessingStatus.FAILED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_mark_failed_job_as_failed(
|
||||
def test_i_cannot_mark_failed_job_as_failed(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -424,13 +406,13 @@ class TestUpdateStatus:
|
||||
):
|
||||
"""Test that failed job cannot be marked as failed again."""
|
||||
# Create, start, and fail a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
await job_service.mark_job_as_started(created_job.id)
|
||||
await job_service.mark_job_as_failed(created_job.id, "First error")
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
job_service.mark_job_as_started(created_job.id)
|
||||
job_service.mark_job_as_failed(created_job.id, "First error")
|
||||
|
||||
# Try to fail it again
|
||||
with pytest.raises(InvalidStatusTransitionError) as exc_info:
|
||||
await job_service.mark_job_as_failed(created_job.id, "Second error")
|
||||
job_service.mark_job_as_failed(created_job.id, "Second error")
|
||||
|
||||
# Verify exception details
|
||||
assert exc_info.value.current_status == ProcessingStatus.FAILED
|
||||
@@ -440,8 +422,7 @@ class TestUpdateStatus:
|
||||
class TestDeleteJob:
|
||||
"""Tests for delete_job method."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_can_delete_existing_job(
|
||||
def test_i_can_delete_existing_job(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -449,30 +430,29 @@ class TestDeleteJob:
|
||||
):
|
||||
"""Test deleting an existing job."""
|
||||
# Create a job
|
||||
created_job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
created_job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
|
||||
# Verify job exists
|
||||
job_before_delete = await job_service.get_job_by_id(created_job.id)
|
||||
job_before_delete = job_service.get_job_by_id(created_job.id)
|
||||
assert job_before_delete is not None
|
||||
|
||||
# Execute deletion
|
||||
result = await job_service.delete_job(created_job.id)
|
||||
result = job_service.delete_job(created_job.id)
|
||||
|
||||
# Verify deletion
|
||||
assert result is True
|
||||
|
||||
# Verify job no longer exists
|
||||
deleted_job = await job_service.get_job_by_id(created_job.id)
|
||||
deleted_job = job_service.get_job_by_id(created_job.id)
|
||||
assert deleted_job is None
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_i_cannot_delete_nonexistent_job(
|
||||
def test_i_cannot_delete_nonexistent_job(
|
||||
self,
|
||||
job_service
|
||||
):
|
||||
"""Test deleting a nonexistent job returns False."""
|
||||
# Execute deletion with random ObjectId
|
||||
result = await job_service.delete_job(ObjectId())
|
||||
result = job_service.delete_job(ObjectId())
|
||||
|
||||
# Verify
|
||||
assert result is False
|
||||
@@ -481,8 +461,7 @@ class TestDeleteJob:
|
||||
class TestStatusTransitionValidation:
|
||||
"""Tests for status transition validation across different scenarios."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_valid_job_lifecycle_flow(
|
||||
def test_valid_job_lifecycle_flow(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -490,19 +469,18 @@ class TestStatusTransitionValidation:
|
||||
):
|
||||
"""Test complete valid job lifecycle: PENDING → PROCESSING → COMPLETED."""
|
||||
# Create job (PENDING)
|
||||
job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
assert job.status == ProcessingStatus.PENDING
|
||||
|
||||
# Start job (PENDING → PROCESSING)
|
||||
started_job = await job_service.mark_job_as_started(job.id)
|
||||
started_job = job_service.mark_job_as_started(job.id)
|
||||
assert started_job.status == ProcessingStatus.PROCESSING
|
||||
|
||||
# Complete job (PROCESSING → COMPLETED)
|
||||
completed_job = await job_service.mark_job_as_completed(job.id)
|
||||
completed_job = job_service.mark_job_as_completed(job.id)
|
||||
assert completed_job.status == ProcessingStatus.COMPLETED
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_valid_job_failure_flow(
|
||||
def test_valid_job_failure_flow(
|
||||
self,
|
||||
job_service,
|
||||
sample_document_id,
|
||||
@@ -510,69 +488,31 @@ class TestStatusTransitionValidation:
|
||||
):
|
||||
"""Test valid job failure: PENDING → PROCESSING → FAILED."""
|
||||
# Create job (PENDING)
|
||||
job = await job_service.create_job(sample_document_id, sample_task_id)
|
||||
job = job_service.create_job(sample_document_id, sample_task_id)
|
||||
assert job.status == ProcessingStatus.PENDING
|
||||
|
||||
# Start job (PENDING → PROCESSING)
|
||||
started_job = await job_service.mark_job_as_started(job.id)
|
||||
started_job = job_service.mark_job_as_started(job.id)
|
||||
assert started_job.status == ProcessingStatus.PROCESSING
|
||||
|
||||
# Fail job (PROCESSING → FAILED)
|
||||
failed_job = await job_service.mark_job_as_failed(job.id, "Test failure")
|
||||
failed_job = job_service.mark_job_as_failed(job.id, "Test failure")
|
||||
assert failed_job.status == ProcessingStatus.FAILED
|
||||
assert failed_job.error_message == "Test failure"
|
||||
|
||||
|
||||
class TestEdgeCases:
|
||||
"""Tests for edge cases and error conditions."""
|
||||
#
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_multiple_jobs_for_same_file(
|
||||
# self,
|
||||
# job_service,
|
||||
# sample_document_id
|
||||
# ):
|
||||
# """Test handling multiple jobs for the same file."""
|
||||
# # Create multiple jobs for same file
|
||||
# job1 = await job_service.create_job(sample_document_id, "task-1")
|
||||
# job2 = await job_service.create_job(sample_document_id, "task-2")
|
||||
# job3 = await job_service.create_job(sample_document_id, "task-3")
|
||||
#
|
||||
# # Verify all jobs exist and are independent
|
||||
# jobs_for_file = await job_service.get_jobs_by_file_id(sample_document_id)
|
||||
# assert len(jobs_for_file) == 3
|
||||
#
|
||||
# job_ids = [job.id for job in jobs_for_file]
|
||||
# assert job1.id in job_ids
|
||||
# assert job2.id in job_ids
|
||||
# assert job3.id in job_ids
|
||||
#
|
||||
# # Verify status transitions work independently
|
||||
# await job_service.mark_job_as_started(job1.id)
|
||||
# await job_service.mark_job_as_completed(job1.id)
|
||||
#
|
||||
# # Other jobs should still be pending
|
||||
# updated_job2 = await job_service.get_job_by_id(job2.id)
|
||||
# updated_job3 = await job_service.get_job_by_id(job3.id)
|
||||
#
|
||||
# assert updated_job2.status == ProcessingStatus.PENDING
|
||||
# assert updated_job3.status == ProcessingStatus.PENDING
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_job_operations_with_empty_database(
|
||||
def test_job_operations_with_empty_database(
|
||||
self,
|
||||
job_service
|
||||
):
|
||||
"""Test job operations when database is empty."""
|
||||
# Try to get nonexistent job
|
||||
result = await job_service.get_job_by_id(ObjectId())
|
||||
result = job_service.get_job_by_id(ObjectId())
|
||||
assert result is None
|
||||
|
||||
|
||||
# Try to get jobs by status when none exist
|
||||
pending_jobs = await job_service.get_jobs_by_status(ProcessingStatus.PENDING)
|
||||
pending_jobs = job_service.get_jobs_by_status(ProcessingStatus.PENDING)
|
||||
assert pending_jobs == []
|
||||
|
||||
# Try to delete nonexistent job
|
||||
delete_result = await job_service.delete_job(ObjectId())
|
||||
delete_result = job_service.delete_job(ObjectId())
|
||||
assert delete_result is False
|
||||
|
||||
Reference in New Issue
Block a user