From 844f4879c0302dfaa0d7347914166a2d5b69499b Mon Sep 17 00:00:00 2001 From: Roland Walker Date: Fri, 3 Apr 2026 07:23:08 -0400 Subject: [PATCH] tests for mycli/packages/special/favoritequeries.py also making the return value of FavoriteQueries.list() a copy. --- changelog.md | 3 +- mycli/packages/special/favoritequeries.py | 2 +- test/pytests/test_favoritequeries.py | 100 ++++++++++++++++++++++ 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 test/pytests/test_favoritequeries.py diff --git a/changelog.md b/changelog.md index a6ec747f..1cb41047 100644 --- a/changelog.md +++ b/changelog.md @@ -14,6 +14,8 @@ Bug Fixes * More careful removal of redundant fuzzy completion suggestions. * Fix a corner case when listing an empty list of favorite queries. * Better completions refresh on changing databases or ALTERs. +* Make the return value of `FavoriteQueries.list()` a copy. +* Make multi-line detection and special cases more robust. Internal @@ -31,7 +33,6 @@ Internal * Refactor suggestion logic into declarative rules. * Factor the `--batch` execution modes out of `main.py`. * Sort coverage report in tox suite. -* Make multi-line detection and special cases more robust. 1.67.1 (2026/03/28) diff --git a/mycli/packages/special/favoritequeries.py b/mycli/packages/special/favoritequeries.py index ba2a6eac..1233ee85 100644 --- a/mycli/packages/special/favoritequeries.py +++ b/mycli/packages/special/favoritequeries.py @@ -44,7 +44,7 @@ def from_config(cls, config): return FavoriteQueries(config) def list(self) -> list[str | None]: - return self.config.get(self.section_name, []) + return list(self.config.get(self.section_name, {})) def get(self, name) -> str | None: return self.config.get(self.section_name, {}).get(name, None) diff --git a/test/pytests/test_favoritequeries.py b/test/pytests/test_favoritequeries.py new file mode 100644 index 00000000..c3c3aee7 --- /dev/null +++ b/test/pytests/test_favoritequeries.py @@ -0,0 +1,100 @@ +from collections.abc import Mapping + +from mycli.packages.special.favoritequeries import FavoriteQueries + + +class DummyConfig(dict): + def __init__(self, initial: Mapping[str, object] | None = None) -> None: + super().__init__(initial or {}) + self.encoding: str | None = None + self.write_calls = 0 + + def write(self) -> None: + self.write_calls += 1 + + +def test_from_config_returns_instance_with_same_config() -> None: + config = DummyConfig() + + favorites = FavoriteQueries.from_config(config) + + assert isinstance(favorites, FavoriteQueries) + assert favorites.config is config + + +def test_list_and_get_use_favorite_queries_section() -> None: + config = DummyConfig({ + 'favorite_queries': { + 'daily': 'select 1', + 'weekly': 'select 2', + }, + }) + favorites = FavoriteQueries(config) + + assert favorites.list() == ['daily', 'weekly'] + assert favorites.get('daily') == 'select 1' + assert favorites.get('missing') is None + + +def test_list_returns_empty_list_when_section_is_missing() -> None: + favorites = FavoriteQueries(DummyConfig()) + + assert favorites.list() == [] + + +def test_save_creates_section_sets_encoding_and_writes_config() -> None: + config = DummyConfig() + favorites = FavoriteQueries(config) + + favorites.save('demo', 'select 1') + + assert config.encoding == 'utf-8' + assert config == {'favorite_queries': {'demo': 'select 1'}} + assert config.write_calls == 1 + + +def test_save_updates_existing_section_and_writes_config() -> None: + config = DummyConfig({'favorite_queries': {'demo': 'select 1'}}) + favorites = FavoriteQueries(config) + + favorites.save('report', 'select 2') + + assert config.encoding == 'utf-8' + assert config['favorite_queries'] == { + 'demo': 'select 1', + 'report': 'select 2', + } + assert config.write_calls == 1 + + +def test_delete_removes_existing_favorite_and_writes_config() -> None: + config = DummyConfig({'favorite_queries': {'demo': 'select 1'}}) + favorites = FavoriteQueries(config) + + result = favorites.delete('demo') + + assert result == 'demo: Deleted.' + assert config['favorite_queries'] == {} + assert config.write_calls == 1 + + +def test_delete_returns_not_found_without_writing_config() -> None: + config = DummyConfig({'favorite_queries': {'demo': 'select 1'}}) + favorites = FavoriteQueries(config) + + result = favorites.delete('missing') + + assert result == 'missing: Not Found.' + assert config['favorite_queries'] == {'demo': 'select 1'} + assert config.write_calls == 0 + + +def test_delete_returns_not_found_when_section_is_missing() -> None: + config = DummyConfig() + favorites = FavoriteQueries(config) + + result = favorites.delete('missing') + + assert result == 'missing: Not Found.' + assert config == {} + assert config.write_calls == 0