"""Functional tests for the v2 product artwork validation endpoint.""" import json from datetime import datetime from typing import Any from unittest import mock import pytest from flask.testing import FlaskClient from flexmock import flexmock from owsrequest import request from assets.constants import service from tests.unit.models import au_operations @pytest.fixture def product_id() -> int: """Return a fake product_id for testing.""" return 123 @pytest.fixture def product(product_id: int) -> dict[str, Any]: """Return a fake product from ows-product.""" return { "product_id": product_id, "project_id": 1111, "distribution_format_id": 2, "product_type_id": 1, "upc": 100075236325, "vendor_id": 7123, "subaccount_id": 0, "context_type": "digital", "release_date": "2016-10-15", "status": "label_processing", "product_name": "Best Damn Product You Ever Done Heard", } @pytest.fixture def v2_artwork_url(product_id: int) -> str: """Return the url for validating artwork for the fixture product_id.""" return "/v2/validators/product/{}/artwork".format(product_id) def mock_ows_product( product_id: int, status_code: int, response_body: dict[str, Any] ) -> None: """Stub out ows-product to return the given status and payload.""" ows_product_response = mock.MagicMock( status_code=status_code, json=mock.MagicMock(return_value=response_body) ) ( flexmock(request) .should_receive("get") .with_args( service.OWS_PRODUCT, service.OWS_PRODUCT_BY_PRODUCT_ID.format(product_id=product_id), ) .and_return(ows_product_response) ) def test_validate_product_artwork_success( fixture_client: FlaskClient, product: dict[str, Any], product_id: int, v2_artwork_url: str, ) -> None: """Test for a 200 status code and a meaningless response body.""" mock_ows_product(product_id=product_id, status_code=200, response_body=product) audio_asset_upload = { "id": 1, "filename": "unique_filename_1", "user_id": "oa:654321", "token": "session_token_2".encode(), "original_filename": "original_filename_1", "track_unique_id": 2232323232, "product_id": product_id, "deleted": False, "updated_timestamp": datetime(2017, 1, 1, 0, 0), "api_version": 2, } image_asset_upload = { "id": 2, "filename": "unique_filename_2", "user_id": "oa:654321", "token": "session_token_2".encode(), "original_filename": "original_filename_2", "track_unique_id": 0, "product_id": product_id, "deleted": False, "updated_timestamp": datetime(2017, 1, 1, 0, 0), "api_version": 2, } asset_statuses = [ { "asset_upload_id": 2, "message": '{"foo": "bar"}', "status": "first_status_does_not_matter", "status_time": datetime(2017, 1, 1, 0, 1), }, { "asset_upload_id": 2, "message": '{"foo": "bar"}', "status": "encoding_completed", "status_time": datetime(2017, 1, 1, 0, 2), }, ] au_operations.truncate_tables() au_operations.seed_asset_upload_table([audio_asset_upload, image_asset_upload]) au_operations.seed_asset_status_table(asset_statuses) response = fixture_client.get(v2_artwork_url) decoded_body = json.loads(response.data.decode()) assert response.status_code == 200 assert decoded_body == {"status": "ok"}