From 351105a975bd136c009743ea8b1b6b6ae4ef0a2c Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Thu, 30 Apr 2026 14:16:54 -0400 Subject: [PATCH] test(krisp): scope importlib.metadata.version mock to imports only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../test_krisp_ip_user_turn_start_strategy.py | 32 +++++++++---------- tests/test_krisp_sdk_manager.py | 20 ++++++------ tests/test_krisp_viva_filter.py | 14 ++++---- tests/test_krisp_viva_vad.py | 14 ++++---- 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/tests/test_krisp_ip_user_turn_start_strategy.py b/tests/test_krisp_ip_user_turn_start_strategy.py index 5e5dd00cc..576c4be60 100644 --- a/tests/test_krisp_ip_user_turn_start_strategy.py +++ b/tests/test_krisp_ip_user_turn_start_strategy.py @@ -12,10 +12,6 @@ from unittest.mock import MagicMock, patch 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 = MagicMock() 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.krisp_processor"] = MagicMock() -from pipecat.frames.frames import ( - BotStartedSpeakingFrame, - BotStoppedSpeakingFrame, - InputAudioRawFrame, - TranscriptionFrame, - VADUserStartedSpeakingFrame, - VADUserStoppedSpeakingFrame, -) -from pipecat.turns.types import ProcessFrameResult -from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import ( - KrispVivaIPUserTurnStartStrategy, -) +# The version patch is scoped to just the import so it doesn't leak across the +# test session and corrupt importlib.metadata.version for other tests +# (e.g. transformers' import-time dependency checks). +with patch("importlib.metadata.version", return_value="0.0.0-dev"): + from pipecat.frames.frames import ( + BotStartedSpeakingFrame, + BotStoppedSpeakingFrame, + InputAudioRawFrame, + TranscriptionFrame, + VADUserStartedSpeakingFrame, + 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" diff --git a/tests/test_krisp_sdk_manager.py b/tests/test_krisp_sdk_manager.py index 2edbf4598..c809527ef 100644 --- a/tests/test_krisp_sdk_manager.py +++ b/tests/test_krisp_sdk_manager.py @@ -11,11 +11,6 @@ from unittest.mock import MagicMock, patch 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 # This allows tests to run without krisp_audio installed 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.krisp_processor"] = MagicMock() -# Now we can safely import -from pipecat.audio.krisp_instance import ( - KRISP_SAMPLE_RATES, - KrispVivaSDKManager, - int_to_krisp_sample_rate, -) +# Now we can safely import. The version patch is scoped to just the import so +# it doesn't leak across the test session and corrupt importlib.metadata.version +# for other tests (e.g. transformers' import-time dependency checks). +with patch("importlib.metadata.version", return_value="0.0.0-dev"): + from pipecat.audio.krisp_instance import ( + KRISP_SAMPLE_RATES, + KrispVivaSDKManager, + int_to_krisp_sample_rate, + ) class TestKrispVivaSDKManager: diff --git a/tests/test_krisp_viva_filter.py b/tests/test_krisp_viva_filter.py index a788ab131..61a6d0493 100644 --- a/tests/test_krisp_viva_filter.py +++ b/tests/test_krisp_viva_filter.py @@ -13,11 +13,6 @@ from unittest.mock import MagicMock, patch 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 # This allows tests to run without krisp_audio installed 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.krisp_processor"] = MagicMock() -# Now we can safely import -from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter -from pipecat.frames.frames import FilterEnableFrame +# Now we can safely import. The version patch is scoped to just the import so +# it doesn't leak across the test session and corrupt importlib.metadata.version +# 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): diff --git a/tests/test_krisp_viva_vad.py b/tests/test_krisp_viva_vad.py index 12b06bc70..9124eaad8 100644 --- a/tests/test_krisp_viva_vad.py +++ b/tests/test_krisp_viva_vad.py @@ -15,11 +15,6 @@ from unittest.mock import MagicMock, patch 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 # This allows tests to run without krisp_audio installed 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.krisp_processor"] = MagicMock() -# Now we can safely import -from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer -from pipecat.audio.vad.vad_analyzer import VADParams +# Now we can safely import. The version patch is scoped to just the import so +# it doesn't leak across the test session and corrupt importlib.metadata.version +# 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):