|
| 1 | +import typing |
1 | 2 | from numbers import Number |
2 | 3 |
|
| 4 | +import pytest |
| 5 | + |
| 6 | +from openfeature.evaluation_context import EvaluationContext |
| 7 | +from openfeature.flag_evaluation import FlagResolutionDetails |
| 8 | +from openfeature.provider import AsyncAbstractProvider |
3 | 9 | from openfeature.provider.no_op_provider import NoOpProvider |
4 | 10 |
|
5 | 11 |
|
@@ -80,3 +86,66 @@ def test_should_resolve_object_flag_from_no_op(): |
80 | 86 | assert flag is not None |
81 | 87 | assert flag.value == return_value |
82 | 88 | assert isinstance(flag.value, dict) |
| 89 | + |
| 90 | + |
| 91 | +class ConcreteAsyncProvider(AsyncAbstractProvider): |
| 92 | + def get_metadata(self): |
| 93 | + return super().get_metadata() |
| 94 | + |
| 95 | + async def resolve_boolean_details( |
| 96 | + self, |
| 97 | + flag_key: str, |
| 98 | + default_value: bool, |
| 99 | + evaluation_context: typing.Optional[EvaluationContext] = None, |
| 100 | + ) -> FlagResolutionDetails[bool]: |
| 101 | + return await super().resolve_boolean_details(flag_key, default_value) |
| 102 | + |
| 103 | + async def resolve_string_details( |
| 104 | + self, |
| 105 | + flag_key: str, |
| 106 | + default_value: str, |
| 107 | + evaluation_context: typing.Optional[EvaluationContext] = None, |
| 108 | + ) -> FlagResolutionDetails[str]: |
| 109 | + return await super().resolve_string_details(flag_key, default_value) |
| 110 | + |
| 111 | + async def resolve_integer_details( |
| 112 | + self, |
| 113 | + flag_key: str, |
| 114 | + default_value: int, |
| 115 | + evaluation_context: typing.Optional[EvaluationContext] = None, |
| 116 | + ) -> FlagResolutionDetails[int]: |
| 117 | + return await super().resolve_integer_details(flag_key, default_value) |
| 118 | + |
| 119 | + async def resolve_float_details( |
| 120 | + self, |
| 121 | + flag_key: str, |
| 122 | + default_value: float, |
| 123 | + evaluation_context: typing.Optional[EvaluationContext] = None, |
| 124 | + ) -> FlagResolutionDetails[float]: |
| 125 | + return await super().resolve_float_details(flag_key, default_value) |
| 126 | + |
| 127 | + async def resolve_object_details( |
| 128 | + self, |
| 129 | + flag_key: str, |
| 130 | + default_value: typing.Union[dict, list], |
| 131 | + evaluation_context: typing.Optional[EvaluationContext] = None, |
| 132 | + ) -> FlagResolutionDetails[typing.Union[dict, list]]: |
| 133 | + return await super().resolve_object_details(flag_key, default_value) |
| 134 | + |
| 135 | + |
| 136 | +@pytest.mark.parametrize( |
| 137 | + "get_method, default", |
| 138 | + ( |
| 139 | + ("resolve_boolean_details", True), |
| 140 | + ("resolve_string_details", "default"), |
| 141 | + ("resolve_integer_details", 42), |
| 142 | + ("resolve_float_details", 3.14), |
| 143 | + ("resolve_object_details", {"key": "value"}), |
| 144 | + ), |
| 145 | +) |
| 146 | +@pytest.mark.asyncio |
| 147 | +async def test_abstract_provider_throws_not_implemented(get_method, default): |
| 148 | + with pytest.raises(NotImplementedError) as exception: |
| 149 | + provider = ConcreteAsyncProvider() |
| 150 | + await getattr(provider, get_method)("test_flag", default) |
| 151 | + assert str(exception.value) == "Method not implemented" |
0 commit comments