# retoor import pytest from devplacepy.services.nodes.registry import ( COUNTER_NAMES, NodeCounters, outcome_name, ) def test_inc_counts_both_the_live_view_and_the_pending_delta(): counters = NodeCounters() counters.inc("kicked") counters.inc("kicked") assert counters.snapshot()["kicked"] == 2 assert counters.take_pending() == {"kicked": 2} assert counters.take_pending() == {} assert counters.snapshot()["kicked"] == 2 def test_unknown_names_are_rejected(): counters = NodeCounters() with pytest.raises(KeyError): counters.inc("nope") def test_restore_pending_adds_back_what_a_failed_flush_took(): counters = NodeCounters() counters.inc("jobs_done") taken = counters.take_pending() counters.inc("jobs_done") counters.restore_pending(taken) assert counters.take_pending() == {"jobs_done": 2} def test_outcomes_are_validated_and_bounded_in_shape(): counters = NodeCounters() counters.observe("reddit", "residential", "ok") counters.observe("reddit", "residential", "ok") counters.observe("reddit", "", "blocked") assert counters.outcomes() == { "outcome:reddit:residential:ok": 2, "outcome:reddit:unknown:blocked": 1, } for adapter, asn_class, kind in (("Re:dit", "x", "ok"), ("reddit", "a b", "ok"), ("reddit", "x", "weird"), ("x" * 40, "x", "ok")): with pytest.raises(KeyError): outcome_name(adapter, asn_class, kind) def test_every_declared_counter_can_be_incremented(): counters = NodeCounters() for name in COUNTER_NAMES: counters.inc(name) assert all(value == 1 for value in counters.snapshot().values())