"""BGM 配置工具函数单元测试.""" import pytest from packages.domain.bgm_utils import merge_bgm_config class TestMergeBgmConfig: """merge_bgm_config 测试""" def test_user_bgm_empty_returns_template_copy(self): """用户配置为空时,返回模板配置的拷贝""" template = {"enabled": True, "volume": 0.5, "asset_id": "tpl_123"} result = merge_bgm_config(template, {}) assert result == template assert result is not template def test_user_bgm_none_returns_template_copy(self): """用户配置为 None 时,返回模板配置的拷贝""" template = {"enabled": True, "volume": 0.5} result = merge_bgm_config(template, None) # type: ignore assert result == template def test_template_bgm_empty_returns_user_copy(self): """模板配置为空时,返回用户配置的拷贝""" user = {"enabled": False, "volume": 0.8, "asset_id": "user_456"} result = merge_bgm_config({}, user) assert result == user assert result is not user def test_template_bgm_none_returns_user_copy(self): """模板配置为 None 时,返回用户配置的拷贝""" user = {"enabled": False, "volume": 0.8} result = merge_bgm_config(None, user) # type: ignore assert result == user def test_user_fields_override_template(self): """用户显式指定的字段覆盖模板对应字段""" template = { "enabled": True, "volume": 0.5, "asset_id": "tpl_123", "fade_in": 1.0, } user = { "volume": 0.8, "asset_id": "user_456", } result = merge_bgm_config(template, user) assert result["volume"] == 0.8 assert result["asset_id"] == "user_456" assert result["fade_in"] == 1.0 # 模板值保留 def test_enabled_not_in_user_preserves_template_enabled(self): """enabled 特殊处理:用户没传 enabled 时保留模板的 enabled 值""" template = {"enabled": True, "volume": 0.5} user = {"volume": 0.8} # 没传 enabled result = merge_bgm_config(template, user) assert result["enabled"] is True # 保留模板的 assert result["volume"] == 0.8 # 用户指定的覆盖 def test_enabled_in_user_overrides_template(self): """用户传了 enabled 时覆盖模板的 enabled""" template = {"enabled": True, "volume": 0.5} user = {"enabled": False, "volume": 0.8} result = merge_bgm_config(template, user) assert result["enabled"] is False assert result["volume"] == 0.8 def test_user_adds_new_fields(self): """用户配置中的新字段会被添加到结果中""" template = {"enabled": True, "volume": 0.5} user = {"sidechain_enabled": True, "sidechain_ratio": 0.6} result = merge_bgm_config(template, user) assert result["enabled"] is True assert result["volume"] == 0.5 assert result["sidechain_enabled"] is True assert result["sidechain_ratio"] == 0.6 def test_both_empty_returns_empty_dict(self): """两者都为空时返回空字典""" result = merge_bgm_config({}, {}) assert result == {} def test_nested_dict_shallow_merge(self): """嵌套字典是浅合并(当前设计)""" template = {"enabled": True, "config": {"eq": True, "compression": False}} user = {"config": {"compression": True, "reverb": 0.5}} result = merge_bgm_config(template, user) # 浅合并:整个 config 被用户值覆盖 assert result["config"] == {"compression": True, "reverb": 0.5} def test_does_not_mutate_template(self): """不修改原始模板配置""" template = {"enabled": True, "volume": 0.5} original = dict(template) merge_bgm_config(template, {"volume": 0.8}) assert template == original def test_does_not_mutate_user(self): """不修改原始用户配置""" user = {"volume": 0.8} original = dict(user) merge_bgm_config({"enabled": True}, user) assert user == original