"""conftest. This file gets picked up when running py.test tests: http://pytest.org/latest/writing_plugins.html#conftest """ import os from unittest.mock import MagicMock import application from flask import testing import pytest from werkzeug.datastructures import Headers from asset_transcoder.constants import asset_status as asset_status_const from asset_transcoder.constants import asset_types as asset_types_const from asset_transcoder.logic import ownership from asset_transcoder.utils import api_utils from tests.utils import db_operations @pytest.fixture def db_fixture(): """Drop and re-create all the SQLite tables and seed them.""" db_operations.create_tables() db_operations.seed_data() yield db_operations.drop_tables() @pytest.fixture def empty_db_fixture(): """Drop and re-create all the SQLite tables and seed them.""" db_operations.create_tables() yield db_operations.drop_tables() class TestClient(testing.FlaskClient): """Test client implementation with user headers.""" def open(self, *args, **kwargs): # noqa: A003 """Open method.""" user_headers = Headers({ 'Orchard-Identity-UUID': 'Billy' }) headers = kwargs.pop('headers', Headers()) if isinstance(headers, dict): headers.update(user_headers) else: headers.extend(user_headers) kwargs['headers'] = headers return super().open(*args, **kwargs) @pytest.fixture def fixture_client(): """Create an api test client fixture.""" application.app.test_client_class = TestClient os.environ['CLOUDFRONT_PRIVATE_KEY'] = 'cdn-private-key' os.environ['CLOUDFRONT_KEY_PAIR_ID'] = 'cdn-key-id' with application.app.test_client() as client: yield client application.app.test_client_class = testing.FlaskClient @pytest.fixture def asset_status_fixture(): """Return fixture for asset_status message.""" return { 'filename': 'filename', 'status': asset_status_const.PROCESSING_VALID_STATUSES[0], 'errors': None, 'timestamp': '2019-11-14T10:00:01.0007Z', } @pytest.fixture def asset_status_with_errors_fixture(): """Return an input fixture for creating asset_status.""" return { 'filename': 'filename', 'status': asset_status_const.STATUS_VALIDATION_ERROR, 'errors': { 'image_invalid_mode': 'Invalid image mode: CMYK', 'image_too_small_dimensions_error': 'Image dimensions are too small' }, 'timestamp': '2019-11-14T10:00:01.0007Z', } @pytest.fixture def asset_upload_fixture(): """Return fixture for asset_upload message.""" return { 'filename': 'bucket_filename_1.jpg', 'asset_type': 'JPG', 'object_id': '1', 'object_type': 'episode', 'original_filename': 'episode_photo_1.jpg' } @pytest.fixture def asset_upload_wav_fixture(): """Return fixture for wav asset upload for object id 7.""" return db_operations.assets_upload_data[7] @pytest.fixture def asset_final_fixture(): """Return fixture for asset_final.""" return { 'filename': 'bucket_filename_1.jpg', 'status': asset_status_const.STATUS_ENCODING_COMPLETED, 'errors': None, 'timestamp': '2019-11-18T10:00:01.0007Z', 'final_assets': [{ 'key': 'new_filename_1.jpg', 'asset_type': asset_types_const.TYPE_FILE_JPG, 'asset_subtype': asset_types_const.SUBTYPE_LARGE_COVER, 'duration': 0 }] } @pytest.fixture def get_user_fixture(monkeypatch): """Return fixture for user_id extraction.""" monkeypatch.setattr(api_utils, 'get_user_id', MagicMock( return_value='auth0-test-user-1' )) @pytest.fixture def mock_ownership_check(monkeypatch): """Mock ownership check.""" monkeypatch.setattr(ownership, 'check', MagicMock( return_value=True )) @pytest.fixture def get_upload_permission_fixture(): """Return mocked upload credentials.""" return { 'bucket': 'some-bucket', 'filename': 'some-file.jpg', 'credentials': { 'token': 'a-token', 'aws_access_key_id': 'fake-key', 'aws_secret_access_key': 'fake-secret', 'expiration': '3600' } } @pytest.fixture def episode_replication_fixture(): """Return mocked episode replication request data.""" return { 'objects': [ { 'original_episode_id': 2, 'episode_id': 123 }, { 'original_episode_id': 8, 'episode_id': 456 } ] } @pytest.fixture def full_assets_fixture(): """Return mocked asset upload and asset final data.""" return [ { 'id': 2, 'user_id': 'auth0-test-user-2', 'asset_type': 'WAV', 'filename': 'uuid-filename-2', 'object_id': '2', 'object_type': 'episode', 'original_filename': 'test.wav', 'asset_finals': [] }, { 'id': 4, 'user_id': 'auth0-test-user-1', 'asset_type': 'WAV', 'filename': 'uuid-filename-8', 'object_id': '8', 'object_type': 'episode', 'original_filename': 'test.wav', 'asset_finals': [ { 'id': 1, 'asset_upload_id': '4', 'asset_type': 'MP3', 'asset_subtype': None, 'filename': 'test-uuid-mp3-1', 'duration': 910 }, { 'id': 2, 'asset_upload_id': '4', 'asset_type': 'FLAC', 'asset_subtype': None, 'filename': 'test-uuid-flac-1', 'duration': 900 }, { 'id': 3, 'asset_upload_id': '4', 'asset_type': 'FLAC', 'asset_subtype': None, 'filename': 'test-uuid-flac-2', 'duration': 1180 }, { 'id': 4, 'asset_upload_id': '4', 'asset_type': 'DAT', 'asset_subtype': None, 'filename': 'test-uuid-dat-1', 'duration': 0 }, { 'id': 5, 'asset_upload_id': '4', 'asset_type': 'DAT', 'asset_subtype': None, 'filename': 'test-uuid-dat-2', 'duration': 0 }, { 'id': 6, 'asset_upload_id': '4', 'asset_type': 'MP3', 'asset_subtype': None, 'filename': 'test-uuid-mp3-2', 'duration': 1200 } ] } ] def sign_url_mock(url, signer, policy): """Mock url signing.""" return '{}?Policy=policy&Signature=signature&Key-Pair-Id=key-pair'.format(url)