db85a174b9
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been skipped
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Failing after 1m39s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m11s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 1m4s
CI/CD Pipeline / Unit Tests (push) Successful in 6m4s
CI/CD Pipeline / Integration Tests (push) Successful in 2m20s
CI/CD Pipeline / Frontend Lint (push) Successful in 36s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 1m48s
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) Failing after 9m40s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 1m16s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 2m52s
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 / Staging E2E Tests (push) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (push) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (push) Has been skipped
106 lines
4.1 KiB
Python
Executable File
106 lines
4.1 KiB
Python
Executable File
"""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
|