"""Tests for ownership rules and scoped config merges (hbd.server.config_access).""" import pytest from hbd.server import config_access as ca # --------------------------------------------------------------------------- # Visibility helpers # --------------------------------------------------------------------------- def test_is_global_when_no_owner(): assert ca.is_global({"type": "pushover"}) assert ca.is_global({"type": "email", "owner": ""}) assert ca.is_global(None) # non-dict is treated as global assert not ca.is_global({"type": "email", "owner": "alice"}) def test_user_can_use_global_or_own(): assert ca.user_can_use({"type": "pushover"}, "alice") assert ca.user_can_use({"owner": "alice"}, "alice") assert not ca.user_can_use({"owner": "bob"}, "alice") HOSTS = { "web1": {"owner": "alice", "watch": True}, "web2": {"owner": "bob", "managers": ["alice"]}, "web3": {"owner": "bob", "managers": "carol"}, # string manager form "web4": {"watch": True}, # unowned } def test_user_hosts_owner_and_manager(): assert set(ca.user_hosts(HOSTS, "alice")) == {"web1", "web2"} assert set(ca.user_hosts(HOSTS, "carol")) == {"web3"} assert ca.user_hosts(HOSTS, "dave") == {} assert ca.user_hosts(None, "alice") == {} CHANNELS = { "global_ch": {"type": "pushover"}, "alice_ch": {"type": "email", "owner": "alice"}, "bob_ch": {"type": "signal", "owner": "bob"}, } def test_user_channels_global_plus_own(): assert set(ca.user_channels(CHANNELS, "alice")) == {"global_ch", "alice_ch"} assert set(ca.user_channels(CHANNELS, "dave")) == {"global_ch"} TCS = { "default": {"thresholds": {}}, "alice_tc": {"owner": "alice", "thresholds": {}}, } def test_user_threshold_configs_global_plus_own(): assert set(ca.user_threshold_configs(TCS, "alice")) == {"default", "alice_tc"} assert set(ca.user_threshold_configs(TCS, "bob")) == {"default"}