"""Tests for access checking logic.""" import random from http import HTTPStatus from typing import Any import pytest from pytest_mock import MockerFixture from werkzeug.exceptions import HTTPException from video.api import app from video.constants import access_control, error, product from video.logic import access_control as access_control_logic from video.models.sql.classes import release from tests.unit.factories.ows import ( grass_info as grass_info_factory, product as product_factory, ) account_id = random.randint(1, 999999) user_forbidden_error = { "code": error.ERROR_CODE_AUTHORIZATION, "message": "user is forbidden", } not_video_product_error = { "message": "Not a video product.", "code": error.ERROR_NOT_VIDEO_PRODUCT, } @pytest.mark.parametrize( ( "test_case", "grass_user_info", "product", ), [ ( "vendor ok", grass_info_factory.GrassInfoFactory( grass_account_type=access_control.VENDOR, grass_account_id=account_id, ), product_factory.ProductFactory.build( vendor_id=account_id, distribution_format_id=(product.MUSIC_VIDEO_DISTRIBUTION_FORMAT_ID), ).to_dict(), ), ( "subaccount ok", grass_info_factory.GrassInfoFactory( grass_account_type=access_control.SUBACCOUNT, grass_account_id=account_id, ), product_factory.ProductFactory.build( subaccount_id=account_id, distribution_format_id=(product.MUSIC_VIDEO_DISTRIBUTION_FORMAT_ID), ).to_dict(), ), ( "non-grass ok", grass_info_factory.GrassInfoFactory( grass_account_type=None, grass_account_id=None, ), product_factory.ProductFactory.build( distribution_format_id=(product.MUSIC_VIDEO_DISTRIBUTION_FORMAT_ID), ).to_dict(), ), ], ) def test_check_access_to_product_success( mocker: MockerFixture, test_case: Any, grass_user_info: Any, product: Any, ) -> None: """Test check_access_to_product success.""" product_id = 234 mocker.patch.object( release, "get_by_id_with_vendor", autospec=True, return_value=product ) with app.test_request_context(headers=grass_user_info.get_grass_headers()): access_control_logic.check_access_to_product(product_id) @pytest.mark.parametrize( ( "test_case", "grass_user_info", "product", "expected_status_code", ), [ ( "vendor forbidden", grass_info_factory.GrassInfoFactory( grass_account_type=access_control.VENDOR, grass_account_id=account_id, ), product_factory.ProductFactory.build( vendor_id=account_id + random.randint(1, 999999), distribution_format_id=(product.MUSIC_VIDEO_DISTRIBUTION_FORMAT_ID), ).to_dict(), HTTPStatus.FORBIDDEN, ), ( "subaccount forbidden", grass_info_factory.GrassInfoFactory( grass_account_type=access_control.SUBACCOUNT, grass_account_id=account_id, ), product_factory.ProductFactory.build( subaccount_id=account_id + random.randint(1, 999999), distribution_format_id=(product.MUSIC_VIDEO_DISTRIBUTION_FORMAT_ID), ).to_dict(), HTTPStatus.FORBIDDEN, ), ( "product not video", grass_info_factory.GrassInfoFactory(), product_factory.ProductFactory.build( distribution_format_id=101, ).to_dict(), HTTPStatus.BAD_REQUEST, ), ], ) def test_check_access_to_product_failure( mocker: MockerFixture, test_case: Any, grass_user_info: Any, product: Any, expected_status_code: Any, ) -> None: """Test check_access_to_product failure.""" product_id = 234 mocker.patch.object( release, "get_by_id_with_vendor", autospec=True, return_value=product ) with ( pytest.raises(HTTPException) as ei, app.test_request_context(headers=grass_user_info.get_grass_headers()), ): access_control_logic.check_access_to_product(product_id) assert ei.value.code == expected_status_code