Spaces:
Running
Running
from os import remove | |
from pathlib import Path | |
from shutil import copyfile | |
import pytest | |
from voicevox_engine.preset.model import Preset | |
from voicevox_engine.preset.preset_manager import ( | |
PresetInputError, | |
PresetInternalError, | |
PresetManager, | |
) | |
presets_test_1_yaml_path = Path("test/unit/preset/presets-test-1.yaml") | |
presets_test_2_yaml_path = Path("test/unit/preset/presets-test-2.yaml") | |
presets_test_3_yaml_path = Path("test/unit/preset/presets-test-3.yaml") | |
presets_test_4_yaml_path = Path("test/unit/preset/presets-test-4.yaml") | |
def test_validation() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_1_yaml_path) | |
presets = preset_manager.load_presets() | |
assert presets is not None | |
def test_validation_same() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_1_yaml_path) | |
presets = preset_manager.load_presets() | |
presets2 = preset_manager.load_presets() | |
assert presets is not None | |
assert presets == presets2 | |
def test_validation_2() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) | |
true_msg = "プリセットの設定ファイルにミスがあります" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.load_presets() | |
def test_preset_id() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_3_yaml_path) | |
true_msg = "プリセットのidに重複があります" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.load_presets() | |
def test_empty_file() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_4_yaml_path) | |
true_msg = "プリセットの設定ファイルが空の内容です" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.load_presets() | |
def test_not_exist_file() -> None: | |
preset_manager = PresetManager(preset_path=Path("test/presets-dummy.yaml")) | |
true_msg = "プリセットの設定ファイルが見つかりません" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.load_presets() | |
def test_add_preset(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": 10, | |
"name": "test10", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
id = preset_manager.add_preset(preset) | |
assert id == 10 | |
assert len(preset_manager.presets) == 3 | |
for _preset in preset_manager.presets: | |
if _preset.id == id: | |
assert _preset == preset | |
remove(preset_path) | |
def test_add_preset_load_failure() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) | |
true_msg = "プリセットの設定ファイルにミスがあります" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.add_preset( | |
Preset( | |
**{ | |
"id": 1, | |
"name": "", | |
"speaker_uuid": "", | |
"style_id": 0, | |
"speedScale": 0, | |
"pitchScale": 0, | |
"intonationScale": 0, | |
"volumeScale": 0, | |
"prePhonemeLength": 0, | |
"postPhonemeLength": 0, | |
"pauseLength": 0, | |
"pauseLengthScale": 0, | |
} | |
) | |
) | |
def test_add_preset_conflict_id(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": 2, | |
"name": "test3", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
id = preset_manager.add_preset(preset) | |
assert id == 3 | |
assert len(preset_manager.presets) == 3 | |
for _preset in preset_manager.presets: | |
if _preset.id == id: | |
assert _preset == preset | |
remove(preset_path) | |
def test_add_preset_conflict_id2(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": -1, | |
"name": "test3", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
id = preset_manager.add_preset(preset) | |
assert id == 3 | |
assert len(preset_manager.presets) == 3 | |
for _preset in preset_manager.presets: | |
if _preset.id == id: | |
assert _preset == preset | |
remove(preset_path) | |
def test_add_preset_write_failure(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": 10, | |
"name": "test10", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
preset_manager.load_presets() | |
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign] | |
preset_manager.preset_path = "" # type: ignore[assignment] | |
true_msg = "プリセットの設定ファイルが見つかりません" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.add_preset(preset) | |
assert len(preset_manager.presets) == 2 | |
remove(preset_path) | |
def test_update_preset(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": 1, | |
"name": "test1 new", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
id = preset_manager.update_preset(preset) | |
assert id == 1 | |
assert len(preset_manager.presets) == 2 | |
for _preset in preset_manager.presets: | |
if _preset.id == id: | |
assert _preset == preset | |
remove(preset_path) | |
def test_update_preset_load_failure() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) | |
true_msg = "プリセットの設定ファイルにミスがあります" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.update_preset( | |
Preset( | |
**{ | |
"id": 1, | |
"name": "", | |
"speaker_uuid": "", | |
"style_id": 0, | |
"speedScale": 0, | |
"pitchScale": 0, | |
"intonationScale": 0, | |
"volumeScale": 0, | |
"prePhonemeLength": 0, | |
"postPhonemeLength": 0, | |
"pauseLength": 0, | |
"pauseLengthScale": 0, | |
} | |
) | |
) | |
def test_update_preset_not_found(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": 10, | |
"name": "test1 new", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
true_msg = "更新先のプリセットが存在しません" | |
with pytest.raises(PresetInputError, match=true_msg): | |
preset_manager.update_preset(preset) | |
assert len(preset_manager.presets) == 2 | |
remove(preset_path) | |
def test_update_preset_write_failure(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset = Preset( | |
**{ | |
"id": 1, | |
"name": "test1 new", | |
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", | |
"style_id": 2, | |
"speedScale": 1, | |
"pitchScale": 1, | |
"intonationScale": 0.5, | |
"volumeScale": 1, | |
"prePhonemeLength": 0.1, | |
"postPhonemeLength": 0.1, | |
"pauseLength": None, | |
"pauseLengthScale": 1.0, | |
} | |
) | |
preset_manager.load_presets() | |
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign] | |
preset_manager.preset_path = "" # type: ignore[assignment] | |
true_msg = "プリセットの設定ファイルが見つかりません" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.update_preset(preset) | |
assert len(preset_manager.presets) == 2 | |
assert preset_manager.presets[0].name == "test" | |
remove(preset_path) | |
def test_delete_preset(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
id = preset_manager.delete_preset(1) | |
assert id == 1 | |
assert len(preset_manager.presets) == 1 | |
remove(preset_path) | |
def test_delete_preset_load_failure() -> None: | |
preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) | |
true_msg = "プリセットの設定ファイルにミスがあります" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.delete_preset(10) | |
def test_delete_preset_not_found(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
true_msg = "削除対象のプリセットが存在しません" | |
with pytest.raises(PresetInputError, match=true_msg): | |
preset_manager.delete_preset(10) | |
assert len(preset_manager.presets) == 2 | |
remove(preset_path) | |
def test_delete_preset_write_failure(tmp_path: Path) -> None: | |
preset_path = tmp_path / "presets.yaml" | |
copyfile(presets_test_1_yaml_path, preset_path) | |
preset_manager = PresetManager(preset_path=preset_path) | |
preset_manager.load_presets() | |
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign] | |
preset_manager.preset_path = "" # type: ignore[assignment] | |
true_msg = "プリセットの設定ファイルが見つかりません" | |
with pytest.raises(PresetInternalError, match=true_msg): | |
preset_manager.delete_preset(1) | |
assert len(preset_manager.presets) == 2 | |
remove(preset_path) | |