test(krisp): scope importlib.metadata.version mock to imports only

The four krisp test files installed a process-wide mock of
importlib.metadata.version with `patch(...).start()` at module level and
never called .stop(). Once any of these files was collected, the mock
leaked across the rest of the test session, returning '0.0.0-dev' for
every version check. This corrupted unrelated tests that triggered
transformers' import-time dependency check (e.g. lazy imports of
LocalSmartTurnAnalyzerV3) — transformers saw tqdm=='0.0.0-dev' and
refused to load.

Wrap the pipecat imports in `with patch(...)` so the mock is active
during import (where pipecat's krisp version check needs it) and torn
down before any tests run.
This commit is contained in:
Mark Backman
2026-04-30 14:16:54 -04:00
parent 8ea963852d
commit 351105a975
4 changed files with 37 additions and 43 deletions

View File

@@ -12,10 +12,6 @@ from unittest.mock import MagicMock, patch
import numpy as np import numpy as np
# Mock package version check before importing pipecat (development mode)
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio before any pipecat import that loads krisp_instance / VIVA IP strategy # Mock krisp_audio before any pipecat import that loads krisp_instance / VIVA IP strategy
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
mock_krisp_audio.SamplingRate.Sr8000Hz = 8000 mock_krisp_audio.SamplingRate.Sr8000Hz = 8000
@@ -37,18 +33,22 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
from pipecat.frames.frames import ( # The version patch is scoped to just the import so it doesn't leak across the
BotStartedSpeakingFrame, # test session and corrupt importlib.metadata.version for other tests
BotStoppedSpeakingFrame, # (e.g. transformers' import-time dependency checks).
InputAudioRawFrame, with patch("importlib.metadata.version", return_value="0.0.0-dev"):
TranscriptionFrame, from pipecat.frames.frames import (
VADUserStartedSpeakingFrame, BotStartedSpeakingFrame,
VADUserStoppedSpeakingFrame, BotStoppedSpeakingFrame,
) InputAudioRawFrame,
from pipecat.turns.types import ProcessFrameResult TranscriptionFrame,
from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import ( VADUserStartedSpeakingFrame,
KrispVivaIPUserTurnStartStrategy, VADUserStoppedSpeakingFrame,
) )
from pipecat.turns.types import ProcessFrameResult
from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import (
KrispVivaIPUserTurnStartStrategy,
)
STRATEGY_MODULE = "pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy" STRATEGY_MODULE = "pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy"

View File

@@ -11,11 +11,6 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
# Mock package version check before importing pipecat
# This allows tests to run in development mode without installed package
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio module BEFORE any pipecat imports # Mock krisp_audio module BEFORE any pipecat imports
# This allows tests to run without krisp_audio installed # This allows tests to run without krisp_audio installed
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
@@ -48,12 +43,15 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
# Now we can safely import # Now we can safely import. The version patch is scoped to just the import so
from pipecat.audio.krisp_instance import ( # it doesn't leak across the test session and corrupt importlib.metadata.version
KRISP_SAMPLE_RATES, # for other tests (e.g. transformers' import-time dependency checks).
KrispVivaSDKManager, with patch("importlib.metadata.version", return_value="0.0.0-dev"):
int_to_krisp_sample_rate, from pipecat.audio.krisp_instance import (
) KRISP_SAMPLE_RATES,
KrispVivaSDKManager,
int_to_krisp_sample_rate,
)
class TestKrispVivaSDKManager: class TestKrispVivaSDKManager:

View File

@@ -13,11 +13,6 @@ from unittest.mock import MagicMock, patch
import numpy as np import numpy as np
# Mock package version check before importing pipecat
# This allows tests to run in development mode without installed package
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio module BEFORE any pipecat imports # Mock krisp_audio module BEFORE any pipecat imports
# This allows tests to run without krisp_audio installed # This allows tests to run without krisp_audio installed
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
@@ -42,9 +37,12 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
# Now we can safely import # Now we can safely import. The version patch is scoped to just the import so
from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter # it doesn't leak across the test session and corrupt importlib.metadata.version
from pipecat.frames.frames import FilterEnableFrame # for other tests (e.g. transformers' import-time dependency checks).
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter
from pipecat.frames.frames import FilterEnableFrame
class TestKrispVivaFilter(unittest.IsolatedAsyncioTestCase): class TestKrispVivaFilter(unittest.IsolatedAsyncioTestCase):

View File

@@ -15,11 +15,6 @@ from unittest.mock import MagicMock, patch
import numpy as np import numpy as np
# Mock package version check before importing pipecat
# This allows tests to run in development mode without installed package
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio module BEFORE any pipecat imports # Mock krisp_audio module BEFORE any pipecat imports
# This allows tests to run without krisp_audio installed # This allows tests to run without krisp_audio installed
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
@@ -44,9 +39,12 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
# Now we can safely import # Now we can safely import. The version patch is scoped to just the import so
from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer # it doesn't leak across the test session and corrupt importlib.metadata.version
from pipecat.audio.vad.vad_analyzer import VADParams # for other tests (e.g. transformers' import-time dependency checks).
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer
from pipecat.audio.vad.vad_analyzer import VADParams
class TestKrispVivaVadAnalyzer(unittest.TestCase): class TestKrispVivaVadAnalyzer(unittest.TestCase):