f506048240
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 1m47s
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Failing after 3m8s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m19s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 1m18s
CI/CD Pipeline / Unit Tests (push) Failing after 4m49s
CI/CD Pipeline / Integration Tests (push) Successful in 2m21s
CI/CD Pipeline / Frontend Lint (push) Successful in 52s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 2m42s
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
CI/CD Pipeline / Build Staging API Image (push) Successful in 11m24s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 1m44s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 3m15s
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (push) Failing after 32s
CI/CD Pipeline / Staging E2E Tests (push) Successful in 3m9s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 5m3s
CI/CD Pipeline / Canary Release to Production (push) Has been skipped
161 lines
6.0 KiB
Python
Executable File
161 lines
6.0 KiB
Python
Executable File
"""BGM工具函数领域层单元测试."""
|
|
|
|
import pytest
|
|
|
|
from packages.domain.bgm_utils import merge_bgm_config
|
|
|
|
|
|
class TestMergeBgmConfig:
|
|
"""merge_bgm_config 函数测试."""
|
|
|
|
def test_both_empty(self):
|
|
"""两个都是空字典."""
|
|
result = merge_bgm_config({}, {})
|
|
assert result == {}
|
|
|
|
def test_user_empty_returns_template_copy(self):
|
|
"""用户配置为空,返回模板配置的拷贝."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
result = merge_bgm_config(template, {})
|
|
assert result == template
|
|
# 确保是副本不是引用
|
|
result["volume"] = 0.9
|
|
assert template["volume"] == 0.5
|
|
|
|
def test_template_empty_returns_user_copy(self):
|
|
"""模板配置为空,返回用户配置的拷贝."""
|
|
user = {"enabled": False, "volume": 0.8}
|
|
result = merge_bgm_config({}, user)
|
|
assert result == user
|
|
# 确保是副本
|
|
result["volume"] = 0.1
|
|
assert user["volume"] == 0.8
|
|
|
|
def test_user_overrides_template(self):
|
|
"""用户配置覆盖模板配置."""
|
|
template = {"enabled": True, "volume": 0.5, "track": "default"}
|
|
user = {"volume": 0.8}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["volume"] == 0.8
|
|
assert result["track"] == "default"
|
|
|
|
def test_enabled_special_handling_user_not_set(self):
|
|
"""enabled 特殊处理:用户没传就保留模板的."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
user = {"volume": 0.8} # 没传 enabled
|
|
result = merge_bgm_config(template, user)
|
|
# 用户没传 enabled,保留模板的 True
|
|
assert result["enabled"] is True
|
|
assert result["volume"] == 0.8
|
|
|
|
def test_enabled_user_explicit_false(self):
|
|
"""用户显式传 enabled=False,应该覆盖模板."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
user = {"enabled": False}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["enabled"] is False
|
|
|
|
def test_enabled_user_explicit_true(self):
|
|
"""用户显式传 enabled=True,覆盖模板的 False."""
|
|
template = {"enabled": False, "volume": 0.5}
|
|
user = {"enabled": True}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["enabled"] is True
|
|
|
|
def test_full_override(self):
|
|
"""用户完全覆盖模板."""
|
|
template = {"enabled": True, "volume": 0.3, "track": "piano"}
|
|
user = {"enabled": False, "volume": 0.9, "track": "guitar"}
|
|
result = merge_bgm_config(template, user)
|
|
assert result == user
|
|
|
|
def test_partial_override_keep_rest(self):
|
|
"""部分覆盖,其余保留模板值."""
|
|
template = {
|
|
"enabled": True,
|
|
"volume": 0.5,
|
|
"fade_in": 1.0,
|
|
"fade_out": 1.0,
|
|
"track": "default",
|
|
}
|
|
user = {"volume": 0.7, "fade_in": 2.0}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["volume"] == 0.7
|
|
assert result["fade_in"] == 2.0
|
|
assert result["fade_out"] == 1.0
|
|
assert result["track"] == "default"
|
|
assert result["enabled"] is True # 用户没传,保留模板
|
|
|
|
def test_user_none(self):
|
|
"""user_bgm 为 None 的情况."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
result = merge_bgm_config(template, None) # type: ignore
|
|
assert result == template
|
|
|
|
def test_template_none(self):
|
|
"""template_bgm 为 None 的情况."""
|
|
user = {"enabled": False, "volume": 0.8}
|
|
result = merge_bgm_config(None, user) # type: ignore
|
|
assert result == user
|
|
|
|
def test_preserves_extra_fields(self):
|
|
"""保留模板中的额外字段(用户没覆盖的)."""
|
|
template = {"enabled": True, "volume": 0.5, "custom_field": "value"}
|
|
user = {"volume": 0.6}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["custom_field"] == "value"
|
|
|
|
def test_user_adds_new_fields(self):
|
|
"""用户可以添加模板中没有的新字段."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
user = {"loop": True, "start_time": 5.0}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["enabled"] is True
|
|
assert result["volume"] == 0.5
|
|
assert result["loop"] is True
|
|
assert result["start_time"] == 5.0
|
|
|
|
def test_nested_dict_behavior(self):
|
|
"""嵌套字典的合并行为(简单替换,不深度合并)."""
|
|
template = {"enabled": True, "effects": {"fade": True, "reverb": False}}
|
|
user = {"effects": {"reverb": True}}
|
|
result = merge_bgm_config(template, user)
|
|
# 简单合并,用户的 effects 整体覆盖模板的
|
|
assert result["effects"] == {"reverb": True}
|
|
|
|
def test_enabled_in_template_only(self):
|
|
"""只有模板有 enabled,用户没有."""
|
|
template = {"enabled": False, "volume": 0.5}
|
|
user = {"volume": 0.7}
|
|
result = merge_bgm_config(template, user)
|
|
# 用户没传 enabled,保留模板的 False
|
|
assert result["enabled"] is False
|
|
|
|
def test_both_have_enabled_false(self):
|
|
"""两边都有 enabled 且都是 False."""
|
|
template = {"enabled": False, "volume": 0.5}
|
|
user = {"enabled": False}
|
|
result = merge_bgm_config(template, user)
|
|
assert result["enabled"] is False
|
|
|
|
def test_return_type_is_dict(self):
|
|
"""返回类型是 dict."""
|
|
result = merge_bgm_config({"a": 1}, {"b": 2})
|
|
assert isinstance(result, dict)
|
|
|
|
def test_does_not_mutate_template(self):
|
|
"""不修改原始模板字典."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
template_copy = template.copy()
|
|
user = {"volume": 0.9}
|
|
merge_bgm_config(template, user)
|
|
assert template == template_copy
|
|
|
|
def test_does_not_mutate_user(self):
|
|
"""不修改原始用户字典."""
|
|
template = {"enabled": True, "volume": 0.5}
|
|
user = {"volume": 0.9}
|
|
user_copy = user.copy()
|
|
merge_bgm_config(template, user)
|
|
assert user == user_copy
|