""" Tests for _get_min_kdf_iterations() in database/sqlcipher_utils.py Tests cover: - Production mode (no test env vars) returns 100K iterations - PYTEST_CURRENT_TEST env var triggers test mode (1 iteration) - LDR_TEST_MODE env var triggers test mode (1 iteration) - Both env vars set → still returns 1 - Constants have correct values """ import pytest class TestGetMinKdfIterations: """Tests for _get_min_kdf_iterations().""" def test_production_mode_returns_100k(self, monkeypatch): """No test env vars → production iterations (100_000).""" monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) monkeypatch.delenv("LDR_TEST_MODE", raising=False) from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 100_000 def test_pytest_current_test_triggers_test_mode(self, monkeypatch): """PYTEST_CURRENT_TEST set → test iterations (1).""" monkeypatch.setenv("PYTEST_CURRENT_TEST", "tests/test_foo.py::test_bar") monkeypatch.delenv("LDR_TEST_MODE", raising=False) from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 1 def test_ldr_test_mode_triggers_test_mode(self, monkeypatch): """LDR_TEST_MODE set → test iterations (1).""" monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) monkeypatch.setenv("LDR_TEST_MODE", "1") from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 1 def test_both_env_vars_set(self, monkeypatch): """Both env vars set → still returns test iterations.""" monkeypatch.setenv("PYTEST_CURRENT_TEST", "tests/test_foo.py::test_bar") monkeypatch.setenv("LDR_TEST_MODE", "1") from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 1 def test_empty_pytest_current_test_is_production(self, monkeypatch): """Empty string for PYTEST_CURRENT_TEST is falsy → production mode.""" monkeypatch.setenv("PYTEST_CURRENT_TEST", "") monkeypatch.delenv("LDR_TEST_MODE", raising=False) from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 100_000 def test_empty_ldr_test_mode_is_production(self, monkeypatch): """Empty string for LDR_TEST_MODE is falsy → production mode.""" monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) monkeypatch.setenv("LDR_TEST_MODE", "") from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 100_000 @pytest.mark.parametrize( "falsey", ["0", "false", "False", "no", "off", "banana"] ) def test_falsey_ldr_test_mode_is_production(self, monkeypatch, falsey): """LDR_TEST_MODE is parsed as a boolean: explicit falsey values (and unrecognised strings like 'banana') must NOT relax the floor. A bare truthiness check would treat any non-empty string as enabled and silently weaken encryption. """ # Load-bearing: _get_min_kdf_iterations() also relaxes the floor when # PYTEST_CURRENT_TEST is present (which it always is under pytest), so # we must clear it to isolate the LDR_TEST_MODE behaviour under test. monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) monkeypatch.setenv("LDR_TEST_MODE", falsey) from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 100_000 @pytest.mark.parametrize("truthy", ["true", "TRUE", "yes", "on", "enabled"]) def test_extended_truthy_ldr_test_mode_relaxes(self, monkeypatch, truthy): """LDR_TEST_MODE accepts the full boolean truthy set (to_bool), not just '1'/'true' — locks that behavior so a narrower parser would be caught. """ # Clear PYTEST_CURRENT_TEST so the relaxation we observe is attributable # to LDR_TEST_MODE, not pytest's own presence (see falsey test above). monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) monkeypatch.setenv("LDR_TEST_MODE", truthy) from local_deep_research.database.sqlcipher_utils import ( _get_min_kdf_iterations, ) assert _get_min_kdf_iterations() == 1 class TestKdfConstants: """Tests for KDF iteration constants.""" def test_production_constant_is_100k(self): """MIN_KDF_ITERATIONS_PRODUCTION should be 100_000.""" from local_deep_research.database.sqlcipher_utils import ( MIN_KDF_ITERATIONS_PRODUCTION, ) assert MIN_KDF_ITERATIONS_PRODUCTION == 100_000 def test_testing_constant_is_1(self): """MIN_KDF_ITERATIONS_TESTING should be 1.""" from local_deep_research.database.sqlcipher_utils import ( MIN_KDF_ITERATIONS_TESTING, ) assert MIN_KDF_ITERATIONS_TESTING == 1