From 32d65722e9fc2d9c0e7db20e92b961eb3b76d51a Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Thu, 25 Aug 2022 10:09:25 -0400 Subject: [PATCH] Handle multiple suggestions with different references (#3817) --- supervisor/resolution/fixup.py | 2 +- supervisor/resolution/fixups/base.py | 9 ++++++--- tests/resolution/test_resolution_manager.py | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/supervisor/resolution/fixup.py b/supervisor/resolution/fixup.py index 062f8bb3d..b567a3f78 100644 --- a/supervisor/resolution/fixup.py +++ b/supervisor/resolution/fixup.py @@ -70,4 +70,4 @@ class ResolutionFixup(CoreSysAttributes): async def apply_fixup(self, suggestion: Suggestion) -> None: """Apply a fixup for a suggestion.""" for fix in self.fixes_for_suggestion(suggestion): - await fix() + await fix(suggestion) diff --git a/supervisor/resolution/fixups/base.py b/supervisor/resolution/fixups/base.py index 6e30cb16d..085ee4ba1 100644 --- a/supervisor/resolution/fixups/base.py +++ b/supervisor/resolution/fixups/base.py @@ -17,10 +17,13 @@ class FixupBase(ABC, CoreSysAttributes): """Initialize the fixup class.""" self.coresys = coresys - async def __call__(self) -> None: + async def __call__(self, fixing_suggestion: Suggestion | None = None) -> None: """Execute the evaluation.""" - # Get suggestion to fix - fixing_suggestion: Suggestion | None = next(iter(self.all_suggestions), None) + if not fixing_suggestion: + # Get suggestion to fix + fixing_suggestion: Suggestion | None = next( + iter(self.all_suggestions), None + ) # No suggestion if fixing_suggestion is None: diff --git a/tests/resolution/test_resolution_manager.py b/tests/resolution/test_resolution_manager.py index b134c0497..1d6e0bb05 100644 --- a/tests/resolution/test_resolution_manager.py +++ b/tests/resolution/test_resolution_manager.py @@ -220,3 +220,22 @@ async def test_events_on_issue_changes(coresys: CoreSys): change_handler.assert_not_called() remove_handler.assert_called_once_with(issue) + + +async def test_resolution_apply_suggestion_multiple_copies(coresys: CoreSys): + """Test resolution manager applies correct suggestion when has multiple that differ by reference.""" + coresys.resolution.suggestions = remove_store_1 = Suggestion( + SuggestionType.EXECUTE_REMOVE, ContextType.STORE, "repo_1" + ) + coresys.resolution.suggestions = remove_store_2 = Suggestion( + SuggestionType.EXECUTE_REMOVE, ContextType.STORE, "repo_2" + ) + coresys.resolution.suggestions = remove_store_3 = Suggestion( + SuggestionType.EXECUTE_REMOVE, ContextType.STORE, "repo_3" + ) + + await coresys.resolution.apply_suggestion(remove_store_2) + + assert remove_store_1 in coresys.resolution.suggestions + assert remove_store_2 not in coresys.resolution.suggestions + assert remove_store_3 in coresys.resolution.suggestions