"""Tests for the jobs model layer.""" from datetime import datetime from zoneinfo import ZoneInfo import pytest from vectororder.exceptions import JobNotFoundError from vectororder.models import job_model from vectororder.models.schemas import DeliveryType, EncodingOrderType, Job, JobStatus from tests.test_utils.db import create_delivery_history, create_job @pytest.fixture def job_ids() -> list[int]: """Return fake ids.""" return [1, 2, 3] def test_get_jobs_duplicates(job_ids: list[int], init_db_tables: None) -> None: """Test get_jobs_duplicates function.""" result = job_model.get_jobs_duplicates(job_ids) assert result == [] def test_get_jobs(init_db_tables: None) -> None: """Test get_jobs function.""" create_job( encoding_started=datetime( 2025, 6, 17, 13, 25, 30, tzinfo=ZoneInfo("America/New_York"), ), delivery_started=datetime( 2025, 6, 17, 14, 25, 32, tzinfo=ZoneInfo("America/New_York"), ), ) result = job_model.get_jobs([456]) assert result == { 456: Job( job_id=456, upc=199066946312, store_id=286, delivery_type=DeliveryType.METADATA_UPDATE, encoding_order_type=EncodingOrderType.RELEASE, status=JobStatus.READY_TO_ENCODE, encoding_started=datetime.strptime( "2025-06-17 13:25:30", "%Y-%m-%d %H:%M:%S" ), # datetime column is not timezone aware delivery_started=datetime.strptime( "2025-06-17 14:25:32", "%Y-%m-%d %H:%M:%S" ), # datetime column is not timezone aware ), } def test_set_reencode(job_ids: list[int], init_db_tables: None) -> None: """Test set_reencode function.""" job_model.set_reencode(job_ids) assert True def test_set_redeliver(job_ids: list[int], init_db_tables: None) -> None: """Test set_redeliver function.""" job_model.set_redeliver(job_ids) assert True def test_set_cancel(job_ids: list[int], init_db_tables: None) -> None: """Test set_cancel function.""" job_model.set_cancel(job_ids) assert True @pytest.mark.parametrize( ( "test_description", "job_id", "meta_update", "expect_raises", "expected_result", ), [ ( "N translates to COMPLETE_ALBUM", 456, "N", False, Job( job_id=456, upc=199066946312, store_id=286, delivery_type=DeliveryType.COMPLETE_ALBUM, encoding_order_type=EncodingOrderType.RELEASE, status=JobStatus.READY_TO_ENCODE, encoding_started=datetime.strptime( "2025-07-04 01:03:37", "%Y-%m-%d %H:%M:%S" ), delivery_started=datetime.strptime( "2025-07-04 01:03:37", "%Y-%m-%d %H:%M:%S" ), ), ), ( "Y translates to METADATA_UPDATE", 456, "Y", False, Job( job_id=456, upc=199066946312, store_id=286, delivery_type=DeliveryType.METADATA_UPDATE, encoding_order_type=EncodingOrderType.RELEASE, status=JobStatus.READY_TO_ENCODE, encoding_started=datetime.strptime( "2025-07-04 01:03:37", "%Y-%m-%d %H:%M:%S" ), delivery_started=datetime.strptime( "2025-07-04 01:03:37", "%Y-%m-%d %H:%M:%S" ), ), ), ( "JobNotFoundError", 789, "N", True, None, ), ], ) def test_get_job( test_description: str, job_id: int, meta_update: str, expect_raises: bool, expected_result: Job | None, init_db_tables: None, ) -> None: """Test get_job success.""" create_job(meta_update=meta_update) if expect_raises: with pytest.raises(JobNotFoundError) as exc: job_model.get_job(job_id) assert str(exc.value) == "404 Not Found: Job with id 789 not found" else: result = job_model.get_job(job_id) assert result == expected_result @pytest.mark.parametrize( ( "test_description", "upc", "store_id", "status", "expected_result", ), [ ( "No delivered jobs, no upc match", 199066950296, 286, "delivered", False, ), ( "No delivered jobs, no store match", 199066946312, 1, "delivered", False, ), ( "No delivered jobs, no status match", 199066946312, 286, "ready_to_encode", False, ), ( "Delivered job", 199066946312, 286, "delivered", True, ), ], ) def test_has_delivered_job( test_description: str, upc: int, store_id: int, status: str, expected_result: bool, init_db_tables: None, ) -> None: """Test has_delivered_job.""" create_job( upc=upc, dms_master_master_id=store_id, encoding_queue_detail_status=status ) result = job_model.has_delivered_job(upc=199066946312, store_id=286) assert result is expected_result @pytest.mark.parametrize( ( "test_description", "upc", "store_id", "expected_result", ), [ ( "No delivery history, no upc match", 199066950296, 286, False, ), ( "No delivery history, no store match", 199066946312, 1, False, ), ( "Delivery history", 199066946312, 286, True, ), ], ) def test_has_delivery_history( test_description: str, upc: int, store_id: int, expected_result: bool, init_db_tables: None, ) -> None: """Test has_delivery_history.""" create_delivery_history(upc=upc, customer_master_master_id=store_id) result = job_model.has_delivery_history(upc=199066946312, store_id=286) assert result is expected_result