Spaces:
Sleeping
Sleeping
| 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) | |