"""Fixtures for functional tests.""" from typing import Any, Generator from unittest import mock from unittest.mock import patch import fakeredis import pytest from fakeredis import FakeRedis from flask.ctx import AppContext from flask.testing import FlaskClient from sqlalchemy.sql.expression import text import application from assets import rate_limiting from assets.connectors.mysql import au_db_session from tests.unit.models import au_operations @pytest.fixture def fixture_client() -> FlaskClient: """Create an api test client fixture.""" return application.app.test_client() @pytest.fixture def use_fake_redis_client() -> Generator[FakeRedis, Any, None]: fake_client = fakeredis.FakeRedis() with patch( "assets.rate_limiting.redis_connector.client", new=fake_client, ): rate_limiting.get_rate_limiter.cache_clear() yield fake_client rate_limiting.get_rate_limiter.cache_clear() @pytest.fixture def db_fixture() -> None: """Set up the ows_assets db.""" au_operations.truncate_tables() with au_db_session(turn_off_foreign_key_checks=True) as session: session.execute( text( """ INSERT INTO asset_upload_type (asset_upload_type_id, name) VALUES (1, "stereo"), (2, "static_artwork"), (3, "atmos"); """ ) ) @pytest.fixture def fixture_app() -> Generator[AppContext, Any, None]: """Push a Flask app context with mocked globals. Required by tests using ``@patch("assets.utils.handlers.g")`` — the patcher inspects the original ``LocalProxy`` at enter time, which needs an active application context. """ with application.app.app_context() as context: context.g.ows = mock.MagicMock() context.g.request_context = mock.MagicMock() context.g.log = mock.MagicMock() yield context