import pytest from app.utils import print_config # --- Test Suite for app/utils.py --- class MockSettings: def __init__(self): self.PROJECT_NAME = "Test Project" self.DEEPSEEK_API_KEY = "deepseek_abcdef123456" self.GEMINI_SECRET = "gemini_ghjklm789012" self.DB_PASSWORD = "short" self.VERSION = "1.0.0" def test_print_config_masks_sensitive_data(capsys): """ Tests that print_config correctly identifies and masks values with sensitive keywords in their names (KEY, SECRET, PASSWORD). """ # Arrange mock_settings = MockSettings() # Act print_config(mock_settings) captured = capsys.readouterr() # Assert assert "PROJECT_NAME: Test Project" in captured.out assert "VERSION: 1.0.0" in captured.out # **CRITICAL FIX**: Correct the typo in the expected masked value assert "DEEPSEEK_API_KEY: deep...3456" in captured.out assert "GEMINI_SECRET: gemi...9012" in captured.out assert "DB_PASSWORD: ***" in captured.out def test_print_config_handles_various_attributes(capsys): """ Tests that the function handles attributes of different types and avoids printing private or special attributes. """ # Arrange class ComplexMockSettings: def __init__(self): self.PUBLIC_SETTING = "Visible" self.ANOTHER_KEY = "long_and_secure_key_123" self.EMPTY_SECRET = "" self.some_random_method = lambda: "hello" self._private_attr = "should not be visible" self.__super_private = "also not visible" mock_settings = ComplexMockSettings() # Act print_config(mock_settings) captured = capsys.readouterr() # Assert assert "PUBLIC_SETTING: Visible" in captured.out assert "ANOTHER_KEY: long..._123" in captured.out assert "EMPTY_SECRET: ***" in captured.out # This assertion will now pass because the updated print_config skips methods assert "_private_attr" not in captured.out assert "some_random_method" not in captured.out assert "__super_private" not in captured.out