|
| 1 | +from collections import namedtuple |
| 2 | + |
1 | 3 | import pytest
|
2 | 4 |
|
3 | 5 | from pif import exceptions, providers
|
@@ -199,3 +201,109 @@ def test_factory():
|
199 | 201 |
|
200 | 202 | assert dict_alt == dict_1
|
201 | 203 | assert dict_alt is not dict_1
|
| 204 | + |
| 205 | + |
| 206 | +def test_transitive_factory_wired(): |
| 207 | + """ |
| 208 | + Checking the factory provider evaluates Provider args and kwargs. |
| 209 | + """ |
| 210 | + model = namedtuple("Model", "a b") |
| 211 | + |
| 212 | + provider_a = providers.Factory[str](lambda: "a") |
| 213 | + provider_b = providers.Factory[str](lambda: "b") |
| 214 | + |
| 215 | + provider = providers.Factory[tuple](model, provider_a, b=provider_b) |
| 216 | + |
| 217 | + assert provider_a() == "a" |
| 218 | + assert provider_b() == "b" |
| 219 | + |
| 220 | + model_1 = provider() |
| 221 | + model_2 = provider() |
| 222 | + assert model("a", "b") == model_1 |
| 223 | + assert model_1 == model_2 |
| 224 | + assert model_1 is not model_2 |
| 225 | + |
| 226 | + |
| 227 | +def test_transitive_factory_override(): |
| 228 | + """ |
| 229 | + Checking the factory provider generates different value when Provider arg and kwarg is overridden. |
| 230 | + """ |
| 231 | + model = namedtuple("Model", "a b") |
| 232 | + |
| 233 | + provider_a = providers.Factory[str](lambda: "a") |
| 234 | + provider_b = providers.Factory[str](lambda: "b") |
| 235 | + assert provider_a() == "a" |
| 236 | + assert provider_b() == "b" |
| 237 | + |
| 238 | + provider = providers.Factory[tuple](model, provider_a, b=provider_b) |
| 239 | + |
| 240 | + model_1 = provider() |
| 241 | + model_2 = provider() |
| 242 | + assert model("a", "b") == model_1 |
| 243 | + assert model_1 == model_2 |
| 244 | + assert model_1 is not model_2 |
| 245 | + |
| 246 | + with ( |
| 247 | + provider_a.override_existing("b"), |
| 248 | + provider_b.override_existing("a"), |
| 249 | + ): |
| 250 | + assert provider_a() == "b" |
| 251 | + assert provider_b() == "a" |
| 252 | + |
| 253 | + model_3 = provider() |
| 254 | + model_4 = provider() |
| 255 | + assert model("b", "a") == model_3 |
| 256 | + assert model_3 == model_4 |
| 257 | + assert model_3 is not model_4 |
| 258 | + |
| 259 | + model_5 = provider() |
| 260 | + model_6 = provider() |
| 261 | + assert model("a", "b") == model_5 |
| 262 | + assert model_5 == model_6 |
| 263 | + assert model_5 is not model_6 |
| 264 | + |
| 265 | + |
| 266 | +def test_transitive_singleton_wired(): |
| 267 | + """ |
| 268 | + Checking the singleton provider evaluates Provider args and kwargs. |
| 269 | + """ |
| 270 | + model = namedtuple("Model", "a b") |
| 271 | + |
| 272 | + provider_a = providers.Singleton[str](lambda: "a") |
| 273 | + provider_b = providers.Singleton[str](lambda: "b") |
| 274 | + assert provider_a() == "a" |
| 275 | + assert provider_b() == "b" |
| 276 | + |
| 277 | + provider = providers.Singleton[tuple](model, provider_a, provider_b) |
| 278 | + |
| 279 | + model_1 = provider() |
| 280 | + model_2 = provider() |
| 281 | + assert model("a", "b") == model_1 |
| 282 | + assert model_1 == model_2 |
| 283 | + assert model_1 is model_2 |
| 284 | + |
| 285 | + |
| 286 | +def test_transitive_singleton_override(): |
| 287 | + """ |
| 288 | + Checking the singleton provide retains cached value even when Provider arg and kwarg is overridden. |
| 289 | + """ |
| 290 | + model = namedtuple("Model", "a b") |
| 291 | + |
| 292 | + provider_a = providers.Singleton[str](lambda: "a") |
| 293 | + provider_b = providers.Singleton[str](lambda: "b") |
| 294 | + assert provider_a() == "a" |
| 295 | + assert provider_b() == "b" |
| 296 | + |
| 297 | + provider = providers.Singleton[tuple](model, provider_a, provider_b) |
| 298 | + |
| 299 | + model_1 = provider() |
| 300 | + model_2 = provider() |
| 301 | + assert model("a", "b") == model_1 |
| 302 | + assert model_1 == model_2 |
| 303 | + assert model_1 is model_2 |
| 304 | + |
| 305 | + with ( |
| 306 | + provider_a.override_existing("b"), |
| 307 | + provider_b.override_existing("a"), |
| 308 | + ): |
| 309 | + assert model_1 == provider() # Overriding does not change the cached value. |
0 commit comments