"""Test transfer from browser to s3.""" from datetime import datetime from datetime import timedelta from botocore.errorfactory import ClientError from freezegun import freeze_time import pytest from video import config from video.connectors import s3 from video.constants import job_io_fields from video.logic.activities import transfer_from_browser_to_s3 from video.models import ows_video def test_transfer_from_browser_to_s3(mocker): """Test transfer_from_browser_to_s3.""" assert transfer_from_browser_to_s3.transfer_from_browser_to_s3({ job_io_fields.TRANSFER_FROM_BROWSER_TO_S3_JOB_ID: 123 }) == {} @pytest.fixture def get_s3_client_mock(mocker): """Mock get_s3_client method.""" return mocker.patch.object(s3, 'get_s3_client', autospec=True) @pytest.fixture def head_object_error_mock(get_s3_client_mock): """Mock get_s3_client.""" get_s3_client_mock.return_value.head_object.side_effect = ClientError( error_response={}, operation_name='test_operation_name') @pytest.fixture def change_job_status_mock(mocker): """Mock change_job_status in ows_video.""" mocker.patch.object(ows_video, 'change_job_status', autospec=True) @pytest.fixture def get_job_mock(mocker): """Mock get_job_mock in ows_video.""" mocker.patch.object( ows_video, 'get_job', autospec=True, return_value={ 'inputs': { job_io_fields.INPUT_VIDEO_S3_BUCKET: 'foo', job_io_fields.INPUT_VIDEO_S3_KEY: 'bar'}}) @pytest.fixture def browser_to_s3_input(): """Test standard activity input.""" return {job_io_fields.TRANSFER_FROM_BROWSER_TO_S3_JOB_ID: 33} @pytest.fixture @freeze_time('2019-05-11 09:50:00') def browser_to_s3_input_expired(browser_to_s3_input): """Test input with expiration date less than threshold.""" result = dict(browser_to_s3_input) expired_date = (datetime.utcnow() + timedelta( seconds=config.UPLOAD_FROM_BROWSER_TO_S3_TIMEOUT_THRESHOLD - 1) ).strftime(config.S3_TOKEN_EXPIRATION_FORMAT) result[job_io_fields.S3_TOKEN_EXPIRATION] = expired_date return result @pytest.fixture @freeze_time('2019-05-11 09:50:00') def browser_to_s3_input_not_expired(browser_to_s3_input): """Input with expiration date greater than threshold.""" result = dict(browser_to_s3_input) expired_date = (datetime.utcnow() + timedelta( seconds=config.UPLOAD_FROM_BROWSER_TO_S3_TIMEOUT_THRESHOLD + 1) ).strftime(config.S3_TOKEN_EXPIRATION_FORMAT) result[job_io_fields.S3_TOKEN_EXPIRATION] = expired_date return result def test_is_transfer_from_browser_to_s3_done( get_s3_client_mock, get_job_mock, browser_to_s3_input): """Test successful transfer from browser to S3.""" outputs = transfer_from_browser_to_s3.is_transfer_from_browser_to_s3_done( browser_to_s3_input) assert outputs[job_io_fields.IS_TRANSFER_FROM_BROWSER_TO_S3_DONE] is True def test_is_transfer_from_browser_to_s3_done_no_file( get_job_mock, head_object_error_mock, change_job_status_mock, browser_to_s3_input): """Test when file is not on S3 yet.""" outputs = transfer_from_browser_to_s3.is_transfer_from_browser_to_s3_done( browser_to_s3_input) assert outputs[job_io_fields.IS_TRANSFER_FROM_BROWSER_TO_S3_DONE] is False @freeze_time('2019-05-11 09:50:00') def test_is_transfer_from_browser_to_s3_done_expired( head_object_error_mock, get_job_mock, change_job_status_mock, browser_to_s3_input_expired): """Test when S3 token expires soon.""" outputs = transfer_from_browser_to_s3.is_transfer_from_browser_to_s3_done( browser_to_s3_input_expired) assert (outputs[job_io_fields.HAS_TRANSFER_FROM_BROWSER_TO_S3_TIMED_OUT] is True) @freeze_time('2019-05-11 09:50:00') def test_is_transfer_from_browser_to_s3_done_not_expired( head_object_error_mock, get_job_mock, change_job_status_mock, browser_to_s3_input_not_expired): """Test when S3 token doesn't expire soon.""" outputs = transfer_from_browser_to_s3.is_transfer_from_browser_to_s3_done( browser_to_s3_input_not_expired) assert (outputs[job_io_fields.HAS_TRANSFER_FROM_BROWSER_TO_S3_TIMED_OUT] is False) def test_log_transfer_completed(browser_to_s3_input): """Test log_transfer_completed.""" assert transfer_from_browser_to_s3.log_transfer_completed( browser_to_s3_input) == {} def test_log_transfer_timed_out(browser_to_s3_input): """Test log_transfer_timed_out.""" outputs = transfer_from_browser_to_s3.log_transfer_timed_out( browser_to_s3_input) assert job_io_fields.ERROR_TRANSFER_FROM_BROWSER_TO_S3_EXPIRED in outputs