"""Stream logic tests.""" from unittest.mock import MagicMock import boto3 import pytest from pytest_mock import MockerFixture from video.constants.thumbnails import ( DEFAULT_IMAGE_SIZE, THUMBNAILS_BUCKET, THUMBNAILS_CDN_URL, THUMBNAILS_PATH, UPLOAD_CUSTOM_THUMBNAIL, ) from video.exceptions import ProductVideoNotFound from video.logic import cloudfront as cloudfront_logic, thumbnails as thumbnails_logic from video.models.s3 import s3_token from video.models.sql.classes import product_video def test_get_available_thumbnails(mocker: MockerFixture) -> None: """Test get available thumbnails.""" job_id = 123 mockClient = MagicMock() mockClient.list_objects_v2.return_value = { "Contents": [ {"Key": "thumbnails/original-size/123/0000.jpg"}, {"Key": "thumbnails/original-size/123/0001.jpg"}, {"Key": "thumbnails/original-size/123/0002.jpg"}, ] } mocker.patch.object(boto3, "client", return_value=mockClient) result = thumbnails_logic.get_available_thumbnails(job_id, None) mockClient.list_objects_v2.assert_called_once_with( Bucket=THUMBNAILS_BUCKET, Prefix=THUMBNAILS_PATH.format(image_size=DEFAULT_IMAGE_SIZE, job_id=job_id), ) assert result == [ "{}/original-size/123/0000.jpg".format(THUMBNAILS_CDN_URL), "{}/original-size/123/0001.jpg".format(THUMBNAILS_CDN_URL), "{}/original-size/123/0002.jpg".format(THUMBNAILS_CDN_URL), ] def test_get_available_thumbnails_image_size(mocker: MockerFixture) -> None: """Test get available thumbnails when specifying an image size.""" job_id = 123 image_size = "small" mockClient = MagicMock() mockClient.list_objects_v2.return_value = { "Contents": [ {"Key": "thumbnails/small/123/0000.jpg"}, {"Key": "thumbnails/small/123/0001.jpg"}, {"Key": "thumbnails/small/123/0002.jpg"}, ] } mocker.patch.object(boto3, "client", return_value=mockClient) result = thumbnails_logic.get_available_thumbnails(job_id, image_size) mockClient.list_objects_v2.assert_called_once_with( Bucket=THUMBNAILS_BUCKET, Prefix=THUMBNAILS_PATH.format(image_size=image_size, job_id=job_id), ) assert result == [ "{}/small/123/0000.jpg".format(THUMBNAILS_CDN_URL), "{}/small/123/0001.jpg".format(THUMBNAILS_CDN_URL), "{}/small/123/0002.jpg".format(THUMBNAILS_CDN_URL), ] def test_get_product_thumbnail(mocker: MockerFixture) -> None: """Test get product thumbnail.""" product_id = 123 mock_pv_get: MagicMock = mocker.patch.object( product_video, "get", return_value={"thumbnail_path": "THUMBNAILS_PATH"} ) mock_signed_url: MagicMock = mocker.patch.object( cloudfront_logic, "get_signed_url", return_value="SIGNED URL" ) result = thumbnails_logic.get_product_thumbnail(product_id, None, None) mock_pv_get.assert_called_once_with(product_id) mock_signed_url.assert_called_once_with( "{}/original-size/THUMBNAILS_PATH".format(THUMBNAILS_CDN_URL), expire_at=None ) assert result == "SIGNED URL" def test_get_product_thumbnail_not_found(mocker: MockerFixture) -> None: """Test get product thumbnail.""" product_id = 123 mock_pv_get2: MagicMock = mocker.patch.object( product_video, "get", return_value=None ) with pytest.raises(ProductVideoNotFound): thumbnails_logic.get_product_thumbnail(product_id, None, None) mock_pv_get2.assert_called_once_with(product_id) def test_generate_upload_token_for_custom_thumbnail(mocker: MockerFixture) -> None: """Test generate upload token.""" data = {"workflow_job_id": 123, "filename": "123.jpg"} mock_s3_token: MagicMock = mocker.patch.object( s3_token, "get_s3_token", return_value={"token": "TOKEN"} ) result = thumbnails_logic.generate_upload_token_for_custom_thumbnail(data) mock_s3_token.assert_called_once_with(123, UPLOAD_CUSTOM_THUMBNAIL, "123.jpg") assert result == {"token": "TOKEN"} def test_generate_upload_token_for_custom_thumbnail_whitespace_filename() -> None: """Test that a whitespace-only filename raises InvalidRequest.""" from video.exceptions import InvalidRequest with pytest.raises(InvalidRequest): thumbnails_logic.generate_upload_token_for_custom_thumbnail( {"workflow_job_id": 123, "filename": " "} )