008404f0af
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 37s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 53s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m2s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m14s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m14s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 34s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m16s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m36s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m36s
AI Code Review / AI Code Review (pull_request) Successful in 4m26s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m33s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 11m8s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 52m0s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
- bgm_utils: 12个测试(BGM合并逻辑/优先级/兼容层) - domain/exceptions: 18个测试(NotFound/Validation/QuotaExceeded/继承关系) - asset_libraries use case: 10个测试(列表/创建/命令对象) 合计+40
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
|