Skip to content

Commit f7998e6

Browse files
committed
refactor: Delete provider status instead of marking as NOT_READY
Once a provider has been removed, there is no value in retaining a reference to it in the `_provider_status` dictionary. Instead of explicitly setting the status as `NOT_READY`, we can rely on this being the default status served from the `get_provider_status` method, allowing us to remove the dictionary entry entirely. Signed-off-by: Matthew Keeler <mkeeler@launchdarkly.com>
1 parent 1663a58 commit f7998e6

2 files changed

Lines changed: 68 additions & 1 deletion

File tree

openfeature/provider/_registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def _shutdown_provider(self, provider: FeatureProvider) -> None:
102102
try:
103103
if hasattr(provider, "shutdown"):
104104
provider.shutdown()
105-
self._provider_status[provider] = ProviderStatus.NOT_READY
105+
del self._provider_status[provider]
106106
except Exception as err:
107107
self.dispatch_event(
108108
provider,

tests/provider/test_registry.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from unittest.mock import Mock
22

33
from openfeature.exception import GeneralError
4+
from openfeature.provider import ProviderStatus
45
from openfeature.provider._registry import ProviderRegistry
56
from openfeature.provider.no_op_provider import NoOpProvider
67

@@ -172,3 +173,69 @@ def test_replacing_default_provider_used_as_domain_does_not_shutdown():
172173

173174
provider1.shutdown.assert_not_called()
174175
provider2.shutdown.assert_not_called()
176+
177+
178+
def test_shutting_down_registry_shuts_down_providers_once():
179+
"""Test that shutting down the registry shuts down each provider only once."""
180+
181+
registry = ProviderRegistry()
182+
provider1 = Mock()
183+
provider2 = Mock()
184+
185+
registry.set_default_provider(provider1)
186+
registry.set_provider("domain1", provider1)
187+
188+
registry.set_provider("domain2a", provider2)
189+
registry.set_provider("domain2b", provider2)
190+
191+
registry.shutdown()
192+
193+
provider1.shutdown.assert_called_once()
194+
provider2.shutdown.assert_called_once()
195+
196+
197+
def test_initializing_provider_sets_status_ready():
198+
"""Test that initializing a provider sets its status to READY."""
199+
200+
registry = ProviderRegistry()
201+
provider = Mock()
202+
203+
assert registry.get_provider_status(provider) == ProviderStatus.NOT_READY
204+
205+
registry.set_provider("domain", provider)
206+
207+
provider.initialize.assert_called_once()
208+
assert registry.get_provider_status(provider) == ProviderStatus.READY
209+
210+
211+
def test_shutting_down_provider_sets_status_not_ready():
212+
"""Test that shutting down a provider sets its status to NOT_READY."""
213+
214+
registry = ProviderRegistry()
215+
provider = Mock()
216+
217+
registry.set_provider("domain", provider)
218+
assert registry.get_provider_status(provider) == ProviderStatus.READY
219+
220+
registry.shutdown()
221+
assert registry.get_provider_status(provider) == ProviderStatus.NOT_READY
222+
223+
224+
def test_clearing_registry_resets_providers_and_default():
225+
"""Test that clearing the registry resets all providers and the default provider."""
226+
227+
registry = ProviderRegistry()
228+
provider = Mock()
229+
230+
registry.set_provider("domain", provider)
231+
registry.set_default_provider(provider)
232+
233+
registry.clear_providers()
234+
235+
default_provider = registry.get_default_provider()
236+
assert isinstance(default_provider, NoOpProvider)
237+
assert registry.get_provider("domain") is default_provider
238+
assert registry.get_provider_status(default_provider) == ProviderStatus.READY
239+
240+
provider.initialize.assert_called_once()
241+
provider.shutdown.assert_called_once()

0 commit comments

Comments
 (0)