"""Ingest logic tests.""" from unittest.mock import ANY, MagicMock, call import boto3 from pytest_mock import MockerFixture from video import config from video.constants.ingest import INGEST_INCOMING_PATH from video.logic import ingest as ingest_logic, job as job_logic from video.models.sql.classes import product_video def test_ingest(mocker: MockerFixture) -> None: """Test ingest.""" files_to_ingest = [ {"path": "ingest/incoming/video1.mov", "filename": "video1.mov"}, {"path": "ingest/incoming/video2.mov", "filename": "video2.mov"}, {"path": "ingest/incoming/video3.mov", "filename": "video3.mov"}, ] files_with_product = [ { "path": "ingest/incoming/video1.mov", "filename": "video1.mov", "release_id": 1, }, { "path": "ingest/incoming/video2.mov", "filename": "video2.mov", "release_id": 2, }, ] setup_ingest_side_effect = [[{"parent_id": 1}], [{"parent_id": 2}]] mocker.patch.object( ingest_logic, "_get_files_to_ingest", return_value=files_to_ingest ) mocker.patch.object( ingest_logic, "_filter_files_with_product", return_value=files_with_product ) mock_setup_ingest: MagicMock = mocker.patch.object( job_logic, "setup_ingest_from_s3_workflow", side_effect=setup_ingest_side_effect ) mock_upsert: MagicMock = mocker.patch.object( product_video, "upsert", return_value=True ) result = ingest_logic.ingest({}) mock_setup_ingest.assert_has_calls( [call(files_with_product[0]), call(files_with_product[1])] ) mock_upsert.assert_has_calls( [ call( { "path": "ingest/incoming/video1.mov", "filename": "video1.mov", "release_id": 1, "latest_pipeline_run_id": 1, "migrated_asset_at": ANY, } ), call( { "path": "ingest/incoming/video2.mov", "filename": "video2.mov", "release_id": 2, "latest_pipeline_run_id": 2, "migrated_asset_at": ANY, } ), ] ) assert result == files_with_product def test_ingest_batch_size(mocker: MockerFixture) -> None: """Test ingest.""" files_to_ingest = [ {"path": "ingest/incoming/video1.mov", "filename": "video1.mov"}, {"path": "ingest/incoming/video2.mov", "filename": "video2.mov"}, {"path": "ingest/incoming/video3.mov", "filename": "video3.mov"}, ] files_with_product = [ { "path": "ingest/incoming/video1.mov", "filename": "video1.mov", "release_id": 1, }, { "path": "ingest/incoming/video2.mov", "filename": "video2.mov", "release_id": 2, }, ] setup_ingest_side_effect = [[{"parent_id": 1}], [{"parent_id": 2}]] mocker.patch.object( ingest_logic, "_get_files_to_ingest", return_value=files_to_ingest ) mocker.patch.object( ingest_logic, "_filter_files_with_product", return_value=files_with_product ) mock_setup_ingest: MagicMock = mocker.patch.object( job_logic, "setup_ingest_from_s3_workflow", side_effect=setup_ingest_side_effect ) mock_upsert: MagicMock = mocker.patch.object( product_video, "upsert", return_value=True ) result = ingest_logic.ingest({"batch_size": 1}) mock_setup_ingest.assert_has_calls([call(files_with_product[0])]) mock_upsert.assert_has_calls( [ call( { "path": "ingest/incoming/video1.mov", "filename": "video1.mov", "release_id": 1, "latest_pipeline_run_id": 1, "migrated_asset_at": ANY, } ) ] ) assert result == files_with_product[:1] def test_get_files_to_ingest(mocker: MockerFixture) -> None: """Test get files to ingest.""" mockClient = MagicMock() mockClient.list_objects_v2.return_value = { "Contents": [ {"Key": "ingest/incoming/"}, {"Key": "ingest/incoming/video1.mov"}, {"Key": "ingest/incoming/video2.mov"}, {"Key": "ingest/incoming/video3.mov"}, {"Key": "ingest/incoming/444"}, {"Key": "ingest/incoming/444/video4.mov"}, ] } mocker.patch.object(boto3, "client", return_value=mockClient) result = ingest_logic._get_files_to_ingest() mockClient.list_objects_v2.assert_called_once_with( Bucket=config.VIDEO_BUCKET_NAME, Prefix=INGEST_INCOMING_PATH ) assert result == [ {"path": "ingest/incoming/video1.mov", "filename": "video1.mov"}, {"path": "ingest/incoming/video2.mov", "filename": "video2.mov"}, {"path": "ingest/incoming/video3.mov", "filename": "video3.mov"}, {"path": "ingest/incoming/444/video4.mov", "filename": "video4.mov"}, ] def test_filter_files_with_product(mocker: MockerFixture) -> None: """Test filter files with product.""" files_to_ingest = [ {"path": "ingest/incoming/video1.mov", "filename": "video1.mov"}, {"path": "ingest/incoming/video2.mov", "filename": "video2.mov"}, {"path": "ingest/incoming/video3.mov", "filename": "video3.mov"}, {"path": "ingest/incoming/video4.mov", "filename": "video4.mov"}, ] mock_get_by_filename: MagicMock = mocker.patch.object( product_video, "get_by_ingest_filename", side_effect=[ {"release_id": 1}, {"release_id": 2}, None, {"release_id": 4, "latest_pipeline_run_id": 4}, ], ) result = ingest_logic._filter_files_with_product(files_to_ingest) mock_get_by_filename.assert_has_calls( [call("video1.mov"), call("video2.mov"), call("video3.mov"), call("video4.mov")] ) assert result == [ { "path": "ingest/incoming/video1.mov", "filename": "video1.mov", "release_id": 1, }, { "path": "ingest/incoming/video2.mov", "filename": "video2.mov", "release_id": 2, }, ]