"""Fixtures for Neo4j integration tests.""" import os from collections.abc import Generator from typing import Sequence from unittest.mock import MagicMock, patch import pytest from flask import g from neo4j import Driver, GraphDatabase, Session from .utils import Neo4JDataFixture # Mock Auth0 JWKS fetch before importing api module with patch('owsrequest.auth.get_auth0_jwks', return_value={}): from notifications import api @pytest.fixture(scope='session') def neo4j_driver() -> Generator[Driver, None, None]: """Provide a neo4j driver.""" url = os.environ['NEO4J_URL'] with GraphDatabase.driver(url) as driver: yield driver @pytest.fixture def neo4j_session(neo4j_driver: Driver) -> Generator[Session, None, None]: """Provide a neo4j session and clean up all data after each test.""" with neo4j_driver.session() as session: yield session session.run('MATCH (n) DETACH DELETE n') @pytest.fixture def neo4j_data_fixture( request: pytest.FixtureRequest, neo4j_session: Session ) -> Generator[Sequence[Neo4JDataFixture], None, None]: """Apply DataFixture to Neo4j.""" data_fixture = getattr(request, 'param', None) if isinstance(data_fixture, Neo4JDataFixture): data_fixture = [data_fixture] if isinstance(data_fixture, (list, tuple)): for fixture in data_fixture: neo4j_session.run(fixture.query, fixture.parameters) yield data_fixture @pytest.fixture(autouse=True) def _app_context() -> Generator[None, None, None]: """Provide Flask app context with mocked logger.""" with api.app.app_context(): g.log = MagicMock() g.log_tags = {} g.add_log_tags = MagicMock() yield @pytest.fixture(autouse=True) def _patch_get_session(neo4j_session: Session, _app_context) -> Generator[None, None, None]: """Patch connector_neo4j.get_session to return the session.""" with patch( 'notifications.models.subscriptions.get_session', return_value=neo4j_session, ): yield