From 29ca5bfbe10f3fd342ec1d718b64f959aed5a807 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Tue, 23 Sep 2025 07:25:48 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[WIP/TEST]=20Main=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E5=88=9D=E6=9C=9F=E5=8C=96=E3=83=AD=E3=82=B8?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E6=94=B9=E5=96=84=E3=81=97=E3=80=81?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E7=94=A8=E3=81=AE=E3=82=A8=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/mainloop.py | 32 +- src-python/test_endpoints.py | 727 +++++++++++++++++++++++++++++++++++ 2 files changed, 747 insertions(+), 12 deletions(-) create mode 100644 src-python/test_endpoints.py diff --git a/src-python/mainloop.py b/src-python/mainloop.py index 0010b98a..32b44dbd 100644 --- a/src-python/mainloop.py +++ b/src-python/mainloop.py @@ -347,9 +347,11 @@ init_mapping = {key:value for key, value in mapping.items() if key.startswith("/ controller.setInitMapping(init_mapping) class Main: - def __init__(self) -> None: + def __init__(self, controller_instance, mapping_data) -> None: self.queue = Queue() self.main_loop = True + self.controller = controller_instance + self.mapping = mapping_data def receiver(self) -> None: while True: @@ -360,7 +362,7 @@ class Main: endpoint = received_data.get("endpoint", None) data = received_data.get("data", None) data = encodeBase64(data) if data is not None else None - printLog(endpoint, {"receive_data":data}) + printLog(endpoint, {"receive_data": data}) self.queue.put((endpoint, data)) def startReceiver(self) -> None: @@ -369,7 +371,10 @@ class Main: th_receiver.start() def handleRequest(self, endpoint, data=None) -> tuple: - handler = mapping.get(endpoint) + result = None # デフォルト値を設定 + status = 500 # デフォルト値を設定 + + handler = self.mapping.get(endpoint) if handler is None: response = "Invalid endpoint" status = 404 @@ -385,6 +390,7 @@ class Main: errorLogging() result = str(e) status = 500 + return result, status def handler(self) -> None: @@ -417,13 +423,15 @@ class Main: def stop(self) -> None: self.main_loop = False -if __name__ == "__main__": - main = Main() - main.startReceiver() - main.startHandler() +# 外部から参照可能なインスタンスを提供 +main_instance = Main(controller_instance=controller, mapping_data=mapping) - controller.setWatchdogCallback(main.stop) - controller.init() +if __name__ == "__main__": + main_instance.startReceiver() + main_instance.startHandler() + + main_instance.controller.setWatchdogCallback(main_instance.stop) + main_instance.controller.init() # mappingのすべてのstatusをTrueにする for key in mapping.keys(): @@ -432,13 +440,13 @@ if __name__ == "__main__": process = "main" match process: case "main": - main.start() + main_instance.start() case "test": for _ in range(100): time.sleep(0.5) endpoint = "/get/data/mic_host_list" - result, status = main.handleRequest(endpoint) + result, status = main_instance.handleRequest(endpoint) printResponse(status, endpoint, result) case "test_all": @@ -639,6 +647,6 @@ if __name__ == "__main__": case _: data = None - result, status = main.handleRequest(endpoint, data) + result, status = main_instance.handleRequest(endpoint, data) printResponse(status, endpoint, result) time.sleep(0.5) \ No newline at end of file diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py new file mode 100644 index 00000000..03892fa8 --- /dev/null +++ b/src-python/test_endpoints.py @@ -0,0 +1,727 @@ +import sys +import unittest + +# 初期化のため、config.jsonの削除 +import os +if os.path.exists("config.json"): + os.remove("config.json") + +from mainloop import main_instance + +class TestMainloop(unittest.TestCase): + def setUp(self): + self.main = main_instance + self.main.startReceiver() + self.main.startHandler() + + def stop_main(): + pass + self.main.controller.setWatchdogCallback(stop_main) + self.main.controller.init() + + # mappingのすべてのstatusをTrueにする + for key in self.main.mapping.keys(): + self.main.mapping[key]["status"] = True + + def test_endpoints(self): + print("単体動作の確認") + # エンドポイントとテストデータの定義 + endpoints = { + # Main Window + "/set/enable/translation": [{"data": None, "status": 200, "result": True}], + "/set/disable/translation": [{"data": None, "status": 200, "result": False}], + "/set/enable/transcription_send": [{"data": None, "status": 200, "result": True}], + "/set/disable/transcription_send": [{"data": None, "status": 200, "result": False}], + "/set/enable/transcription_receive": [{"data": None, "status": 200, "result": True}], + "/set/disable/transcription_receive": [{"data": None, "status": 200, "result": False}], + "/set/enable/foreground": [{"data": None, "status": 200, "result": True}], + "/set/disable/foreground": [{"data": None, "status": 200, "result": False}], + "/get/data/selected_tab_no": [{"data": None, "status": 200, "result": "1"}], + "/set/data/selected_tab_no": [ + {"data": "1", "status": 200, "result": "1"}, + {"data": "2", "status": 200, "result": "2"}, + {"data": "3", "status": 200, "result": "3"}, + ], + "/get/data/main_window_sidebar_compact_mode": [{"data": None, "status": 200, "result": False}], + "/set/enable/main_window_sidebar_compact_mode": [{"data": None, "status": 200, "result": True}], + "/set/disable/main_window_sidebar_compact_mode": [{"data": None, "status": 200, "result": False}], + "/get/data/translation_engines": [{"data": None, "status": 200, "result": ['DeepL', 'Google', 'Bing', 'Papago', 'CTranslate2']}], + "/get/data/selectable_language_list": [ + { + "data": None, + "status": 200, + "result": + [ + {'language': 'Afrikaans', 'country': 'South Africa'}, + {'language': 'Albanian', 'country': 'Albania'}, + {'language': 'Amharic', 'country': 'Ethiopia'}, + {'language': 'Arabic', 'country': 'Algeria'}, + {'language': 'Arabic', 'country': 'Bahrain'}, + {'language': 'Arabic', 'country': 'Egypt'}, + {'language': 'Arabic', 'country': 'Israel'}, + {'language': 'Arabic', 'country': 'Iraq'}, + {'language': 'Arabic', 'country': 'Jordan'}, + {'language': 'Arabic', 'country': 'Kuwait'}, + {'language': 'Arabic', 'country': 'Lebanon'}, + {'language': 'Arabic', 'country': 'Mauritania'}, + {'language': 'Arabic', 'country': 'Morocco'}, + {'language': 'Arabic', 'country': 'Oman'}, + {'language': 'Arabic', 'country': 'Qatar'}, + {'language': 'Arabic', 'country': 'Saudi Arabia'}, + {'language': 'Arabic', 'country': 'Palestine'}, + {'language': 'Arabic', 'country': 'Syria'}, + {'language': 'Arabic', 'country': 'Tunisia'}, + {'language': 'Arabic', 'country': 'United Arab Emirates'}, + {'language': 'Arabic', 'country': 'Yemen'}, + {'language': 'Armenian', 'country': 'Armenia'}, + {'language': 'Azerbaijani', 'country': 'Azerbaijan'}, + {'language': 'Basque', 'country': 'Spain'}, + {'language': 'Bengali', 'country': 'Bangladesh'}, + {'language': 'Bengali', 'country': 'India'}, + {'language': 'Bosnian', 'country': 'Bosnia and Herzegovina'}, + {'language': 'Bulgarian', 'country': 'Bulgaria'}, + {'language': 'Catalan', 'country': 'Spain'}, + {'language': 'Chinese Simplified', 'country': 'China'}, + {'language': 'Chinese Simplified', 'country': 'Hong Kong'}, + {'language': 'Chinese Traditional', 'country': 'Taiwan'}, + {'language': 'Chinese Traditional', 'country': 'Hong Kong'}, + {'language': 'Croatian', 'country': 'Croatia'}, + {'language': 'Czech', 'country': 'Czech Republic'}, + {'language': 'Danish', 'country': 'Denmark'}, + {'language': 'Dutch', 'country': 'Belgium'}, + {'language': 'Dutch', 'country': 'Netherlands'}, + {'language': 'English', 'country': 'Australia'}, + {'language': 'English', 'country': 'Canada'}, + {'language': 'English', 'country': 'Ghana'}, + {'language': 'English', 'country': 'Hong Kong'}, + {'language': 'English', 'country': 'India'}, + {'language': 'English', 'country': 'Ireland'}, + {'language': 'English', 'country': 'Kenya'}, + {'language': 'English', 'country': 'New Zealand'}, + {'language': 'English', 'country': 'Nigeria'}, + {'language': 'English', 'country': 'Philippines'}, + {'language': 'English', 'country': 'Singapore'}, + {'language': 'English', 'country': 'South Africa'}, + {'language': 'English', 'country': 'Tanzania'}, + {'language': 'English', 'country': 'United Kingdom'}, + {'language': 'English', 'country': 'United States'}, + {'language': 'Estonian', 'country': 'Estonia'}, + {'language': 'Filipino', 'country': 'Philippines'}, + {'language': 'Finnish', 'country': 'Finland'}, + {'language': 'French', 'country': 'Belgium'}, + {'language': 'French', 'country': 'Canada'}, + {'language': 'French', 'country': 'France'}, + {'language': 'French', 'country': 'Switzerland'}, + {'language': 'Galician', 'country': 'Spain'}, + {'language': 'Georgian', 'country': 'Georgia'}, + {'language': 'German', 'country': 'Austria'}, + {'language': 'German', 'country': 'Germany'}, + {'language': 'German', 'country': 'Switzerland'}, + {'language': 'Greek', 'country': 'Greece'}, + {'language': 'Gujarati', 'country': 'India'}, + {'language': 'Hebrew', 'country': 'Israel'}, + {'language': 'Hindi', 'country': 'India'}, + {'language': 'Hungarian', 'country': 'Hungary'}, + {'language': 'Icelandic', 'country': 'Iceland'}, + {'language': 'Indonesian', 'country': 'Indonesia'}, + {'language': 'Italian', 'country': 'Italy'}, + {'language': 'Italian', 'country': 'Switzerland'}, + {'language': 'Japanese', 'country': 'Japan'}, + {'language': 'Kannada', 'country': 'India'}, + {'language': 'Kazakh', 'country': 'Kazakhstan'}, + {'language': 'Khmer', 'country': 'Cambodia'}, + {'language': 'Korean', 'country': 'South Korea'}, + {'language': 'Lao', 'country': 'Laos'}, + {'language': 'Latvian', 'country': 'Latvia'}, + {'language': 'Lithuanian', 'country': 'Lithuania'}, + {'language': 'Macedonian', 'country': 'North Macedonia'}, + {'language': 'Malay', 'country': 'Malaysia'}, + {'language': 'Malayalam', 'country': 'India'}, + {'language': 'Mongolian', 'country': 'Mongolia'}, + {'language': 'Nepali', 'country': 'Nepal'}, + {'language': 'Norwegian', 'country': 'Norway'}, + {'language': 'Persian', 'country': 'Iran'}, + {'language': 'Polish', 'country': 'Poland'}, + {'language': 'Portuguese', 'country': 'Brazil'}, + {'language': 'Portuguese', 'country': 'Portugal'}, + {'language': 'Romanian', 'country': 'Romania'}, + {'language': 'Russian', 'country': 'Russia'}, + {'language': 'Serbian', 'country': 'Serbia'}, + {'language': 'Sinhala', 'country': 'Sri Lanka'}, + {'language': 'Slovak', 'country': 'Slovakia'}, + {'language': 'Slovenian', 'country': 'Slovenia'}, + {'language': 'Spanish', 'country': 'Argentina'}, + {'language': 'Spanish', 'country': 'Bolivia'}, + {'language': 'Spanish', 'country': 'Chile'}, + {'language': 'Spanish', 'country': 'Colombia'}, + {'language': 'Spanish', 'country': 'Costa Rica'}, + {'language': 'Spanish', 'country': 'Dominican Republic'}, + {'language': 'Spanish', 'country': 'Ecuador'}, + {'language': 'Spanish', 'country': 'El Salvador'}, + {'language': 'Spanish', 'country': 'Guatemala'}, + {'language': 'Spanish', 'country': 'Honduras'}, + {'language': 'Spanish', 'country': 'Mexico'}, + {'language': 'Spanish', 'country': 'Nicaragua'}, + {'language': 'Spanish', 'country': 'Panama'}, + {'language': 'Spanish', 'country': 'Paraguay'}, + {'language': 'Spanish', 'country': 'Peru'}, + {'language': 'Spanish', 'country': 'Puerto Rico'}, + {'language': 'Spanish', 'country': 'Spain'}, + {'language': 'Spanish', 'country': 'United States'}, + {'language': 'Spanish', 'country': 'Uruguay'}, + {'language': 'Spanish', 'country': 'Venezuela'}, + {'language': 'Sundanese', 'country': 'Indonesia'}, + {'language': 'Swahili', 'country': 'Kenya'}, + {'language': 'Swahili', 'country': 'Tanzania'}, + {'language': 'Swedish', 'country': 'Sweden'}, + {'language': 'Tamil', 'country': 'India'}, + {'language': 'Tamil', 'country': 'malaysia'}, + {'language': 'Tamil', 'country': 'Singapore'}, + {'language': 'Tamil', 'country': 'Sri Lanka'}, + {'language': 'Telugu', 'country': 'India'}, + {'language': 'Thai', 'country': 'Thailand'}, + {'language': 'Turkish', 'country': 'Turkey'}, + {'language': 'Ukrainian', 'country': 'Ukraine'}, + {'language': 'Urdu', 'country': 'India'}, + {'language': 'Urdu', 'country': 'Pakistan'}, + {'language': 'Uzbek', 'country': 'Uzbekistan'}, + {'language': 'Vietnamese', 'country': 'Vietnam'} + ]}], + "/get/data/selected_translation_engines": [{"data": None, "status": 200, "result": {'1': 'CTranslate2', '2': 'CTranslate2', '3': 'CTranslate2'}}], + "/set/data/selected_translation_engines": [ + { + "data": {'1': 'DeepL', '2': 'Google', '3': 'Papago'}, + "status": 200, + "result": {'1': 'DeepL', '2': 'Google', '3': 'Papago'} + }, + ], + "/get/data/selected_your_languages": [ + { + "data": None, + "status": 200, + "result": { + '1': { + '1': { + 'language': 'Japanese', + 'country': 'Japan', + 'enable': True + } + }, + '2': { + '1': { + 'language': 'Japanese', + 'country': 'Japan', + 'enable': True + } + }, + '3': { + '1': { + 'language': 'Japanese', + 'country': 'Japan', + 'enable': True + } + } + } + } + ], + "/set/data/selected_your_languages": [ + { + "data": { + '1': { + '1': { + 'language': 'Japanese', + 'country': 'Japan', + 'enable': True + }, + }, + '2': { + '1': { + 'language': 'English', + 'country': 'United States', + 'enable': True + }, + }, + '3': { + '1': { + 'language': 'French', + 'country': 'France', + 'enable': True + } + } + }, + "status": 200, + "result": { + '1': { + '1': { + 'language': 'Japanese', + 'country': 'Japan', + 'enable': True + }, + }, + '2': { + '1': { + 'language': 'English', + 'country': 'United States', + 'enable': True + }, + }, + '3': { + '1': { + 'language': 'French', + 'country': 'France', + 'enable': True + } + } + } + } + ], + "/get/data/selected_target_languages": [ + { + "data": None, + "status": 200, + "result": { + "1": { + "1": { + "language": "English", + "country": "United States", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": False + }, + "3": { + "language": "English", + "country": "United States", + "enable": False + } + }, + "2": { + "1": { + "language": "English", + "country": "United States", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": False + }, + "3": { + "language": "English", + "country": "United States", + "enable": False + } + }, + "3": { + "1": { + "language": "English", + "country": "United States", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": False + }, + "3": { + "language": "English", + "country": "United States", + "enable": False + } + } + }, + } + ], + "/set/data/selected_target_languages": [ + { + "data": { + "1": { + "1": { + "language": "Japanese", + "country": "Japan", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": True + }, + "3": { + "language": "French", + "country": "France", + "enable": True + } + }, + "2": { + "1": { + "language": "Japanese", + "country": "Japan", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": True + }, + "3": { + "language": "French", + "country": "France", + "enable": True + } + }, + "3": { + "1": { + "language": "Japanese", + "country": "Japan", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": True + }, + "3": { + "language": "French", + "country": "France", + "enable": True + } + } + }, + "status": 200, + "result": { + "1": { + "1": { + "language": "Japanese", + "country": "Japan", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": True + }, + "3": { + "language": "French", + "country": "France", + "enable": True + } + }, + "2": { + "1": { + "language": "Japanese", + "country": "Japan", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": True + }, + "3": { + "language": "French", + "country": "France", + "enable": True + } + }, + "3": { + "1": { + "language": "Japanese", + "country": "Japan", + "enable": True + }, + "2": { + "language": "English", + "country": "United States", + "enable": True + }, + "3": { + "language": "French", + "country": "France", + "enable": True + } + } + }, + } + ], + "/get/data/transcription_engines": [{"data": None, "status": 200, "result": ['Google', 'Whisper']}], + "/get/data/selected_transcription_engine": [{"data": None, "status": 200, "result": "Google"}], + "/set/data/selected_transcription_engine": [ + {"data": "Google", "status": 200, "result": "Google"}, + {"data": "Whisper", "status": 200, "result": "Whisper"}, + ], + "/run/send_message_box": [ + { + "data": {"id":"123456", "message":"test"}, + "status": 200, + "result": { + 'id': '123456', + 'original': { + 'message': 'test', + 'transliteration': [] + }, + 'translations': [] + } + } + ], + "/run/typing_message_box": [{"data": None, "status": 200, "result": True}], + "/run/stop_typing_message_box": [{"data": None, "status": 200, "result": True}], + "/run/send_text_overlay": [{"data": "test_overlay", "status": 200, "result": "test_overlay"}], + "/run/swap_your_language_and_target_language": [{"data": None, "status": 200, "result": True}], + # !!!Cant be tested here!!! + # "/run/update_software": [{"data": None, "status": 200, "result": True}], + # "/run/update_cuda_software": [{"data": None, "status": 200, "result": True}], + + # Config Window + # Appearance + "/get/data/version": [{"data": None, "status": 200, "result": "3.2.2"}], + "/get/data/transparency": [{"data": None, "status": 200, "result": 100}], + "/set/data/transparency": [ + {"data": 100, "status": 200, "result": 100}, + {"data": 80, "status": 200, "result": 80}, + {"data": 50, "status": 200, "result": 50}, + {"data": 20, "status": 200, "result": 20}, + {"data": 0, "status": 200, "result": 0}, + ], + "/get/data/ui_scaling": [{"data": None, "status": 200, "result": 100}], + "/set/data/ui_scaling": [ + {"data": 100, "status": 200, "result": 100}, + {"data": 80, "status": 200, "result": 80}, + {"data": 50, "status": 200, "result": 50}, + {"data": 20, "status": 200, "result": 20}, + {"data": 10, "status": 200, "result": 10}, + ], + "/get/data/textbox_ui_scaling": [{"data": None, "status": 200, "result": 100}], + "/set/data/textbox_ui_scaling": [ + {"data": 100, "status": 200, "result": 100}, + {"data": 80, "status": 200, "result": 80}, + {"data": 50, "status": 200, "result": 50}, + {"data": 20, "status": 200, "result": 20}, + {"data": 10, "status": 200, "result": 10}, + ], + "/get/data/message_box_ratio": [{"data": None, "status": 200, "result": 10}], + "/set/data/message_box_ratio": [ + {"data": 10, "status": 200, "result": 10}, + {"data": 9, "status": 200, "result": 5.5}, + {"data": 1, "status": 200, "result": 1}, + ], + "/get/data/send_message_button_type": [{"data": None, "status": 200, "result": "show"}], + "/set/data/send_message_button_type": [ + {"data": "show", "status": 200, "result": "show"}, + {"data": "hide", "status": 200, "result": "hide"}, + {"data": "show_and_disable_enter_key", "status": 200, "result": "show_and_disable_enter_key"}, + ], + "/get/data/show_resend_button": [{"data": None, "status": 200, "result": False}], + "/set/enable/show_resend_button": [{"data": None, "status": 200, "result": True}], + "/set/disable/show_resend_button": [{"data": None, "status": 200, "result": False}], + "/get/data/font_family": [{"data": None, "status": 200, "result": "Yu Gothic UI"}], + "/set/data/font_family": [{"data": "Yu Gothic UI", "status": 200, "result": "Yu Gothic UI"}], + "/get/data/ui_language": [{"data": None, "status": 200, "result": "en"}], + "/set/data/ui_language": [ + {"data": "en", "status": 200, "result": "en"}, + {"data": "ja", "status": 200, "result": "ja"}, + {"data": "ko", "status": 200, "result": "ko"}, + {"data": "zh-Hant", "status": 200, "result": "zh-Hant"}, + {"data": "zh-Hans", "status": 200, "result": "zh-Hans"}, + ], + "/get/data/main_window_geometry": [{"data": None, "status": 200, "result": {"x_pos": 0, "y_pos": 0, "width": 870, "height": 654}}], + "/set/data/main_window_geometry": [ + { + "data": {"x_pos": 0, "y_pos": 0, "width": 870, "height": 654}, + "status": 200, + "result": {"x_pos": 0, "y_pos": 0, "width": 870, "height": 654} + }, + ], + # Compute device + "/get/data/compute_mode": [{"data": None, "status": 200, "result": "cpu"}], + "/get/data/translation_compute_device_list": [{"data": None, "status": 200, "result": [{"device": "cpu", "device_index": 0, "device_name": "cpu"}]}], + "/get/data/selected_translation_compute_device": [{"data": None, "status": 200, "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"}}], + "/set/data/selected_translation_compute_device": [ + { + "data": {"device": "cpu", "device_index": 0, "device_name": "cpu"}, + "status": 200, + "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"} + } + ], + "/get/data/transcription_compute_device_list": [ + { + "data": None, + "status": 200, + "result": [{"device": "cpu", "device_index": 0, "device_name": "cpu"}] + } + ], + "/get/data/selected_transcription_compute_device": [ + { + "data": None, + "status": 200, + "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"} + } + ], + "/set/data/selected_transcription_compute_device": [ + { + "data": {"device": "cpu", "device_index": 0, "device_name": "cpu"}, + "status": 200, + "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"} + }, + ], + # Translation + "/get/data/selectable_ctranslate2_weight_type_dict": [ + { + "data": None, + "status": 200, + "result": {"small": True, "large": False} + }, + ], + "/get/data/ctranslate2_weight_type": [ + { + "data": "small", + "status": 200, + "result": "small" + }, + ], + # "/set/data/ctranslate2_weight_type": {"data": None}, + # "/run/download_ctranslate2_weight": {"data": None}, + # "/get/data/deepl_auth_key": {"data": None}, + # "/set/data/deepl_auth_key": {"data": None}, + # "/delete/data/deepl_auth_key": {"data": None}, + # "/get/data/convert_message_to_romaji": {"data": None}, + # "/set/enable/convert_message_to_romaji": {"data": None}, + # "/set/disable/convert_message_to_romaji": {"data": None}, + # "/get/data/convert_message_to_hiragana": {"data": None}, + # "/set/enable/convert_message_to_hiragana": {"data": None}, + # "/set/disable/convert_message_to_hiragana": {"data": None}, + # # Transcription + # "/get/data/mic_host_list": {"data": None}, + # "/get/data/mic_device_list": {"data": None}, + # "/get/data/speaker_device_list": {"data": None}, + # "/get/data/auto_mic_select": {"data": None}, + # "/set/enable/auto_mic_select": {"data": None}, + # "/set/disable/auto_mic_select": {"data": None}, + # "/get/data/selected_mic_host": {"data": None}, + # "/set/data/selected_mic_host": {"data": None}, + # "/get/data/selected_mic_device": {"data": None}, + # "/set/data/selected_mic_device": {"data": None}, + # "/get/data/mic_threshold": {"data": None}, + # "/set/data/mic_threshold": {"data": None}, + # "/get/data/mic_automatic_threshold": {"data": None}, + # "/set/enable/mic_automatic_threshold": {"data": None}, + # "/set/disable/mic_automatic_threshold": {"data": None}, + # "/get/data/mic_record_timeout": {"data": None}, + # "/set/data/mic_record_timeout": {"data": None}, + # "/get/data/mic_phrase_timeout": {"data": None}, + # "/set/data/mic_phrase_timeout": {"data": None}, + # "/get/data/mic_max_phrases": {"data": None}, + # "/set/data/mic_max_phrases": {"data": None}, + # "/get/data/hotkeys": {"data": None}, + # "/set/data/hotkeys": {"data": None}, + # "/get/data/plugins_status": {"data": None}, + # "/set/data/plugins_status": {"data": None}, + # "/get/data/mic_avg_logprob": {"data": None}, + # "/set/data/mic_avg_logprob": {"data": None}, + # "/get/data/mic_no_speech_prob": {"data": None}, + # "/set/data/mic_no_speech_prob": {"data": None}, + # "/set/enable/check_mic_threshold": {"data": None}, + # "/set/disable/check_mic_threshold": {"data": None}, + # "/get/data/mic_word_filter": {"data": None}, + # "/set/data/mic_word_filter": {"data": None}, + # "/get/data/auto_speaker_select": {"data": None}, + # "/set/enable/auto_speaker_select": {"data": None}, + # "/set/disable/auto_speaker_select": {"data": None}, + # "/get/data/selected_speaker_device": {"data": None}, + # "/set/data/selected_speaker_device": {"data": None}, + # "/get/data/speaker_threshold": {"data": None}, + # "/set/data/speaker_threshold": {"data": None}, + # "/get/data/speaker_automatic_threshold": {"data": None}, + # "/set/enable/speaker_automatic_threshold": {"data": None}, + # "/set/disable/speaker_automatic_threshold": {"data": None}, + # "/get/data/speaker_record_timeout": {"data": None}, + # "/set/data/speaker_record_timeout": {"data": None}, + # "/get/data/speaker_phrase_timeout": {"data": None}, + # "/set/data/speaker_phrase_timeout": {"data": None}, + # "/get/data/speaker_max_phrases": {"data": None}, + # "/set/data/speaker_max_phrases": {"data": None}, + # "/get/data/speaker_avg_logprob": {"data": None}, + # "/set/data/speaker_avg_logprob": {"data": None}, + # "/get/data/speaker_no_speech_prob": {"data": None}, + # "/set/data/speaker_no_speech_prob": {"data": None}, + # "/set/enable/check_speaker_threshold": {"data": None}, + # "/set/disable/check_speaker_threshold": {"data": None}, + # "/get/data/selectable_whisper_weight_type_dict": {"data": None}, + # "/get/data/whisper_weight_type": {"data": None}, + # "/set/data/whisper_weight_type": {"data": None}, + # "/run/download_whisper_weight": {"data": None}, + # # VR + # "/get/data/overlay_small_log": {"data": None}, + # "/set/enable/overlay_small_log": {"data": None}, + # "/set/disable/overlay_small_log": {"data": None}, + # "/get/data/overlay_small_log_settings": {"data": None}, + # "/set/data/overlay_small_log_settings": {"data": None}, + # "/get/data/overlay_large_log": {"data": None}, + # "/set/enable/overlay_large_log": {"data": None}, + # "/set/disable/overlay_large_log": {"data": None}, + # "/get/data/overlay_large_log_settings": {"data": None}, + # "/set/data/overlay_large_log_settings": {"data": None}, + # "/get/data/overlay_show_only_translated_messages": {"data": None}, + # "/set/enable/overlay_show_only_translated_messages": {"data": None}, + # "/set/disable/overlay_show_only_translated_messages": {"data": None}, + # # Others + # "/get/data/send_message_format_parts": {"data": None}, + # "/set/data/send_message_format_parts": {"data": None}, + # "/get/data/received_message_format_parts": {"data": None}, + # "/set/data/received_message_format_parts": {"data": None}, + # "/get/data/auto_clear_message_box": {"data": None}, + # "/set/enable/auto_clear_message_box": {"data": None}, + # "/set/disable/auto_clear_message_box": {"data": None}, + # "/get/data/send_only_translated_messages": {"data": None}, + # "/set/enable/send_only_translated_messages": {"data": None}, + # "/set/disable/send_only_translated_messages": {"data": None}, + # "/get/data/logger_feature": {"data": None}, + # "/set/enable/logger_feature": {"data": None}, + # "/set/disable/logger_feature": {"data": None}, + # "/run/open_filepath_logs": {"data": None}, + # "/get/data/vrc_mic_mute_sync": {"data": None}, + # "/set/enable/vrc_mic_mute_sync": {"data": None}, + # "/set/disable/vrc_mic_mute_sync": {"data": None}, + # "/get/data/send_message_to_vrc": {"data": None}, + # "/set/enable/send_message_to_vrc": {"data": None}, + # "/set/disable/send_message_to_vrc": {"data": None}, + # "/get/data/send_received_message_to_vrc": {"data": None}, + # "/set/enable/send_received_message_to_vrc": {"data": None}, + # "/set/disable/send_received_message_to_vrc": {"data": None}, + # # WebSocket Settings + # "/get/data/websocket_host": {"data": None}, + # "/set/data/websocket_host": {"data": None}, + # "/get/data/websocket_port": {"data": None}, + # "/set/data/websocket_port": {"data": None}, + # "/get/data/websocket_server": {"data": None}, + # "/set/enable/websocket_server": {"data": None}, + # "/set/disable/websocket_server": {"data": None}, + # # Advanced Settings + # "/get/data/osc_ip_address": {"data": None}, + # "/set/data/osc_ip_address": {"data": None}, + # "/get/data/osc_port": {"data": None}, + # "/set/data/osc_port": {"data": None}, + # "/get/data/notification_vrc_sfx": {"data": None}, + # "/set/enable/notification_vrc_sfx": {"data": None}, + # "/set/disable/notification_vrc_sfx": {"data": None}, + # "/run/open_filepath_config_file": {"data": None}, + # "/run/feed_watchdog": {"data": None}, + } + + for endpoint, value in endpoints.items(): + with self.subTest(endpoint=endpoint): + for item in value: + input_data = item["data"] + expected_status = item["status"] + expected_result = item["result"] + result, status = self.main.handleRequest(endpoint, input_data) + print(f"Endpoint: {endpoint}, Status: {status}, Result: {result}") + self.assertEqual(status, expected_status) + self.assertEqual(result, expected_result) + + def tearDown(self): + self.main.stop() + +if __name__ == "__main__": + unittest.main() \ No newline at end of file From 1689a45e3e4ac61500941c5b779494912c2b24a0 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Tue, 23 Sep 2025 14:45:08 +0900 Subject: [PATCH 02/11] Refactor test_endpoints.py: Enhance endpoint testing with structured tests for ON/OFF states, random access, and continuous testing. Introduce Color class for colored output and streamline endpoint handling logic. --- src-python/controller.py | 40 +- src-python/test_endpoints.py | 918 +++++++++-------------------------- 2 files changed, 262 insertions(+), 696 deletions(-) diff --git a/src-python/controller.py b/src-python/controller.py index b10d5617..ec287267 100644 --- a/src-python/controller.py +++ b/src-python/controller.py @@ -1699,14 +1699,16 @@ class Controller: @staticmethod def setEnableLoggerFeature(*args, **kwargs) -> dict: - config.LOGGER_FEATURE = True - model.startLogger() + if config.LOGGER_FEATURE is False: + model.startLogger() + config.LOGGER_FEATURE = True return {"status":200, "result":config.LOGGER_FEATURE} @staticmethod def setDisableLoggerFeature(*args, **kwargs) -> dict: - model.stopLogger() - config.LOGGER_FEATURE = False + if config.LOGGER_FEATURE is True: + model.stopLogger() + config.LOGGER_FEATURE = False return {"status":200, "result":config.LOGGER_FEATURE} @staticmethod @@ -2245,24 +2247,28 @@ class Controller: @staticmethod def setEnableWebSocketServer(*args, **kwargs) -> dict: - if isAvailableWebSocketServer(config.WEBSOCKET_HOST, config.WEBSOCKET_PORT) is True: - model.startWebSocketServer(config.WEBSOCKET_HOST, config.WEBSOCKET_PORT) - config.WEBSOCKET_SERVER = True - response = {"status":200, "result":config.WEBSOCKET_SERVER} - else: - response = { - "status":400, - "result":{ - "message":"WebSocket server host or port is not available", - "data": config.WEBSOCKET_SERVER + if config.WEBSOCKET_SERVER is False: + if isAvailableWebSocketServer(config.WEBSOCKET_HOST, config.WEBSOCKET_PORT) is True: + model.startWebSocketServer(config.WEBSOCKET_HOST, config.WEBSOCKET_PORT) + config.WEBSOCKET_SERVER = True + response = {"status":200, "result":config.WEBSOCKET_SERVER} + else: + response = { + "status":400, + "result":{ + "message":"WebSocket server host or port is not available", + "data": config.WEBSOCKET_SERVER + } } - } + else: + response = {"status":200, "result":config.WEBSOCKET_SERVER} return response @staticmethod def setDisableWebSocketServer(*args, **kwargs) -> dict: - config.WEBSOCKET_SERVER = False - model.stopWebSocketServer() + if config.WEBSOCKET_SERVER is True: + config.WEBSOCKET_SERVER = False + model.stopWebSocketServer() return {"status":200, "result":config.WEBSOCKET_SERVER} def initializationProgress(self, progress): diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index 03892fa8..b0664b50 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -1,15 +1,40 @@ -import sys -import unittest - # 初期化のため、config.jsonの削除 import os +import pprint +import time +import random if os.path.exists("config.json"): os.remove("config.json") from mainloop import main_instance -class TestMainloop(unittest.TestCase): - def setUp(self): +class Color: + BLACK = '\033[30m'#(文字)黒 + RED = '\033[31m'#(文字)赤 + GREEN = '\033[32m'#(文字)緑 + YELLOW = '\033[33m'#(文字)黄 + BLUE = '\033[34m'#(文字)青 + MAGENTA = '\033[35m'#(文字)マゼンタ + CYAN = '\033[36m'#(文字)シアン + WHITE = '\033[37m'#(文字)白 + COLOR_DEFAULT = '\033[39m'#文字色をデフォルトに戻す + BOLD = '\033[1m'#太字 + UNDERLINE = '\033[4m'#下線 + INVISIBLE = '\033[08m'#不可視 + REVERCE = '\033[07m'#文字色と背景色を反転 + BG_BLACK = '\033[40m'#(背景)黒 + BG_RED = '\033[41m'#(背景)赤 + BG_GREEN = '\033[42m'#(背景)緑 + BG_YELLOW = '\033[43m'#(背景)黄 + BG_BLUE = '\033[44m'#(背景)青 + BG_MAGENTA = '\033[45m'#(背景)マゼンタ + BG_CYAN = '\033[46m'#(背景)シアン + BG_WHITE = '\033[47m'#(背景)白 + BG_DEFAULT = '\033[49m'#背景色をデフォルトに戻す + RESET = '\033[0m'#全てリセット + +class TestMainloop(): + def __init__(self): self.main = main_instance self.main.startReceiver() self.main.startHandler() @@ -23,434 +48,119 @@ class TestMainloop(unittest.TestCase): for key in self.main.mapping.keys(): self.main.mapping[key]["status"] = True - def test_endpoints(self): - print("単体動作の確認") - # エンドポイントとテストデータの定義 - endpoints = { - # Main Window - "/set/enable/translation": [{"data": None, "status": 200, "result": True}], - "/set/disable/translation": [{"data": None, "status": 200, "result": False}], - "/set/enable/transcription_send": [{"data": None, "status": 200, "result": True}], - "/set/disable/transcription_send": [{"data": None, "status": 200, "result": False}], - "/set/enable/transcription_receive": [{"data": None, "status": 200, "result": True}], - "/set/disable/transcription_receive": [{"data": None, "status": 200, "result": False}], - "/set/enable/foreground": [{"data": None, "status": 200, "result": True}], - "/set/disable/foreground": [{"data": None, "status": 200, "result": False}], - "/get/data/selected_tab_no": [{"data": None, "status": 200, "result": "1"}], - "/set/data/selected_tab_no": [ - {"data": "1", "status": 200, "result": "1"}, - {"data": "2", "status": 200, "result": "2"}, - {"data": "3", "status": 200, "result": "3"}, - ], - "/get/data/main_window_sidebar_compact_mode": [{"data": None, "status": 200, "result": False}], - "/set/enable/main_window_sidebar_compact_mode": [{"data": None, "status": 200, "result": True}], - "/set/disable/main_window_sidebar_compact_mode": [{"data": None, "status": 200, "result": False}], - "/get/data/translation_engines": [{"data": None, "status": 200, "result": ['DeepL', 'Google', 'Bing', 'Papago', 'CTranslate2']}], - "/get/data/selectable_language_list": [ - { - "data": None, - "status": 200, - "result": - [ - {'language': 'Afrikaans', 'country': 'South Africa'}, - {'language': 'Albanian', 'country': 'Albania'}, - {'language': 'Amharic', 'country': 'Ethiopia'}, - {'language': 'Arabic', 'country': 'Algeria'}, - {'language': 'Arabic', 'country': 'Bahrain'}, - {'language': 'Arabic', 'country': 'Egypt'}, - {'language': 'Arabic', 'country': 'Israel'}, - {'language': 'Arabic', 'country': 'Iraq'}, - {'language': 'Arabic', 'country': 'Jordan'}, - {'language': 'Arabic', 'country': 'Kuwait'}, - {'language': 'Arabic', 'country': 'Lebanon'}, - {'language': 'Arabic', 'country': 'Mauritania'}, - {'language': 'Arabic', 'country': 'Morocco'}, - {'language': 'Arabic', 'country': 'Oman'}, - {'language': 'Arabic', 'country': 'Qatar'}, - {'language': 'Arabic', 'country': 'Saudi Arabia'}, - {'language': 'Arabic', 'country': 'Palestine'}, - {'language': 'Arabic', 'country': 'Syria'}, - {'language': 'Arabic', 'country': 'Tunisia'}, - {'language': 'Arabic', 'country': 'United Arab Emirates'}, - {'language': 'Arabic', 'country': 'Yemen'}, - {'language': 'Armenian', 'country': 'Armenia'}, - {'language': 'Azerbaijani', 'country': 'Azerbaijan'}, - {'language': 'Basque', 'country': 'Spain'}, - {'language': 'Bengali', 'country': 'Bangladesh'}, - {'language': 'Bengali', 'country': 'India'}, - {'language': 'Bosnian', 'country': 'Bosnia and Herzegovina'}, - {'language': 'Bulgarian', 'country': 'Bulgaria'}, - {'language': 'Catalan', 'country': 'Spain'}, - {'language': 'Chinese Simplified', 'country': 'China'}, - {'language': 'Chinese Simplified', 'country': 'Hong Kong'}, - {'language': 'Chinese Traditional', 'country': 'Taiwan'}, - {'language': 'Chinese Traditional', 'country': 'Hong Kong'}, - {'language': 'Croatian', 'country': 'Croatia'}, - {'language': 'Czech', 'country': 'Czech Republic'}, - {'language': 'Danish', 'country': 'Denmark'}, - {'language': 'Dutch', 'country': 'Belgium'}, - {'language': 'Dutch', 'country': 'Netherlands'}, - {'language': 'English', 'country': 'Australia'}, - {'language': 'English', 'country': 'Canada'}, - {'language': 'English', 'country': 'Ghana'}, - {'language': 'English', 'country': 'Hong Kong'}, - {'language': 'English', 'country': 'India'}, - {'language': 'English', 'country': 'Ireland'}, - {'language': 'English', 'country': 'Kenya'}, - {'language': 'English', 'country': 'New Zealand'}, - {'language': 'English', 'country': 'Nigeria'}, - {'language': 'English', 'country': 'Philippines'}, - {'language': 'English', 'country': 'Singapore'}, - {'language': 'English', 'country': 'South Africa'}, - {'language': 'English', 'country': 'Tanzania'}, - {'language': 'English', 'country': 'United Kingdom'}, - {'language': 'English', 'country': 'United States'}, - {'language': 'Estonian', 'country': 'Estonia'}, - {'language': 'Filipino', 'country': 'Philippines'}, - {'language': 'Finnish', 'country': 'Finland'}, - {'language': 'French', 'country': 'Belgium'}, - {'language': 'French', 'country': 'Canada'}, - {'language': 'French', 'country': 'France'}, - {'language': 'French', 'country': 'Switzerland'}, - {'language': 'Galician', 'country': 'Spain'}, - {'language': 'Georgian', 'country': 'Georgia'}, - {'language': 'German', 'country': 'Austria'}, - {'language': 'German', 'country': 'Germany'}, - {'language': 'German', 'country': 'Switzerland'}, - {'language': 'Greek', 'country': 'Greece'}, - {'language': 'Gujarati', 'country': 'India'}, - {'language': 'Hebrew', 'country': 'Israel'}, - {'language': 'Hindi', 'country': 'India'}, - {'language': 'Hungarian', 'country': 'Hungary'}, - {'language': 'Icelandic', 'country': 'Iceland'}, - {'language': 'Indonesian', 'country': 'Indonesia'}, - {'language': 'Italian', 'country': 'Italy'}, - {'language': 'Italian', 'country': 'Switzerland'}, - {'language': 'Japanese', 'country': 'Japan'}, - {'language': 'Kannada', 'country': 'India'}, - {'language': 'Kazakh', 'country': 'Kazakhstan'}, - {'language': 'Khmer', 'country': 'Cambodia'}, - {'language': 'Korean', 'country': 'South Korea'}, - {'language': 'Lao', 'country': 'Laos'}, - {'language': 'Latvian', 'country': 'Latvia'}, - {'language': 'Lithuanian', 'country': 'Lithuania'}, - {'language': 'Macedonian', 'country': 'North Macedonia'}, - {'language': 'Malay', 'country': 'Malaysia'}, - {'language': 'Malayalam', 'country': 'India'}, - {'language': 'Mongolian', 'country': 'Mongolia'}, - {'language': 'Nepali', 'country': 'Nepal'}, - {'language': 'Norwegian', 'country': 'Norway'}, - {'language': 'Persian', 'country': 'Iran'}, - {'language': 'Polish', 'country': 'Poland'}, - {'language': 'Portuguese', 'country': 'Brazil'}, - {'language': 'Portuguese', 'country': 'Portugal'}, - {'language': 'Romanian', 'country': 'Romania'}, - {'language': 'Russian', 'country': 'Russia'}, - {'language': 'Serbian', 'country': 'Serbia'}, - {'language': 'Sinhala', 'country': 'Sri Lanka'}, - {'language': 'Slovak', 'country': 'Slovakia'}, - {'language': 'Slovenian', 'country': 'Slovenia'}, - {'language': 'Spanish', 'country': 'Argentina'}, - {'language': 'Spanish', 'country': 'Bolivia'}, - {'language': 'Spanish', 'country': 'Chile'}, - {'language': 'Spanish', 'country': 'Colombia'}, - {'language': 'Spanish', 'country': 'Costa Rica'}, - {'language': 'Spanish', 'country': 'Dominican Republic'}, - {'language': 'Spanish', 'country': 'Ecuador'}, - {'language': 'Spanish', 'country': 'El Salvador'}, - {'language': 'Spanish', 'country': 'Guatemala'}, - {'language': 'Spanish', 'country': 'Honduras'}, - {'language': 'Spanish', 'country': 'Mexico'}, - {'language': 'Spanish', 'country': 'Nicaragua'}, - {'language': 'Spanish', 'country': 'Panama'}, - {'language': 'Spanish', 'country': 'Paraguay'}, - {'language': 'Spanish', 'country': 'Peru'}, - {'language': 'Spanish', 'country': 'Puerto Rico'}, - {'language': 'Spanish', 'country': 'Spain'}, - {'language': 'Spanish', 'country': 'United States'}, - {'language': 'Spanish', 'country': 'Uruguay'}, - {'language': 'Spanish', 'country': 'Venezuela'}, - {'language': 'Sundanese', 'country': 'Indonesia'}, - {'language': 'Swahili', 'country': 'Kenya'}, - {'language': 'Swahili', 'country': 'Tanzania'}, - {'language': 'Swedish', 'country': 'Sweden'}, - {'language': 'Tamil', 'country': 'India'}, - {'language': 'Tamil', 'country': 'malaysia'}, - {'language': 'Tamil', 'country': 'Singapore'}, - {'language': 'Tamil', 'country': 'Sri Lanka'}, - {'language': 'Telugu', 'country': 'India'}, - {'language': 'Thai', 'country': 'Thailand'}, - {'language': 'Turkish', 'country': 'Turkey'}, - {'language': 'Ukrainian', 'country': 'Ukraine'}, - {'language': 'Urdu', 'country': 'India'}, - {'language': 'Urdu', 'country': 'Pakistan'}, - {'language': 'Uzbek', 'country': 'Uzbekistan'}, - {'language': 'Vietnamese', 'country': 'Vietnam'} - ]}], - "/get/data/selected_translation_engines": [{"data": None, "status": 200, "result": {'1': 'CTranslate2', '2': 'CTranslate2', '3': 'CTranslate2'}}], - "/set/data/selected_translation_engines": [ - { - "data": {'1': 'DeepL', '2': 'Google', '3': 'Papago'}, - "status": 200, - "result": {'1': 'DeepL', '2': 'Google', '3': 'Papago'} - }, - ], - "/get/data/selected_your_languages": [ - { - "data": None, - "status": 200, - "result": { - '1': { - '1': { - 'language': 'Japanese', - 'country': 'Japan', - 'enable': True - } - }, - '2': { - '1': { - 'language': 'Japanese', - 'country': 'Japan', - 'enable': True - } - }, - '3': { - '1': { - 'language': 'Japanese', - 'country': 'Japan', - 'enable': True - } - } - } - } - ], - "/set/data/selected_your_languages": [ - { - "data": { - '1': { - '1': { - 'language': 'Japanese', - 'country': 'Japan', - 'enable': True - }, - }, - '2': { - '1': { - 'language': 'English', - 'country': 'United States', - 'enable': True - }, - }, - '3': { - '1': { - 'language': 'French', - 'country': 'France', - 'enable': True - } - } - }, - "status": 200, - "result": { - '1': { - '1': { - 'language': 'Japanese', - 'country': 'Japan', - 'enable': True - }, - }, - '2': { - '1': { - 'language': 'English', - 'country': 'United States', - 'enable': True - }, - }, - '3': { - '1': { - 'language': 'French', - 'country': 'France', - 'enable': True - } - } - } - } - ], - "/get/data/selected_target_languages": [ - { - "data": None, - "status": 200, - "result": { - "1": { - "1": { - "language": "English", - "country": "United States", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": False - }, - "3": { - "language": "English", - "country": "United States", - "enable": False - } - }, - "2": { - "1": { - "language": "English", - "country": "United States", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": False - }, - "3": { - "language": "English", - "country": "United States", - "enable": False - } - }, - "3": { - "1": { - "language": "English", - "country": "United States", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": False - }, - "3": { - "language": "English", - "country": "United States", - "enable": False - } - } - }, - } - ], - "/set/data/selected_target_languages": [ - { - "data": { - "1": { - "1": { - "language": "Japanese", - "country": "Japan", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": True - }, - "3": { - "language": "French", - "country": "France", - "enable": True - } - }, - "2": { - "1": { - "language": "Japanese", - "country": "Japan", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": True - }, - "3": { - "language": "French", - "country": "France", - "enable": True - } - }, - "3": { - "1": { - "language": "Japanese", - "country": "Japan", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": True - }, - "3": { - "language": "French", - "country": "France", - "enable": True - } - } - }, - "status": 200, - "result": { - "1": { - "1": { - "language": "Japanese", - "country": "Japan", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": True - }, - "3": { - "language": "French", - "country": "France", - "enable": True - } - }, - "2": { - "1": { - "language": "Japanese", - "country": "Japan", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": True - }, - "3": { - "language": "French", - "country": "France", - "enable": True - } - }, - "3": { - "1": { - "language": "Japanese", - "country": "Japan", - "enable": True - }, - "2": { - "language": "English", - "country": "United States", - "enable": True - }, - "3": { - "language": "French", - "country": "France", - "enable": True - } - } - }, - } - ], - "/get/data/transcription_engines": [{"data": None, "status": 200, "result": ['Google', 'Whisper']}], - "/get/data/selected_transcription_engine": [{"data": None, "status": 200, "result": "Google"}], - "/set/data/selected_transcription_engine": [ - {"data": "Google", "status": 200, "result": "Google"}, - {"data": "Whisper", "status": 200, "result": "Whisper"}, - ], + self.config_dict = {} + for endpoint in self.main.mapping.keys(): + if endpoint.startswith("/get/data/"): + self.config_dict[endpoint.split("/")[-1]] = self.main.handleRequest(endpoint, None)[0] + elif endpoint.startswith("/set/disable/"): + self.config_dict[endpoint.split("/")[-1]] = self.main.handleRequest(endpoint, None)[0] + print(self.config_dict) + + self.validity_endpoints = [ + "/set/enable/translation", + "/set/disable/translation", + "/set/enable/transcription_send", + "/set/disable/transcription_send", + "/set/enable/transcription_receive", + "/set/disable/transcription_receive", + "/set/enable/foreground", + "/set/disable/foreground", + "/set/enable/main_window_sidebar_compact_mode", + "/set/disable/main_window_sidebar_compact_mode", + "/set/enable/show_resend_button", + "/set/disable/show_resend_button", + "/set/enable/convert_message_to_romaji", + "/set/disable/convert_message_to_romaji", + "/set/enable/convert_message_to_hiragana", + "/set/disable/convert_message_to_hiragana", + # "/set/enable/auto_mic_select", + # "/set/disable/auto_mic_select", + "/set/enable/mic_automatic_threshold", + "/set/disable/mic_automatic_threshold", + # "/set/enable/check_mic_threshold", + # "/set/disable/check_mic_threshold", + # "/set/enable/auto_speaker_select", + # "/set/disable/auto_speaker_select", + "/set/enable/speaker_automatic_threshold", + "/set/disable/speaker_automatic_threshold", + # "/set/enable/check_speaker_threshold", + # "/set/disable/check_speaker_threshold", + "/set/enable/overlay_small_log", + "/set/disable/overlay_small_log", + "/set/enable/overlay_large_log", + "/set/disable/overlay_large_log", + "/set/enable/overlay_show_only_translated_messages", + "/set/disable/overlay_show_only_translated_messages", + "/set/enable/auto_clear_message_box", + "/set/disable/auto_clear_message_box", + "/set/enable/send_only_translated_messages", + "/set/disable/send_only_translated_messages", + "/set/enable/logger_feature", + "/set/disable/logger_feature", + "/set/enable/vrc_mic_mute_sync", + "/set/disable/vrc_mic_mute_sync", + "/set/enable/send_message_to_vrc", + "/set/disable/send_message_to_vrc", + "/set/enable/send_received_message_to_vrc", + "/set/disable/send_received_message_to_vrc", + "/set/enable/websocket_server", + "/set/disable/websocket_server", + "/set/enable/notification_vrc_sfx", + "/set/disable/notification_vrc_sfx", + ] + + self.set_data_endpoints = [ + "/set/data/selected_tab_no", + "/set/data/selected_translation_engines", + "/set/data/selected_your_languages", + "/set/data/selected_target_languages" + "/set/data/selected_transcription_engine", + "/set/data/transparency", + "/set/data/ui_scaling", + "/set/data/textbox_ui_scaling", + "/set/data/message_box_ratio", + "/set/data/send_message_button_type", + "/set/data/font_family", + "/set/data/ui_language", + "/set/data/main_window_geometry", + "/set/data/selected_translation_compute_device", + "/set/data/selected_transcription_compute_device", + "/set/data/ctranslate2_weight_type", + "/set/data/deepl_auth_key", + "/set/data/selected_mic_host", + "/set/data/selected_mic_device", + "/set/data/mic_threshold", + "/set/data/mic_record_timeout", + "/set/data/mic_phrase_timeout", + "/set/data/mic_max_phrases", + "/set/data/hotkeys", + "/set/data/plugins_status", + "/set/data/mic_avg_logprob", + "/set/data/mic_no_speech_prob", + "/set/data/mic_word_filter", + "/set/data/selected_speaker_device", + "/set/data/speaker_threshold", + "/set/data/speaker_record_timeout", + "/set/data/speaker_phrase_timeout", + "/set/data/speaker_max_phrases", + "/set/data/speaker_avg_logprob", + "/set/data/speaker_no_speech_prob", + "/set/data/whisper_weight_type", + "/set/data/overlay_small_log_settings", + "/set/data/overlay_large_log_settings", + "/set/data/send_message_format_parts", + "/set/data/received_message_format_parts", + "/set/data/websocket_host", + "/set/data/websocket_port", + "/set/data/osc_ip_address", + "/set/data/osc_port", + ] + + self.delete_data_endpoints = [ + "/delete/data/deepl_auth_key", + ] + + self.run_endpoints = { "/run/send_message_box": [ { "data": {"id":"123456", "message":"test"}, @@ -472,256 +182,106 @@ class TestMainloop(unittest.TestCase): # !!!Cant be tested here!!! # "/run/update_software": [{"data": None, "status": 200, "result": True}], # "/run/update_cuda_software": [{"data": None, "status": 200, "result": True}], - - # Config Window - # Appearance - "/get/data/version": [{"data": None, "status": 200, "result": "3.2.2"}], - "/get/data/transparency": [{"data": None, "status": 200, "result": 100}], - "/set/data/transparency": [ - {"data": 100, "status": 200, "result": 100}, - {"data": 80, "status": 200, "result": 80}, - {"data": 50, "status": 200, "result": 50}, - {"data": 20, "status": 200, "result": 20}, - {"data": 0, "status": 200, "result": 0}, + "/run/download_ctranslate2_weight": [ + {"data": "small", "status": 200, "result": True}, + {"data": "large", "status": 400, "result": False}, ], - "/get/data/ui_scaling": [{"data": None, "status": 200, "result": 100}], - "/set/data/ui_scaling": [ - {"data": 100, "status": 200, "result": 100}, - {"data": 80, "status": 200, "result": 80}, - {"data": 50, "status": 200, "result": 50}, - {"data": 20, "status": 200, "result": 20}, - {"data": 10, "status": 200, "result": 10}, + "/run/download_whisper_weight": [ + {"data": "tiny", "status": 200, "result": True}, + {"data": "base", "status": 200, "result": True}, + {"data": "small", "status": 200, "result": True}, + {"data": "medium", "status": 200, "result": True}, + {"data": "large-v1", "status": 200, "result": True}, + {"data": "large-v2", "status": 400, "result": False}, + {"data": "large-v3", "status": 400, "result": False}, + {"data": "large-v3-turbo-int8", "status": 400, "result": False}, + {"data": "large-v3-turbo", "status": 400, "result": False} ], - "/get/data/textbox_ui_scaling": [{"data": None, "status": 200, "result": 100}], - "/set/data/textbox_ui_scaling": [ - {"data": 100, "status": 200, "result": 100}, - {"data": 80, "status": 200, "result": 80}, - {"data": 50, "status": 200, "result": 50}, - {"data": 20, "status": 200, "result": 20}, - {"data": 10, "status": 200, "result": 10}, - ], - "/get/data/message_box_ratio": [{"data": None, "status": 200, "result": 10}], - "/set/data/message_box_ratio": [ - {"data": 10, "status": 200, "result": 10}, - {"data": 9, "status": 200, "result": 5.5}, - {"data": 1, "status": 200, "result": 1}, - ], - "/get/data/send_message_button_type": [{"data": None, "status": 200, "result": "show"}], - "/set/data/send_message_button_type": [ - {"data": "show", "status": 200, "result": "show"}, - {"data": "hide", "status": 200, "result": "hide"}, - {"data": "show_and_disable_enter_key", "status": 200, "result": "show_and_disable_enter_key"}, - ], - "/get/data/show_resend_button": [{"data": None, "status": 200, "result": False}], - "/set/enable/show_resend_button": [{"data": None, "status": 200, "result": True}], - "/set/disable/show_resend_button": [{"data": None, "status": 200, "result": False}], - "/get/data/font_family": [{"data": None, "status": 200, "result": "Yu Gothic UI"}], - "/set/data/font_family": [{"data": "Yu Gothic UI", "status": 200, "result": "Yu Gothic UI"}], - "/get/data/ui_language": [{"data": None, "status": 200, "result": "en"}], - "/set/data/ui_language": [ - {"data": "en", "status": 200, "result": "en"}, - {"data": "ja", "status": 200, "result": "ja"}, - {"data": "ko", "status": 200, "result": "ko"}, - {"data": "zh-Hant", "status": 200, "result": "zh-Hant"}, - {"data": "zh-Hans", "status": 200, "result": "zh-Hans"}, - ], - "/get/data/main_window_geometry": [{"data": None, "status": 200, "result": {"x_pos": 0, "y_pos": 0, "width": 870, "height": 654}}], - "/set/data/main_window_geometry": [ - { - "data": {"x_pos": 0, "y_pos": 0, "width": 870, "height": 654}, - "status": 200, - "result": {"x_pos": 0, "y_pos": 0, "width": 870, "height": 654} - }, - ], - # Compute device - "/get/data/compute_mode": [{"data": None, "status": 200, "result": "cpu"}], - "/get/data/translation_compute_device_list": [{"data": None, "status": 200, "result": [{"device": "cpu", "device_index": 0, "device_name": "cpu"}]}], - "/get/data/selected_translation_compute_device": [{"data": None, "status": 200, "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"}}], - "/set/data/selected_translation_compute_device": [ - { - "data": {"device": "cpu", "device_index": 0, "device_name": "cpu"}, - "status": 200, - "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"} - } - ], - "/get/data/transcription_compute_device_list": [ - { - "data": None, - "status": 200, - "result": [{"device": "cpu", "device_index": 0, "device_name": "cpu"}] - } - ], - "/get/data/selected_transcription_compute_device": [ - { - "data": None, - "status": 200, - "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"} - } - ], - "/set/data/selected_transcription_compute_device": [ - { - "data": {"device": "cpu", "device_index": 0, "device_name": "cpu"}, - "status": 200, - "result": {"device": "cpu", "device_index": 0, "device_name": "cpu"} - }, - ], - # Translation - "/get/data/selectable_ctranslate2_weight_type_dict": [ - { - "data": None, - "status": 200, - "result": {"small": True, "large": False} - }, - ], - "/get/data/ctranslate2_weight_type": [ - { - "data": "small", - "status": 200, - "result": "small" - }, - ], - # "/set/data/ctranslate2_weight_type": {"data": None}, - # "/run/download_ctranslate2_weight": {"data": None}, - # "/get/data/deepl_auth_key": {"data": None}, - # "/set/data/deepl_auth_key": {"data": None}, - # "/delete/data/deepl_auth_key": {"data": None}, - # "/get/data/convert_message_to_romaji": {"data": None}, - # "/set/enable/convert_message_to_romaji": {"data": None}, - # "/set/disable/convert_message_to_romaji": {"data": None}, - # "/get/data/convert_message_to_hiragana": {"data": None}, - # "/set/enable/convert_message_to_hiragana": {"data": None}, - # "/set/disable/convert_message_to_hiragana": {"data": None}, - # # Transcription - # "/get/data/mic_host_list": {"data": None}, - # "/get/data/mic_device_list": {"data": None}, - # "/get/data/speaker_device_list": {"data": None}, - # "/get/data/auto_mic_select": {"data": None}, - # "/set/enable/auto_mic_select": {"data": None}, - # "/set/disable/auto_mic_select": {"data": None}, - # "/get/data/selected_mic_host": {"data": None}, - # "/set/data/selected_mic_host": {"data": None}, - # "/get/data/selected_mic_device": {"data": None}, - # "/set/data/selected_mic_device": {"data": None}, - # "/get/data/mic_threshold": {"data": None}, - # "/set/data/mic_threshold": {"data": None}, - # "/get/data/mic_automatic_threshold": {"data": None}, - # "/set/enable/mic_automatic_threshold": {"data": None}, - # "/set/disable/mic_automatic_threshold": {"data": None}, - # "/get/data/mic_record_timeout": {"data": None}, - # "/set/data/mic_record_timeout": {"data": None}, - # "/get/data/mic_phrase_timeout": {"data": None}, - # "/set/data/mic_phrase_timeout": {"data": None}, - # "/get/data/mic_max_phrases": {"data": None}, - # "/set/data/mic_max_phrases": {"data": None}, - # "/get/data/hotkeys": {"data": None}, - # "/set/data/hotkeys": {"data": None}, - # "/get/data/plugins_status": {"data": None}, - # "/set/data/plugins_status": {"data": None}, - # "/get/data/mic_avg_logprob": {"data": None}, - # "/set/data/mic_avg_logprob": {"data": None}, - # "/get/data/mic_no_speech_prob": {"data": None}, - # "/set/data/mic_no_speech_prob": {"data": None}, - # "/set/enable/check_mic_threshold": {"data": None}, - # "/set/disable/check_mic_threshold": {"data": None}, - # "/get/data/mic_word_filter": {"data": None}, - # "/set/data/mic_word_filter": {"data": None}, - # "/get/data/auto_speaker_select": {"data": None}, - # "/set/enable/auto_speaker_select": {"data": None}, - # "/set/disable/auto_speaker_select": {"data": None}, - # "/get/data/selected_speaker_device": {"data": None}, - # "/set/data/selected_speaker_device": {"data": None}, - # "/get/data/speaker_threshold": {"data": None}, - # "/set/data/speaker_threshold": {"data": None}, - # "/get/data/speaker_automatic_threshold": {"data": None}, - # "/set/enable/speaker_automatic_threshold": {"data": None}, - # "/set/disable/speaker_automatic_threshold": {"data": None}, - # "/get/data/speaker_record_timeout": {"data": None}, - # "/set/data/speaker_record_timeout": {"data": None}, - # "/get/data/speaker_phrase_timeout": {"data": None}, - # "/set/data/speaker_phrase_timeout": {"data": None}, - # "/get/data/speaker_max_phrases": {"data": None}, - # "/set/data/speaker_max_phrases": {"data": None}, - # "/get/data/speaker_avg_logprob": {"data": None}, - # "/set/data/speaker_avg_logprob": {"data": None}, - # "/get/data/speaker_no_speech_prob": {"data": None}, - # "/set/data/speaker_no_speech_prob": {"data": None}, - # "/set/enable/check_speaker_threshold": {"data": None}, - # "/set/disable/check_speaker_threshold": {"data": None}, - # "/get/data/selectable_whisper_weight_type_dict": {"data": None}, - # "/get/data/whisper_weight_type": {"data": None}, - # "/set/data/whisper_weight_type": {"data": None}, - # "/run/download_whisper_weight": {"data": None}, - # # VR - # "/get/data/overlay_small_log": {"data": None}, - # "/set/enable/overlay_small_log": {"data": None}, - # "/set/disable/overlay_small_log": {"data": None}, - # "/get/data/overlay_small_log_settings": {"data": None}, - # "/set/data/overlay_small_log_settings": {"data": None}, - # "/get/data/overlay_large_log": {"data": None}, - # "/set/enable/overlay_large_log": {"data": None}, - # "/set/disable/overlay_large_log": {"data": None}, - # "/get/data/overlay_large_log_settings": {"data": None}, - # "/set/data/overlay_large_log_settings": {"data": None}, - # "/get/data/overlay_show_only_translated_messages": {"data": None}, - # "/set/enable/overlay_show_only_translated_messages": {"data": None}, - # "/set/disable/overlay_show_only_translated_messages": {"data": None}, - # # Others - # "/get/data/send_message_format_parts": {"data": None}, - # "/set/data/send_message_format_parts": {"data": None}, - # "/get/data/received_message_format_parts": {"data": None}, - # "/set/data/received_message_format_parts": {"data": None}, - # "/get/data/auto_clear_message_box": {"data": None}, - # "/set/enable/auto_clear_message_box": {"data": None}, - # "/set/disable/auto_clear_message_box": {"data": None}, - # "/get/data/send_only_translated_messages": {"data": None}, - # "/set/enable/send_only_translated_messages": {"data": None}, - # "/set/disable/send_only_translated_messages": {"data": None}, - # "/get/data/logger_feature": {"data": None}, - # "/set/enable/logger_feature": {"data": None}, - # "/set/disable/logger_feature": {"data": None}, - # "/run/open_filepath_logs": {"data": None}, - # "/get/data/vrc_mic_mute_sync": {"data": None}, - # "/set/enable/vrc_mic_mute_sync": {"data": None}, - # "/set/disable/vrc_mic_mute_sync": {"data": None}, - # "/get/data/send_message_to_vrc": {"data": None}, - # "/set/enable/send_message_to_vrc": {"data": None}, - # "/set/disable/send_message_to_vrc": {"data": None}, - # "/get/data/send_received_message_to_vrc": {"data": None}, - # "/set/enable/send_received_message_to_vrc": {"data": None}, - # "/set/disable/send_received_message_to_vrc": {"data": None}, - # # WebSocket Settings - # "/get/data/websocket_host": {"data": None}, - # "/set/data/websocket_host": {"data": None}, - # "/get/data/websocket_port": {"data": None}, - # "/set/data/websocket_port": {"data": None}, - # "/get/data/websocket_server": {"data": None}, - # "/set/enable/websocket_server": {"data": None}, - # "/set/disable/websocket_server": {"data": None}, - # # Advanced Settings - # "/get/data/osc_ip_address": {"data": None}, - # "/set/data/osc_ip_address": {"data": None}, - # "/get/data/osc_port": {"data": None}, - # "/set/data/osc_port": {"data": None}, - # "/get/data/notification_vrc_sfx": {"data": None}, - # "/set/enable/notification_vrc_sfx": {"data": None}, - # "/set/disable/notification_vrc_sfx": {"data": None}, - # "/run/open_filepath_config_file": {"data": None}, - # "/run/feed_watchdog": {"data": None}, + "/run/open_filepath_logs": {"data": None, "status": 200, "result": True}, + "/run/open_filepath_config_file": {"data": None, "status": 200, "result": True}, + "/run/feed_watchdog": {"data": None, "status": 200, "result": True}, } - for endpoint, value in endpoints.items(): - with self.subTest(endpoint=endpoint): - for item in value: - input_data = item["data"] - expected_status = item["status"] - expected_result = item["result"] - result, status = self.main.handleRequest(endpoint, input_data) - print(f"Endpoint: {endpoint}, Status: {status}, Result: {result}") - self.assertEqual(status, expected_status) - self.assertEqual(result, expected_result) + def test_endpoints_on_off_single(self): + print("----ON/OFF系のエンドポイントのテスト----") + for endpoint in self.validity_endpoints: + print(f"Testing endpoint: {endpoint}", end="", flush=True) + if endpoint.startswith("/set/enable/"): + result, status = self.main.handleRequest(endpoint, None) + if result is True and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") + break + elif endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + if result is False and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") + break + print("----ON/OFF系のエンドポイントのテスト終了----") - def tearDown(self): - self.main.stop() + def test_endpoints_on_off_random(self): + print("----ON/OFFでのランダムアクセスのテスト----") + for i in range(1000): + endpoint = random.choice(self.validity_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + if endpoint.startswith("/set/enable/"): + result, status = self.main.handleRequest(endpoint, None) + expected_result = True + if result == expected_result and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + pprint.pprint(self.config_dict) + break + elif endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + expected_result = False + if result == expected_result and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + pprint.pprint(self.config_dict) + break + print("----ON/OFFでのランダムアクセスのテスト終了----") + + def test_endpoints_continuous(self): + print("----連続テスト----") + # endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] + endpoints = ["/set/enable/transcription_receive", "/set/disable/transcription_receive"] + for i in range(1000): + endpoint = random.choice(endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + if endpoint.startswith("/set/enable/"): + result, status = self.main.handleRequest(endpoint, None) + expected_result = True + if result == expected_result and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + pprint.pprint(self.config_dict) + break + elif endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + expected_result = False + if result == expected_result and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + pprint.pprint(self.config_dict) + break + print("----連続テスト終了----") if __name__ == "__main__": - unittest.main() \ No newline at end of file + test = TestMainloop() + test.test_endpoints_continuous() \ No newline at end of file From a4656a50813cf46bf41a224f3c3da675d1ccfd38 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Tue, 23 Sep 2025 16:56:11 +0900 Subject: [PATCH 03/11] =?UTF-8?q?Controller=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=97=E3=80=81=E9=87=8D=E8=A4=87?= =?UTF-8?q?=E3=81=97=E3=81=9F=E8=A8=AD=E5=AE=9A=E3=82=92=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E3=81=99=E3=82=8B=E6=9D=A1=E4=BB=B6=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=82=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=82=92=E6=9B=B4=E6=96=B0=E3=81=97=E3=80=81ON/OFF=E7=8A=B6?= =?UTF-8?q?=E6=85=8B=E3=81=AE=E3=83=A9=E3=83=B3=E3=83=80=E3=83=A0=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=A8=E9=80=A3=E7=B6=9A=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E5=BC=B7=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/controller.py | 233 +++++++++++++++++++++-------------- src-python/test_endpoints.py | 51 ++++++-- 2 files changed, 179 insertions(+), 105 deletions(-) diff --git a/src-python/controller.py b/src-python/controller.py index ec287267..b31a2759 100644 --- a/src-python/controller.py +++ b/src-python/controller.py @@ -795,24 +795,28 @@ class Controller: @staticmethod def setEnableTranslation(*args, **kwargs) -> dict: - if model.isLoadedCTranslate2Model() is False: - model.changeTranslatorCTranslate2Model() - config.ENABLE_TRANSLATION = True + if config.ENABLE_TRANSLATION is False: + if model.isLoadedCTranslate2Model() is False: + model.changeTranslatorCTranslate2Model() + config.ENABLE_TRANSLATION = True return {"status":200, "result":config.ENABLE_TRANSLATION} @staticmethod def setDisableTranslation(*args, **kwargs) -> dict: - config.ENABLE_TRANSLATION = False + if config.ENABLE_TRANSLATION is True: + config.ENABLE_TRANSLATION = False return {"status":200, "result":config.ENABLE_TRANSLATION} @staticmethod def setEnableForeground(*args, **kwargs) -> dict: - config.ENABLE_FOREGROUND = True + if config.ENABLE_FOREGROUND is False: + config.ENABLE_FOREGROUND = True return {"status":200, "result":config.ENABLE_FOREGROUND} @staticmethod def setDisableForeground(*args, **kwargs) -> dict: - config.ENABLE_FOREGROUND = False + if config.ENABLE_FOREGROUND is True: + config.ENABLE_FOREGROUND = False return {"status":200, "result":config.ENABLE_FOREGROUND} @staticmethod @@ -906,12 +910,14 @@ class Controller: @staticmethod def setEnableConvertMessageToRomaji(*args, **kwargs) -> dict: - config.CONVERT_MESSAGE_TO_ROMAJI = True + if config.CONVERT_MESSAGE_TO_ROMAJI is False: + config.CONVERT_MESSAGE_TO_ROMAJI = True return {"status":200, "result":config.CONVERT_MESSAGE_TO_ROMAJI} @staticmethod def setDisableConvertMessageToRomaji(*args, **kwargs) -> dict: - config.CONVERT_MESSAGE_TO_ROMAJI = False + if config.CONVERT_MESSAGE_TO_ROMAJI is True: + config.CONVERT_MESSAGE_TO_ROMAJI = False return {"status":200, "result":config.CONVERT_MESSAGE_TO_ROMAJI} @staticmethod @@ -920,12 +926,14 @@ class Controller: @staticmethod def setEnableConvertMessageToHiragana(*args, **kwargs) -> dict: - config.CONVERT_MESSAGE_TO_HIRAGANA = True + if config.CONVERT_MESSAGE_TO_HIRAGANA is False: + config.CONVERT_MESSAGE_TO_HIRAGANA = True return {"status":200, "result":config.CONVERT_MESSAGE_TO_HIRAGANA} @staticmethod def setDisableConvertMessageToHiragana(*args, **kwargs) -> dict: - config.CONVERT_MESSAGE_TO_HIRAGANA = False + if config.CONVERT_MESSAGE_TO_HIRAGANA is True: + config.CONVERT_MESSAGE_TO_HIRAGANA = False return {"status":200, "result":config.CONVERT_MESSAGE_TO_HIRAGANA} @staticmethod @@ -934,12 +942,14 @@ class Controller: @staticmethod def setEnableMainWindowSidebarCompactMode(*args, **kwargs) -> dict: - config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True + if config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE is False: + config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True return {"status":200, "result":config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE} @staticmethod def setDisableMainWindowSidebarCompactMode(*args, **kwargs) -> dict: - config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False + if config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE is True: + config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False return {"status":200, "result":config.MAIN_WINDOW_SIDEBAR_COMPACT_MODE} @staticmethod @@ -993,12 +1003,14 @@ class Controller: @staticmethod def setEnableShowResendButton(*args, **kwargs) -> dict: - config.SHOW_RESEND_BUTTON = True + if not config.SHOW_RESEND_BUTTON: + config.SHOW_RESEND_BUTTON = True return {"status":200, "result":config.SHOW_RESEND_BUTTON} @staticmethod def setDisableShowResendButton(*args, **kwargs) -> dict: - config.SHOW_RESEND_BUTTON = False + if config.SHOW_RESEND_BUTTON is True: + config.SHOW_RESEND_BUTTON = False return {"status":200, "result":config.SHOW_RESEND_BUTTON} @staticmethod @@ -1033,19 +1045,21 @@ class Controller: return {"status":200, "result":config.AUTO_MIC_SELECT} def setEnableAutoMicSelect(self, *args, **kwargs) -> dict: - config.AUTO_MIC_SELECT = True - device_manager.setCallbackProcessBeforeUpdateDevices(self.stopAccessDevices) - device_manager.setCallbackDefaultMicDevice(self.updateSelectedMicDevice) - device_manager.setCallbackProcessAfterUpdateDevices(self.restartAccessDevices) - device_manager.forceUpdateAndSetMicDevices() + if config.AUTO_MIC_SELECT is False: + device_manager.setCallbackProcessBeforeUpdateDevices(self.stopAccessDevices) + device_manager.setCallbackDefaultMicDevice(self.updateSelectedMicDevice) + device_manager.setCallbackProcessAfterUpdateDevices(self.restartAccessDevices) + device_manager.forceUpdateAndSetMicDevices() + config.AUTO_MIC_SELECT = True return {"status":200, "result":config.AUTO_MIC_SELECT} @staticmethod def setDisableAutoMicSelect(*args, **kwargs) -> dict: - device_manager.clearCallbackProcessBeforeUpdateDevices() - device_manager.clearCallbackDefaultMicDevice() - device_manager.clearCallbackProcessAfterUpdateDevices() - config.AUTO_MIC_SELECT = False + if config.AUTO_MIC_SELECT is True: + device_manager.clearCallbackProcessBeforeUpdateDevices() + device_manager.clearCallbackDefaultMicDevice() + device_manager.clearCallbackProcessAfterUpdateDevices() + config.AUTO_MIC_SELECT = False return {"status":200, "result":config.AUTO_MIC_SELECT} @staticmethod @@ -1108,12 +1122,14 @@ class Controller: @staticmethod def setEnableMicAutomaticThreshold(*args, **kwargs) -> dict: - config.MIC_AUTOMATIC_THRESHOLD = True + if config.MIC_AUTOMATIC_THRESHOLD is False: + config.MIC_AUTOMATIC_THRESHOLD = True return {"status":200, "result":config.MIC_AUTOMATIC_THRESHOLD} @staticmethod def setDisableMicAutomaticThreshold(*args, **kwargs) -> dict: - config.MIC_AUTOMATIC_THRESHOLD = False + if config.MIC_AUTOMATIC_THRESHOLD is True: + config.MIC_AUTOMATIC_THRESHOLD = False return {"status":200, "result":config.MIC_AUTOMATIC_THRESHOLD} @staticmethod @@ -1226,20 +1242,21 @@ class Controller: return {"status":200, "result":config.AUTO_SPEAKER_SELECT} def setEnableAutoSpeakerSelect(self, *args, **kwargs) -> dict: - config.AUTO_SPEAKER_SELECT = True - device_manager.setCallbackProcessBeforeUpdateDevices(self.stopAccessDevices) - device_manager.setCallbackDefaultSpeakerDevice(self.updateSelectedSpeakerDevice) - device_manager.setCallbackProcessAfterUpdateDevices(self.restartAccessDevices) - device_manager.forceUpdateAndSetSpeakerDevices() - + if config.AUTO_SPEAKER_SELECT is False: + device_manager.setCallbackProcessBeforeUpdateDevices(self.stopAccessDevices) + device_manager.setCallbackDefaultSpeakerDevice(self.updateSelectedSpeakerDevice) + device_manager.setCallbackProcessAfterUpdateDevices(self.restartAccessDevices) + device_manager.forceUpdateAndSetSpeakerDevices() + config.AUTO_SPEAKER_SELECT = True return {"status":200, "result":config.AUTO_SPEAKER_SELECT} @staticmethod def setDisableAutoSpeakerSelect(*args, **kwargs) -> dict: - device_manager.clearCallbackProcessBeforeUpdateDevices() - device_manager.clearCallbackDefaultSpeakerDevice() - device_manager.clearCallbackProcessAfterUpdateDevices() - config.AUTO_SPEAKER_SELECT = False + if config.AUTO_SPEAKER_SELECT is True: + device_manager.clearCallbackProcessBeforeUpdateDevices() + device_manager.clearCallbackDefaultSpeakerDevice() + device_manager.clearCallbackProcessAfterUpdateDevices() + config.AUTO_SPEAKER_SELECT = False return {"status":200, "result":config.AUTO_SPEAKER_SELECT} @staticmethod @@ -1285,12 +1302,14 @@ class Controller: @staticmethod def setEnableSpeakerAutomaticThreshold(*args, **kwargs) -> dict: - config.SPEAKER_AUTOMATIC_THRESHOLD = True + if config.SPEAKER_AUTOMATIC_THRESHOLD is False: + config.SPEAKER_AUTOMATIC_THRESHOLD = True return {"status":200, "result":config.SPEAKER_AUTOMATIC_THRESHOLD} @staticmethod def setDisableSpeakerAutomaticThreshold(*args, **kwargs) -> dict: - config.SPEAKER_AUTOMATIC_THRESHOLD = False + if config.SPEAKER_AUTOMATIC_THRESHOLD is True: + config.SPEAKER_AUTOMATIC_THRESHOLD = False return {"status":200, "result":config.SPEAKER_AUTOMATIC_THRESHOLD} @staticmethod @@ -1459,12 +1478,14 @@ class Controller: @staticmethod def setEnableNotificationVrcSfx(*args, **kwargs) -> dict: - config.NOTIFICATION_VRC_SFX = True + if config.NOTIFICATION_VRC_SFX is False: + config.NOTIFICATION_VRC_SFX = True return {"status":200, "result":config.NOTIFICATION_VRC_SFX} @staticmethod def setDisableNotificationVrcSfx(*args, **kwargs) -> dict: - config.NOTIFICATION_VRC_SFX = False + if config.NOTIFICATION_VRC_SFX is True: + config.NOTIFICATION_VRC_SFX = False return {"status":200, "result":config.NOTIFICATION_VRC_SFX} @staticmethod @@ -1571,12 +1592,14 @@ class Controller: @staticmethod def setEnableAutoClearMessageBox(*args, **kwargs) -> dict: - config.AUTO_CLEAR_MESSAGE_BOX = True + if config.AUTO_CLEAR_MESSAGE_BOX is False: + config.AUTO_CLEAR_MESSAGE_BOX = True return {"status":200, "result":config.AUTO_CLEAR_MESSAGE_BOX} @staticmethod def setDisableAutoClearMessageBox(*args, **kwargs) -> dict: - config.AUTO_CLEAR_MESSAGE_BOX = False + if config.AUTO_CLEAR_MESSAGE_BOX is True: + config.AUTO_CLEAR_MESSAGE_BOX = False return {"status":200, "result":config.AUTO_CLEAR_MESSAGE_BOX} @staticmethod @@ -1585,12 +1608,14 @@ class Controller: @staticmethod def setEnableSendOnlyTranslatedMessages(*args, **kwargs) -> dict: - config.SEND_ONLY_TRANSLATED_MESSAGES = True + if config.SEND_ONLY_TRANSLATED_MESSAGES is False: + config.SEND_ONLY_TRANSLATED_MESSAGES = True return {"status":200, "result":config.SEND_ONLY_TRANSLATED_MESSAGES} @staticmethod def setDisableSendOnlyTranslatedMessages(*args, **kwargs) -> dict: - config.SEND_ONLY_TRANSLATED_MESSAGES = False + if config.SEND_ONLY_TRANSLATED_MESSAGES is True: + config.SEND_ONLY_TRANSLATED_MESSAGES = False return {"status":200, "result":config.SEND_ONLY_TRANSLATED_MESSAGES} @staticmethod @@ -1599,17 +1624,19 @@ class Controller: @staticmethod def setEnableOverlaySmallLog(*args, **kwargs) -> dict: - config.OVERLAY_SMALL_LOG = True - if config.OVERLAY_LARGE_LOG is False: - model.startOverlay() + if config.OVERLAY_SMALL_LOG is False: + if config.OVERLAY_LARGE_LOG is False: + model.startOverlay() + config.OVERLAY_SMALL_LOG = True return {"status":200, "result":config.OVERLAY_SMALL_LOG} @staticmethod def setDisableOverlaySmallLog(*args, **kwargs) -> dict: - config.OVERLAY_SMALL_LOG = False - model.clearOverlayImageSmallLog() - if config.OVERLAY_LARGE_LOG is False: - model.shutdownOverlay() + if config.OVERLAY_SMALL_LOG is True: + model.clearOverlayImageSmallLog() + if config.OVERLAY_LARGE_LOG is False: + model.shutdownOverlay() + config.OVERLAY_SMALL_LOG = False return {"status":200, "result":config.OVERLAY_SMALL_LOG} @staticmethod @@ -1628,17 +1655,19 @@ class Controller: @staticmethod def setEnableOverlayLargeLog(*args, **kwargs) -> dict: - config.OVERLAY_LARGE_LOG = True - if config.OVERLAY_SMALL_LOG is False: - model.startOverlay() + if config.OVERLAY_LARGE_LOG is False: + if config.OVERLAY_SMALL_LOG is False: + model.startOverlay() + config.OVERLAY_LARGE_LOG = True return {"status":200, "result":config.OVERLAY_LARGE_LOG} @staticmethod def setDisableOverlayLargeLog(*args, **kwargs) -> dict: - config.OVERLAY_LARGE_LOG = False - model.clearOverlayImageLargeLog() - if config.OVERLAY_SMALL_LOG is False: - model.shutdownOverlay() + if config.OVERLAY_LARGE_LOG is True: + model.clearOverlayImageLargeLog() + if config.OVERLAY_SMALL_LOG is False: + model.shutdownOverlay() + config.OVERLAY_LARGE_LOG = False return {"status":200, "result":config.OVERLAY_LARGE_LOG} @staticmethod @@ -1657,12 +1686,14 @@ class Controller: @staticmethod def setEnableOverlayShowOnlyTranslatedMessages(*args, **kwargs) -> dict: - config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES = True + if config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES is False: + config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES = True return {"status":200, "result":config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES} @staticmethod def setDisableOverlayShowOnlyTranslatedMessages(*args, **kwargs) -> dict: - config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES = False + if config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES is True: + config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES = False return {"status":200, "result":config.OVERLAY_SHOW_ONLY_TRANSLATED_MESSAGES} @staticmethod @@ -1671,12 +1702,14 @@ class Controller: @staticmethod def setEnableSendMessageToVrc(*args, **kwargs) -> dict: - config.SEND_MESSAGE_TO_VRC = True + if config.SEND_MESSAGE_TO_VRC is False: + config.SEND_MESSAGE_TO_VRC = True return {"status":200, "result":config.SEND_MESSAGE_TO_VRC} @staticmethod def setDisableSendMessageToVrc(*args, **kwargs) -> dict: - config.SEND_MESSAGE_TO_VRC = False + if config.SEND_MESSAGE_TO_VRC is True: + config.SEND_MESSAGE_TO_VRC = False return {"status":200, "result":config.SEND_MESSAGE_TO_VRC} @staticmethod @@ -1685,12 +1718,14 @@ class Controller: @staticmethod def setEnableSendReceivedMessageToVrc(*args, **kwargs) -> dict: - config.SEND_RECEIVED_MESSAGE_TO_VRC = True + if config.SEND_RECEIVED_MESSAGE_TO_VRC is False: + config.SEND_RECEIVED_MESSAGE_TO_VRC = True return {"status":200, "result":config.SEND_RECEIVED_MESSAGE_TO_VRC} @staticmethod def setDisableSendReceivedMessageToVrc(*args, **kwargs) -> dict: - config.SEND_RECEIVED_MESSAGE_TO_VRC = False + if config.SEND_RECEIVED_MESSAGE_TO_VRC is True: + config.SEND_RECEIVED_MESSAGE_TO_VRC = False return {"status":200, "result":config.SEND_RECEIVED_MESSAGE_TO_VRC} @staticmethod @@ -1717,45 +1752,53 @@ class Controller: @staticmethod def setEnableVrcMicMuteSync(*args, **kwargs) -> dict: - if model.getIsOscQueryEnabled() is True: - config.VRC_MIC_MUTE_SYNC = True - model.setMuteSelfStatus() - model.changeMicTranscriptStatus() - response = {"status":200, "result":config.VRC_MIC_MUTE_SYNC} + if config.VRC_MIC_MUTE_SYNC is False: + if model.getIsOscQueryEnabled() is True: + config.VRC_MIC_MUTE_SYNC = True + model.setMuteSelfStatus() + model.changeMicTranscriptStatus() + response = {"status":200, "result":config.VRC_MIC_MUTE_SYNC} + else: + response = { + "status":400, + "result":{ + "message":"Cannot enable VRC mic mute sync while OSC query is disabled", + "data": config.VRC_MIC_MUTE_SYNC + } + } else: - response = { - "status":400, - "result":{ - "message":"Cannot enable VRC mic mute sync while OSC query is disabled", - "data": config.VRC_MIC_MUTE_SYNC - } - } + response = {"status":200, "result":config.VRC_MIC_MUTE_SYNC} return response @staticmethod def setDisableVrcMicMuteSync(*args, **kwargs) -> dict: - config.VRC_MIC_MUTE_SYNC = False - model.changeMicTranscriptStatus() + if config.VRC_MIC_MUTE_SYNC is True: + config.VRC_MIC_MUTE_SYNC = False + model.changeMicTranscriptStatus() return {"status":200, "result":config.VRC_MIC_MUTE_SYNC} def setEnableCheckSpeakerThreshold(self, *args, **kwargs) -> dict: - self.startThreadingCheckSpeakerEnergy() - config.ENABLE_CHECK_ENERGY_RECEIVE = True + if config.ENABLE_CHECK_ENERGY_RECEIVE is False: + self.startThreadingCheckSpeakerEnergy() + config.ENABLE_CHECK_ENERGY_RECEIVE = True return {"status":200, "result":config.ENABLE_CHECK_ENERGY_RECEIVE} def setDisableCheckSpeakerThreshold(self, *args, **kwargs) -> dict: - self.stopThreadingCheckSpeakerEnergy() - config.ENABLE_CHECK_ENERGY_RECEIVE = False + if config.ENABLE_CHECK_ENERGY_RECEIVE is True: + self.stopThreadingCheckSpeakerEnergy() + config.ENABLE_CHECK_ENERGY_RECEIVE = False return {"status":200, "result":config.ENABLE_CHECK_ENERGY_RECEIVE} def setEnableCheckMicThreshold(self, *args, **kwargs) -> dict: - self.startThreadingCheckMicEnergy() - config.ENABLE_CHECK_ENERGY_SEND = True + if config.ENABLE_CHECK_ENERGY_SEND is False: + self.startThreadingCheckMicEnergy() + config.ENABLE_CHECK_ENERGY_SEND = True return {"status":200, "result":config.ENABLE_CHECK_ENERGY_SEND} def setDisableCheckMicThreshold(self, *args, **kwargs) -> dict: - self.stopThreadingCheckMicEnergy() - config.ENABLE_CHECK_ENERGY_SEND = False + if config.ENABLE_CHECK_ENERGY_SEND is True: + self.stopThreadingCheckMicEnergy() + config.ENABLE_CHECK_ENERGY_SEND = False return {"status":200, "result":config.ENABLE_CHECK_ENERGY_SEND} @staticmethod @@ -1769,23 +1812,27 @@ class Controller: return {"status":200, "result":True} def setEnableTranscriptionSend(self, *args, **kwargs) -> dict: - self.startThreadingTranscriptionSendMessage() - config.ENABLE_TRANSCRIPTION_SEND = True + if config.ENABLE_TRANSCRIPTION_SEND is False: + self.startThreadingTranscriptionSendMessage() + config.ENABLE_TRANSCRIPTION_SEND = True return {"status":200, "result":config.ENABLE_TRANSCRIPTION_SEND} def setDisableTranscriptionSend(self, *args, **kwargs) -> dict: - self.stopThreadingTranscriptionSendMessage() - config.ENABLE_TRANSCRIPTION_SEND = False + if config.ENABLE_TRANSCRIPTION_SEND is True: + self.stopThreadingTranscriptionSendMessage() + config.ENABLE_TRANSCRIPTION_SEND = False return {"status":200, "result":config.ENABLE_TRANSCRIPTION_SEND} def setEnableTranscriptionReceive(self, *args, **kwargs) -> dict: - self.startThreadingTranscriptionReceiveMessage() - config.ENABLE_TRANSCRIPTION_RECEIVE = True + if config.ENABLE_TRANSCRIPTION_RECEIVE is False: + self.startThreadingTranscriptionReceiveMessage() + config.ENABLE_TRANSCRIPTION_RECEIVE = True return {"status":200, "result":config.ENABLE_TRANSCRIPTION_RECEIVE} def setDisableTranscriptionReceive(self, *args, **kwargs) -> dict: - self.stopThreadingTranscriptionReceiveMessage() - config.ENABLE_TRANSCRIPTION_RECEIVE = False + if config.ENABLE_TRANSCRIPTION_RECEIVE is True: + self.stopThreadingTranscriptionReceiveMessage() + config.ENABLE_TRANSCRIPTION_RECEIVE = False return {"status":200, "result":config.ENABLE_TRANSCRIPTION_RECEIVE} def sendMessageBox(self, data, *args, **kwargs) -> dict: diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index b0664b50..499a4bd9 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -73,18 +73,18 @@ class TestMainloop(): "/set/disable/convert_message_to_romaji", "/set/enable/convert_message_to_hiragana", "/set/disable/convert_message_to_hiragana", - # "/set/enable/auto_mic_select", - # "/set/disable/auto_mic_select", + "/set/enable/auto_mic_select", + "/set/disable/auto_mic_select", "/set/enable/mic_automatic_threshold", "/set/disable/mic_automatic_threshold", - # "/set/enable/check_mic_threshold", - # "/set/disable/check_mic_threshold", - # "/set/enable/auto_speaker_select", - # "/set/disable/auto_speaker_select", + "/set/enable/check_mic_threshold", + "/set/disable/check_mic_threshold", + "/set/enable/auto_speaker_select", + "/set/disable/auto_speaker_select", "/set/enable/speaker_automatic_threshold", "/set/disable/speaker_automatic_threshold", - # "/set/enable/check_speaker_threshold", - # "/set/disable/check_speaker_threshold", + "/set/enable/check_speaker_threshold", + "/set/disable/check_speaker_threshold", "/set/enable/overlay_small_log", "/set/disable/overlay_small_log", "/set/enable/overlay_large_log", @@ -251,12 +251,26 @@ class TestMainloop(): print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") pprint.pprint(self.config_dict) break + time.sleep(0.2) + + # 最後にすべてOFFにして終了 + for endpoint in self.validity_endpoints: + if endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + time.sleep(0.2) print("----ON/OFFでのランダムアクセスのテスト終了----") - def test_endpoints_continuous(self): + def test_endpoints_on_off_continuous(self): print("----連続テスト----") # endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] - endpoints = ["/set/enable/transcription_receive", "/set/disable/transcription_receive"] + endpoints = [ + "/set/enable/translation", + "/set/disable/translation", + "/set/enable/transcription_send", + "/set/disable/transcription_send", + "/set/enable/transcription_receive", + "/set/disable/transcription_receive", + ] for i in range(1000): endpoint = random.choice(endpoints) print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) @@ -280,8 +294,21 @@ class TestMainloop(): print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") pprint.pprint(self.config_dict) break + time.sleep(0.2) + + # 最後にすべてOFFにして終了 + for endpoint in self.validity_endpoints: + if endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + time.sleep(0.2) print("----連続テスト終了----") if __name__ == "__main__": - test = TestMainloop() - test.test_endpoints_continuous() \ No newline at end of file + try: + test = TestMainloop() + test.test_endpoints_on_off_random() + # test.test_endpoints_continuous() + except KeyboardInterrupt: + print("Interrupted by user, shutting down...") + except Exception as e: + print(f"An error occurred: {e}") \ No newline at end of file From d9f1dabecb39bd62c5f7415f1ccb57b017b7b2b5 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:51:09 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=A1?= =?UTF-8?q?=E3=82=BD=E3=83=83=E3=83=89=E3=81=AE=E5=87=BA=E5=8A=9B=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92=E6=94=B9=E5=96=84?= =?UTF-8?q?=E3=81=97=E3=80=81=E3=83=87=E3=83=BC=E3=82=BF=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E7=B3=BB=E3=81=AE=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/test_endpoints.py | 174 ++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 4 deletions(-) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index 499a4bd9..5fedaae5 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -32,7 +32,7 @@ class Color: BG_WHITE = '\033[47m'#(背景)白 BG_DEFAULT = '\033[49m'#背景色をデフォルトに戻す RESET = '\033[0m'#全てリセット - + class TestMainloop(): def __init__(self): self.main = main_instance @@ -261,7 +261,7 @@ class TestMainloop(): print("----ON/OFFでのランダムアクセスのテスト終了----") def test_endpoints_on_off_continuous(self): - print("----連続テスト----") + print("----ON/OFF連続テスト----") # endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] endpoints = [ "/set/enable/translation", @@ -301,13 +301,179 @@ class TestMainloop(): if endpoint.startswith("/set/disable/"): result, status = self.main.handleRequest(endpoint, None) time.sleep(0.2) - print("----連続テスト終了----") + print("----ON/OFF連続テスト終了----") + + def test_set_data_endpoints(self): + print("----データ設定系のエンドポイントのテスト----") + for endpoint in self.set_data_endpoints: + print(f"Testing endpoint: {endpoint}", end=" ", flush=True) + match endpoint: + case "/set/data/selected_tab_no": + data = random.choice(["1", "2", "3"]) + case "/set/data/selected_translation_engines": + translation_engines = self.config_dict.get("translation_engines", None) + data = {} + for i in ["1", "2", "3"]: + data[i] = random.choice(translation_engines) + case "/set/data/selected_your_languages": + selectable_language_list = self.config_dict.get("selectable_language_list", None) + data = {} + for i in ["1", "2", "3"]: + data[i] = {} + data[i]["1"] = random.choice(selectable_language_list) | {"enable": True} + case "/set/data/selected_target_languages": + selectable_language_list = self.config_dict.get("selectable_language_list", None) + data = {} + for i in ["1", "2", "3"]: + data[i] = {} + for j in ["1", "2", "3"]: + data[i][j] = random.choice(selectable_language_list) | {"enable": random.choice([True, False])} + case "/set/data/selected_transcription_engine": + transcription_engines = self.config_dict.get("transcription_engines", None) + data = random.choice(transcription_engines) + case "/set/data/transparency": + data = random.randint(0, 100) + case "/set/data/ui_scaling": + data = random.randint(50, 200) + case "/set/data/textbox_ui_scaling": + data = random.randint(50, 200) + case "/set/data/message_box_ratio": + data = round(random.uniform(0.1, 0.9), 2) + case "/set/data/send_message_button_type": + data = random.choice(["show", "hide", "show_and_disable_enter_key"]) + case "/set/data/font_family": + data = random.choice(["Arial", "Verdana", "Times New Roman"]) + case "/set/data/ui_language": + data = random.choice(["en", "ja", "ko", "zh-Hant", "zh-Hans"]) + case "/set/data/main_window_geometry": + data = { + "x_pos": random.randint(0, 1920), + "y_pos": random.randint(0, 1080), + "width": random.randint(800, 1920), + "height": random.randint(600, 1080) + } + case "/set/data/selected_translation_compute_device": + data = random.choice(self.config_dict["translation_compute_device_list"]) + case "/set/data/selected_transcription_compute_device": + data = random.choice(self.config_dict["transcription_compute_device_list"]) + case "/set/data/ctranslate2_weight_type": + data = random.choice(list(self.config_dict["selectable_ctranslate2_weight_type_dict"].keys())) + case "/set/data/deepl_auth_key": + data = None # Set to None to avoid using a real key + case "/set/data/selected_mic_host": + data = random.choice(self.config_dict["mic_host_list"]) + case "/set/data/selected_mic_device": + data = random.choice(self.config_dict["mic_device_list"]) + case "/set/data/mic_threshold": + data = random.randint(0, 100) + case "/set/data/mic_record_timeout": + data = random.randint(1, 3) + case "/set/data/mic_phrase_timeout": + data = random.randint(5, 10) + case "/set/data/mic_max_phrases": + data = random.randint(1, 10) + case "/set/data/hotkeys": + data = { + 'toggle_vrct_visibility': None, + 'toggle_translation': None, + 'toggle_transcription_send': None, + 'toggle_transcription_receive': None + } + case "/set/data/plugins_status": + data = {plugin: random.choice([True, False]) for plugin in self.config_dict.get("plugins", [])} + case "/set/data/mic_avg_logprob": + data = random.uniform(-5, 0) + case "/set/data/mic_no_speech_prob": + data = random.uniform(0, 1) + case "/set/data/mic_word_filter": + data = random.choice( + [ + ["test_0_0", "test_0_1", "test_0_2", None], + ["test_1_0", "test_1_1", None], + ["test_2_0", None], + [None] + ] + ) + case "/set/data/selected_speaker_device": + data = random.choice(self.config_dict["speaker_device_list"]) + case "/set/data/speaker_threshold": + data = random.randint(0, 100) + case "/set/data/speaker_record_timeout": + data = random.randint(1, 3) + case "/set/data/speaker_phrase_timeout": + data = random.randint(5, 10) + case "/set/data/speaker_max_phrases": + data = random.randint(1, 10) + case "/set/data/speaker_avg_logprob": + data = random.uniform(-5, 0) + case "/set/data/speaker_no_speech_prob": + data = random.uniform(0, 1) + case "/set/data/whisper_weight_type": + data = random.choice([key for key, value in self.config_dict["selectable_whisper_weight_type_dict"].items() if value is True]) + case "/set/data/overlay_small_log_settings": + data = { + "x_pos": random.random(), + "y_pos": random.random(), + "z_pos": random.random(), + "x_rotation": random.random(), + "y_rotation": random.random(), + "z_rotation": random.random(), + "display_duration": random.randint(0, 100), + "fadeout_duration": random.randint(0, 100), + "opacity": random.random(), + "ui_scaling": random.random(), + "tracker": random.choice(["HMD", "LeftHand", "RightHand"]), + } + case "/set/data/overlay_large_log_settings": + data = { + "x_pos": random.random(), + "y_pos": random.random(), + "z_pos": random.random(), + "x_rotation": random.random(), + "y_rotation": random.random(), + "z_rotation": random.random(), + "display_duration": random.randint(0, 100), + "fadeout_duration": random.randint(0, 100), + "opacity": random.random(), + "ui_scaling": random.random(), + "tracker": random.choice(["HMD", "LeftHand", "RightHand"]), + } + case "/set/data/send_message_format_parts": + data = self.config_dict["send_message_format_parts"] + case "/set/data/received_message_format_parts": + data = self.config_dict["received_message_format_parts"] + case "/set/data/websocket_host": + data = "127.0.0.1" + case "/set/data/websocket_port": + data = random.randint(1024, 65535) + case "/set/data/osc_ip_address": + data = "127.0.0.1" + case "/set/data/osc_port": + data = random.randint(1024, 65535) + case _: + data = None + + if data is not None: + print(f"data: {data}", end=" ", flush=True) + result, status = self.main.handleRequest(endpoint, data) + if status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f" Current config_dict: {self.config_dict}") + break + else: + print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint.") + time.sleep(0.2) + print("----データ設定系のエンドポイントのテスト終了----") if __name__ == "__main__": try: test = TestMainloop() - test.test_endpoints_on_off_random() + # test.test_endpoints_on_off_random() # test.test_endpoints_continuous() + test.test_set_data_endpoints() except KeyboardInterrupt: print("Interrupted by user, shutting down...") except Exception as e: From 95cf247e2ef8e302896c839856894a769d55ec13 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Tue, 23 Sep 2025 23:19:35 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AE=E5=AE=89?= =?UTF-8?q?=E5=AE=9A=E5=8C=96=E3=81=AE=E3=81=9F=E3=82=81=E3=81=AB=E5=BE=85?= =?UTF-8?q?=E6=A9=9F=E6=99=82=E9=96=93=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=80=81=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E5=BC=B7=E5=8C=96?= =?UTF-8?q?=E3=80=82=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=82=92=E6=95=B4=E7=90=86=E3=81=97=E3=80=81=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E7=B3=BB=E3=81=AE=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E6=96=B0?= =?UTF-8?q?=E3=81=9F=E3=81=AB=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/mainloop.py | 1 + src-python/test_endpoints.py | 275 +++++++++++++++++++++-------------- 2 files changed, 169 insertions(+), 107 deletions(-) diff --git a/src-python/mainloop.py b/src-python/mainloop.py index 32b44dbd..6e5f6548 100644 --- a/src-python/mainloop.py +++ b/src-python/mainloop.py @@ -386,6 +386,7 @@ class Main: response = handler["variable"](data) status = response.get("status", None) result = response.get("result", None) + time.sleep(0.2) # 処理の安定化のために少し待機 except Exception as e: errorLogging() result = str(e) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index 5fedaae5..0c7c3704 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -163,43 +163,55 @@ class TestMainloop(): self.run_endpoints = { "/run/send_message_box": [ { - "data": {"id":"123456", "message":"test"}, + "data": {"id":"000001", "message":"test"}, "status": 200, - "result": { - 'id': '123456', - 'original': { - 'message': 'test', - 'transliteration': [] - }, - 'translations': [] - } - } + }, + { + # 英語 + "data": {"id":"000002", "message":"Hello World!"}, + "status": 200, + }, + { + # 日本語 + "data": {"id":"000003", "message":"こんにちわ 世界!"}, + "status": 200, + }, + { + # 韓国語 + "data": {"id":"000004", "message":"안녕하세요 세계!"}, + "status": 200, + }, + { + # 中国語 繁体字 + "data": {"id":"000005", "message":"你好,世界!"}, + "status": 200, + }, ], "/run/typing_message_box": [{"data": None, "status": 200, "result": True}], "/run/stop_typing_message_box": [{"data": None, "status": 200, "result": True}], "/run/send_text_overlay": [{"data": "test_overlay", "status": 200, "result": "test_overlay"}], - "/run/swap_your_language_and_target_language": [{"data": None, "status": 200, "result": True}], + "/run/swap_your_language_and_target_language": [{"data": None, "status": 200}], # !!!Cant be tested here!!! # "/run/update_software": [{"data": None, "status": 200, "result": True}], # "/run/update_cuda_software": [{"data": None, "status": 200, "result": True}], - "/run/download_ctranslate2_weight": [ - {"data": "small", "status": 200, "result": True}, - {"data": "large", "status": 400, "result": False}, - ], - "/run/download_whisper_weight": [ - {"data": "tiny", "status": 200, "result": True}, - {"data": "base", "status": 200, "result": True}, - {"data": "small", "status": 200, "result": True}, - {"data": "medium", "status": 200, "result": True}, - {"data": "large-v1", "status": 200, "result": True}, - {"data": "large-v2", "status": 400, "result": False}, - {"data": "large-v3", "status": 400, "result": False}, - {"data": "large-v3-turbo-int8", "status": 400, "result": False}, - {"data": "large-v3-turbo", "status": 400, "result": False} - ], - "/run/open_filepath_logs": {"data": None, "status": 200, "result": True}, - "/run/open_filepath_config_file": {"data": None, "status": 200, "result": True}, - "/run/feed_watchdog": {"data": None, "status": 200, "result": True}, + # "/run/download_ctranslate2_weight": [ + # {"data": "small", "status": 200, "result": True}, + # {"data": "large", "status": 400, "result": False}, + # ], + # "/run/download_whisper_weight": [ + # {"data": "tiny", "status": 200, "result": True}, + # {"data": "base", "status": 200, "result": True}, + # {"data": "small", "status": 200, "result": True}, + # {"data": "medium", "status": 200, "result": True}, + # {"data": "large-v1", "status": 200, "result": True}, + # {"data": "large-v2", "status": 400, "result": True}, + # {"data": "large-v3", "status": 400, "result": True}, + # {"data": "large-v3-turbo-int8", "status": 400, "result": True}, + # {"data": "large-v3-turbo", "status": 400, "result": True} + # ], + # "/run/open_filepath_logs": {"data": None, "status": 200, "result": True}, + # "/run/open_filepath_config_file": {"data": None, "status": 200, "result": True}, + # "/run/feed_watchdog": {"data": None, "status": 200, "result": True}, } def test_endpoints_on_off_single(self): @@ -226,84 +238,81 @@ class TestMainloop(): break print("----ON/OFF系のエンドポイントのテスト終了----") - def test_endpoints_on_off_random(self): - print("----ON/OFFでのランダムアクセスのテスト----") - for i in range(1000): - endpoint = random.choice(self.validity_endpoints) - print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) - if endpoint.startswith("/set/enable/"): - result, status = self.main.handleRequest(endpoint, None) - expected_result = True - if result == expected_result and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - pprint.pprint(self.config_dict) - break - elif endpoint.startswith("/set/disable/"): - result, status = self.main.handleRequest(endpoint, None) - expected_result = False - if result == expected_result and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - pprint.pprint(self.config_dict) - break - time.sleep(0.2) + # def test_endpoints_on_off_random(self): + # print("----ON/OFFでのランダムアクセスのテスト----") + # for i in range(1000): + # endpoint = random.choice(self.validity_endpoints) + # print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + # if endpoint.startswith("/set/enable/"): + # result, status = self.main.handleRequest(endpoint, None) + # expected_result = True + # if result == expected_result and status == 200: + # self.config_dict[endpoint.split("/")[-1]] = result + # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + # else: + # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + # pprint.pprint(self.config_dict) + # break + # elif endpoint.startswith("/set/disable/"): + # result, status = self.main.handleRequest(endpoint, None) + # expected_result = False + # if result == expected_result and status == 200: + # self.config_dict[endpoint.split("/")[-1]] = result + # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + # else: + # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + # pprint.pprint(self.config_dict) + # break - # 最後にすべてOFFにして終了 - for endpoint in self.validity_endpoints: - if endpoint.startswith("/set/disable/"): - result, status = self.main.handleRequest(endpoint, None) - time.sleep(0.2) - print("----ON/OFFでのランダムアクセスのテスト終了----") + # # 最後にすべてOFFにして終了 + # for endpoint in self.validity_endpoints: + # if endpoint.startswith("/set/disable/"): + # result, status = self.main.handleRequest(endpoint, None) + # time.sleep(0.2) + # print("----ON/OFFでのランダムアクセスのテスト終了----") - def test_endpoints_on_off_continuous(self): - print("----ON/OFF連続テスト----") - # endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] - endpoints = [ - "/set/enable/translation", - "/set/disable/translation", - "/set/enable/transcription_send", - "/set/disable/transcription_send", - "/set/enable/transcription_receive", - "/set/disable/transcription_receive", - ] - for i in range(1000): - endpoint = random.choice(endpoints) - print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) - if endpoint.startswith("/set/enable/"): - result, status = self.main.handleRequest(endpoint, None) - expected_result = True - if result == expected_result and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - pprint.pprint(self.config_dict) - break - elif endpoint.startswith("/set/disable/"): - result, status = self.main.handleRequest(endpoint, None) - expected_result = False - if result == expected_result and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - pprint.pprint(self.config_dict) - break - time.sleep(0.2) + # def test_endpoints_on_off_continuous(self): + # print("----ON/OFF連続テスト----") + # # endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] + # endpoints = [ + # "/set/enable/translation", + # "/set/disable/translation", + # "/set/enable/transcription_send", + # "/set/disable/transcription_send", + # "/set/enable/transcription_receive", + # "/set/disable/transcription_receive", + # ] + # for i in range(1000): + # endpoint = random.choice(endpoints) + # print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + # if endpoint.startswith("/set/enable/"): + # result, status = self.main.handleRequest(endpoint, None) + # expected_result = True + # if result == expected_result and status == 200: + # self.config_dict[endpoint.split("/")[-1]] = result + # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + # else: + # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + # pprint.pprint(self.config_dict) + # break + # elif endpoint.startswith("/set/disable/"): + # result, status = self.main.handleRequest(endpoint, None) + # expected_result = False + # if result == expected_result and status == 200: + # self.config_dict[endpoint.split("/")[-1]] = result + # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + # else: + # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + # pprint.pprint(self.config_dict) + # break - # 最後にすべてOFFにして終了 - for endpoint in self.validity_endpoints: - if endpoint.startswith("/set/disable/"): - result, status = self.main.handleRequest(endpoint, None) - time.sleep(0.2) - print("----ON/OFF連続テスト終了----") + # # 最後にすべてOFFにして終了 + # for endpoint in self.validity_endpoints: + # if endpoint.startswith("/set/disable/"): + # result, status = self.main.handleRequest(endpoint, None) + # print("----ON/OFF連続テスト終了----") - def test_set_data_endpoints(self): + def test_set_data_endpoints_single(self): print("----データ設定系のエンドポイントのテスト----") for endpoint in self.set_data_endpoints: print(f"Testing endpoint: {endpoint}", end=" ", flush=True) @@ -465,15 +474,67 @@ class TestMainloop(): break else: print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint.") - time.sleep(0.2) print("----データ設定系のエンドポイントのテスト終了----") + def test_run_endpoints_single(self): + print("----実行系のエンドポイントのテスト----") + for endpoint, tests in self.run_endpoints.items(): + print(f"Testing endpoint: {endpoint}", end=" ", flush=True) + match endpoint: + case "/run/send_message_box": + for test in tests: + data = test["data"] + expected_status = test["status"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f" Current config_dict: {self.config_dict}") + break + case "/run/typing_message_box" | "/run/stop_typing_message_box": + for test in tests: + data = test["data"] + expected_status = test["status"] + expected_result = test["result"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status and result == expected_result: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + print(f" Current config_dict: {self.config_dict}") + break + case "/run/send_text_overlay": + for test in tests: + data = test["data"] + expected_status = test["status"] + expected_result = test["result"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status and result == expected_result: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + print(f" Current config_dict: {self.config_dict}") + break + case "/run/swap_your_language_and_target_language": + for test in tests: + data = test["data"] + expected_status = test["status"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f" Current config_dict: {self.config_dict}") + break + print("----実行系のエンドポイントのテスト終了----") + if __name__ == "__main__": try: test = TestMainloop() - # test.test_endpoints_on_off_random() - # test.test_endpoints_continuous() - test.test_set_data_endpoints() + test.test_endpoints_on_off_single() + test.test_set_data_endpoints_single() + test.test_run_endpoints_single() except KeyboardInterrupt: print("Interrupted by user, shutting down...") except Exception as e: From c38e474385c6f18bd80c20669d16a686a707cd27 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Wed, 24 Sep 2025 01:06:11 +0900 Subject: [PATCH 06/11] =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E5=BC=B7=E5=8C=96=E3=81=97=E3=80=81ON/OFF=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0=E3=80=82=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E7=B3=BB=E3=81=8A=E3=82=88=E3=81=B3=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E7=B3=BB=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E3=80=81=E3=83=A9=E3=83=B3=E3=83=80?= =?UTF-8?q?=E3=83=A0=E3=82=A2=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E5=AE=9F=E8=A3=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/test_endpoints.py | 612 ++++++++++++++++++----------------- 1 file changed, 318 insertions(+), 294 deletions(-) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index 0c7c3704..e2f1b18f 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -214,327 +214,351 @@ class TestMainloop(): # "/run/feed_watchdog": {"data": None, "status": 200, "result": True}, } - def test_endpoints_on_off_single(self): + def test_endpoints_on_off_single(self, endpoint): + success = False + if endpoint.startswith("/set/enable/"): + result, status = self.main.handleRequest(endpoint, None) + if result is True and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") + elif endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + if result is False and status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") + return success + + def test_endpoints_on_off_all(self): print("----ON/OFF系のエンドポイントのテスト----") for endpoint in self.validity_endpoints: print(f"Testing endpoint: {endpoint}", end="", flush=True) - if endpoint.startswith("/set/enable/"): - result, status = self.main.handleRequest(endpoint, None) - if result is True and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") - print(f"Current config_dict: {self.config_dict}") - break - elif endpoint.startswith("/set/disable/"): - result, status = self.main.handleRequest(endpoint, None) - if result is False and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") - print(f"Current config_dict: {self.config_dict}") - break + if self.test_endpoints_on_off_single(endpoint) is False: + break print("----ON/OFF系のエンドポイントのテスト終了----") - # def test_endpoints_on_off_random(self): - # print("----ON/OFFでのランダムアクセスのテスト----") - # for i in range(1000): - # endpoint = random.choice(self.validity_endpoints) - # print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) - # if endpoint.startswith("/set/enable/"): - # result, status = self.main.handleRequest(endpoint, None) - # expected_result = True - # if result == expected_result and status == 200: - # self.config_dict[endpoint.split("/")[-1]] = result - # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - # else: - # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - # pprint.pprint(self.config_dict) - # break - # elif endpoint.startswith("/set/disable/"): - # result, status = self.main.handleRequest(endpoint, None) - # expected_result = False - # if result == expected_result and status == 200: - # self.config_dict[endpoint.split("/")[-1]] = result - # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - # else: - # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - # pprint.pprint(self.config_dict) - # break + def test_endpoints_on_off_random(self): + print("----ON/OFFでのランダムアクセスのテスト----") + for i in range(1000): + endpoint = random.choice(self.validity_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + if self.test_endpoints_on_off_single(endpoint) is False: + break - # # 最後にすべてOFFにして終了 - # for endpoint in self.validity_endpoints: - # if endpoint.startswith("/set/disable/"): - # result, status = self.main.handleRequest(endpoint, None) - # time.sleep(0.2) - # print("----ON/OFFでのランダムアクセスのテスト終了----") + # 最後にすべてOFFにして終了 + for endpoint in self.validity_endpoints: + if endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + time.sleep(0.2) + print("----ON/OFFでのランダムアクセスのテスト終了----") - # def test_endpoints_on_off_continuous(self): - # print("----ON/OFF連続テスト----") - # # endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] - # endpoints = [ - # "/set/enable/translation", - # "/set/disable/translation", - # "/set/enable/transcription_send", - # "/set/disable/transcription_send", - # "/set/enable/transcription_receive", - # "/set/disable/transcription_receive", - # ] - # for i in range(1000): - # endpoint = random.choice(endpoints) - # print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) - # if endpoint.startswith("/set/enable/"): - # result, status = self.main.handleRequest(endpoint, None) - # expected_result = True - # if result == expected_result and status == 200: - # self.config_dict[endpoint.split("/")[-1]] = result - # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - # else: - # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - # pprint.pprint(self.config_dict) - # break - # elif endpoint.startswith("/set/disable/"): - # result, status = self.main.handleRequest(endpoint, None) - # expected_result = False - # if result == expected_result and status == 200: - # self.config_dict[endpoint.split("/")[-1]] = result - # print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - # else: - # print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - # pprint.pprint(self.config_dict) - # break + def test_endpoints_on_off_continuous(self): + print("----ON/OFF連続テスト----") + endpoints = ["/set/enable/websocket_server", "/set/disable/websocket_server"] + # endpoints = [ + # "/set/enable/translation", + # "/set/disable/translation", + # "/set/enable/transcription_send", + # "/set/disable/transcription_send", + # "/set/enable/transcription_receive", + # "/set/disable/transcription_receive", + # ] + for i in range(1000): + endpoint = random.choice(endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + if self.test_endpoints_on_off_single(endpoint) is False: + break - # # 最後にすべてOFFにして終了 - # for endpoint in self.validity_endpoints: - # if endpoint.startswith("/set/disable/"): - # result, status = self.main.handleRequest(endpoint, None) - # print("----ON/OFF連続テスト終了----") + # 最後にすべてOFFにして終了 + for endpoint in self.validity_endpoints: + if endpoint.startswith("/set/disable/"): + result, status = self.main.handleRequest(endpoint, None) + print("----ON/OFF連続テスト終了----") - def test_set_data_endpoints_single(self): + def test_set_data_endpoints_single(self, endpoint): + success = False + match endpoint: + case "/set/data/selected_tab_no": + data = random.choice(["1", "2", "3"]) + case "/set/data/selected_translation_engines": + translation_engines = self.config_dict.get("translation_engines", None) + data = {} + for i in ["1", "2", "3"]: + data[i] = random.choice(translation_engines) + case "/set/data/selected_your_languages": + selectable_language_list = self.config_dict.get("selectable_language_list", None) + data = {} + for i in ["1", "2", "3"]: + data[i] = {} + data[i]["1"] = random.choice(selectable_language_list) | {"enable": True} + case "/set/data/selected_target_languages": + selectable_language_list = self.config_dict.get("selectable_language_list", None) + data = {} + for i in ["1", "2", "3"]: + data[i] = {} + for j in ["1", "2", "3"]: + data[i][j] = random.choice(selectable_language_list) | {"enable": random.choice([True, False])} + case "/set/data/selected_transcription_engine": + transcription_engines = self.config_dict.get("transcription_engines", None) + data = random.choice(transcription_engines) + case "/set/data/transparency": + data = random.randint(0, 100) + case "/set/data/ui_scaling": + data = random.randint(50, 200) + case "/set/data/textbox_ui_scaling": + data = random.randint(50, 200) + case "/set/data/message_box_ratio": + data = round(random.uniform(0.1, 0.9), 2) + case "/set/data/send_message_button_type": + data = random.choice(["show", "hide", "show_and_disable_enter_key"]) + case "/set/data/font_family": + data = random.choice(["Arial", "Verdana", "Times New Roman"]) + case "/set/data/ui_language": + data = random.choice(["en", "ja", "ko", "zh-Hant", "zh-Hans"]) + case "/set/data/main_window_geometry": + data = { + "x_pos": random.randint(0, 1920), + "y_pos": random.randint(0, 1080), + "width": random.randint(800, 1920), + "height": random.randint(600, 1080) + } + case "/set/data/selected_translation_compute_device": + data = random.choice(self.config_dict["translation_compute_device_list"]) + case "/set/data/selected_transcription_compute_device": + data = random.choice(self.config_dict["transcription_compute_device_list"]) + case "/set/data/ctranslate2_weight_type": + data = random.choice(list(self.config_dict["selectable_ctranslate2_weight_type_dict"].keys())) + case "/set/data/deepl_auth_key": + data = None # Set to None to avoid using a real key + case "/set/data/selected_mic_host": + data = random.choice(self.config_dict["mic_host_list"]) + case "/set/data/selected_mic_device": + data = random.choice(self.config_dict["mic_device_list"]) + case "/set/data/mic_threshold": + data = random.randint(0, 100) + case "/set/data/mic_record_timeout": + data = random.randint(1, 3) + case "/set/data/mic_phrase_timeout": + data = random.randint(5, 10) + case "/set/data/mic_max_phrases": + data = random.randint(1, 10) + case "/set/data/hotkeys": + data = { + 'toggle_vrct_visibility': None, + 'toggle_translation': None, + 'toggle_transcription_send': None, + 'toggle_transcription_receive': None + } + case "/set/data/plugins_status": + data = {plugin: random.choice([True, False]) for plugin in self.config_dict.get("plugins", [])} + case "/set/data/mic_avg_logprob": + data = random.uniform(-5, 0) + case "/set/data/mic_no_speech_prob": + data = random.uniform(0, 1) + case "/set/data/mic_word_filter": + data = random.choice( + [ + ["test_0_0", "test_0_1", "test_0_2", None], + ["test_1_0", "test_1_1", None], + ["test_2_0", None], + [None] + ] + ) + case "/set/data/selected_speaker_device": + data = random.choice(self.config_dict["speaker_device_list"]) + case "/set/data/speaker_threshold": + data = random.randint(0, 100) + case "/set/data/speaker_record_timeout": + data = random.randint(1, 3) + case "/set/data/speaker_phrase_timeout": + data = random.randint(5, 10) + case "/set/data/speaker_max_phrases": + data = random.randint(1, 10) + case "/set/data/speaker_avg_logprob": + data = random.uniform(-5, 0) + case "/set/data/speaker_no_speech_prob": + data = random.uniform(0, 1) + case "/set/data/whisper_weight_type": + data = random.choice([key for key, value in self.config_dict["selectable_whisper_weight_type_dict"].items() if value is True]) + case "/set/data/overlay_small_log_settings": + data = { + "x_pos": random.random(), + "y_pos": random.random(), + "z_pos": random.random(), + "x_rotation": random.random(), + "y_rotation": random.random(), + "z_rotation": random.random(), + "display_duration": random.randint(0, 100), + "fadeout_duration": random.randint(0, 100), + "opacity": random.random(), + "ui_scaling": random.random(), + "tracker": random.choice(["HMD", "LeftHand", "RightHand"]), + } + case "/set/data/overlay_large_log_settings": + data = { + "x_pos": random.random(), + "y_pos": random.random(), + "z_pos": random.random(), + "x_rotation": random.random(), + "y_rotation": random.random(), + "z_rotation": random.random(), + "display_duration": random.randint(0, 100), + "fadeout_duration": random.randint(0, 100), + "opacity": random.random(), + "ui_scaling": random.random(), + "tracker": random.choice(["HMD", "LeftHand", "RightHand"]), + } + case "/set/data/send_message_format_parts": + data = self.config_dict["send_message_format_parts"] + case "/set/data/received_message_format_parts": + data = self.config_dict["received_message_format_parts"] + case "/set/data/websocket_host": + data = "127.0.0.1" + case "/set/data/websocket_port": + data = random.randint(1024, 65535) + case "/set/data/osc_ip_address": + data = "127.0.0.1" + case "/set/data/osc_port": + data = random.randint(1024, 65535) + case _: + data = None + + if data is not None: + print(f"data: {data}", end=" ", flush=True) + result, status = self.main.handleRequest(endpoint, data) + if status == 200: + self.config_dict[endpoint.split("/")[-1]] = result + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f" Current config_dict: {self.config_dict}") + else: + print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint.") + success = True + return success + + def test_set_data_endpoints_all(self): print("----データ設定系のエンドポイントのテスト----") for endpoint in self.set_data_endpoints: print(f"Testing endpoint: {endpoint}", end=" ", flush=True) - match endpoint: - case "/set/data/selected_tab_no": - data = random.choice(["1", "2", "3"]) - case "/set/data/selected_translation_engines": - translation_engines = self.config_dict.get("translation_engines", None) - data = {} - for i in ["1", "2", "3"]: - data[i] = random.choice(translation_engines) - case "/set/data/selected_your_languages": - selectable_language_list = self.config_dict.get("selectable_language_list", None) - data = {} - for i in ["1", "2", "3"]: - data[i] = {} - data[i]["1"] = random.choice(selectable_language_list) | {"enable": True} - case "/set/data/selected_target_languages": - selectable_language_list = self.config_dict.get("selectable_language_list", None) - data = {} - for i in ["1", "2", "3"]: - data[i] = {} - for j in ["1", "2", "3"]: - data[i][j] = random.choice(selectable_language_list) | {"enable": random.choice([True, False])} - case "/set/data/selected_transcription_engine": - transcription_engines = self.config_dict.get("transcription_engines", None) - data = random.choice(transcription_engines) - case "/set/data/transparency": - data = random.randint(0, 100) - case "/set/data/ui_scaling": - data = random.randint(50, 200) - case "/set/data/textbox_ui_scaling": - data = random.randint(50, 200) - case "/set/data/message_box_ratio": - data = round(random.uniform(0.1, 0.9), 2) - case "/set/data/send_message_button_type": - data = random.choice(["show", "hide", "show_and_disable_enter_key"]) - case "/set/data/font_family": - data = random.choice(["Arial", "Verdana", "Times New Roman"]) - case "/set/data/ui_language": - data = random.choice(["en", "ja", "ko", "zh-Hant", "zh-Hans"]) - case "/set/data/main_window_geometry": - data = { - "x_pos": random.randint(0, 1920), - "y_pos": random.randint(0, 1080), - "width": random.randint(800, 1920), - "height": random.randint(600, 1080) - } - case "/set/data/selected_translation_compute_device": - data = random.choice(self.config_dict["translation_compute_device_list"]) - case "/set/data/selected_transcription_compute_device": - data = random.choice(self.config_dict["transcription_compute_device_list"]) - case "/set/data/ctranslate2_weight_type": - data = random.choice(list(self.config_dict["selectable_ctranslate2_weight_type_dict"].keys())) - case "/set/data/deepl_auth_key": - data = None # Set to None to avoid using a real key - case "/set/data/selected_mic_host": - data = random.choice(self.config_dict["mic_host_list"]) - case "/set/data/selected_mic_device": - data = random.choice(self.config_dict["mic_device_list"]) - case "/set/data/mic_threshold": - data = random.randint(0, 100) - case "/set/data/mic_record_timeout": - data = random.randint(1, 3) - case "/set/data/mic_phrase_timeout": - data = random.randint(5, 10) - case "/set/data/mic_max_phrases": - data = random.randint(1, 10) - case "/set/data/hotkeys": - data = { - 'toggle_vrct_visibility': None, - 'toggle_translation': None, - 'toggle_transcription_send': None, - 'toggle_transcription_receive': None - } - case "/set/data/plugins_status": - data = {plugin: random.choice([True, False]) for plugin in self.config_dict.get("plugins", [])} - case "/set/data/mic_avg_logprob": - data = random.uniform(-5, 0) - case "/set/data/mic_no_speech_prob": - data = random.uniform(0, 1) - case "/set/data/mic_word_filter": - data = random.choice( - [ - ["test_0_0", "test_0_1", "test_0_2", None], - ["test_1_0", "test_1_1", None], - ["test_2_0", None], - [None] - ] - ) - case "/set/data/selected_speaker_device": - data = random.choice(self.config_dict["speaker_device_list"]) - case "/set/data/speaker_threshold": - data = random.randint(0, 100) - case "/set/data/speaker_record_timeout": - data = random.randint(1, 3) - case "/set/data/speaker_phrase_timeout": - data = random.randint(5, 10) - case "/set/data/speaker_max_phrases": - data = random.randint(1, 10) - case "/set/data/speaker_avg_logprob": - data = random.uniform(-5, 0) - case "/set/data/speaker_no_speech_prob": - data = random.uniform(0, 1) - case "/set/data/whisper_weight_type": - data = random.choice([key for key, value in self.config_dict["selectable_whisper_weight_type_dict"].items() if value is True]) - case "/set/data/overlay_small_log_settings": - data = { - "x_pos": random.random(), - "y_pos": random.random(), - "z_pos": random.random(), - "x_rotation": random.random(), - "y_rotation": random.random(), - "z_rotation": random.random(), - "display_duration": random.randint(0, 100), - "fadeout_duration": random.randint(0, 100), - "opacity": random.random(), - "ui_scaling": random.random(), - "tracker": random.choice(["HMD", "LeftHand", "RightHand"]), - } - case "/set/data/overlay_large_log_settings": - data = { - "x_pos": random.random(), - "y_pos": random.random(), - "z_pos": random.random(), - "x_rotation": random.random(), - "y_rotation": random.random(), - "z_rotation": random.random(), - "display_duration": random.randint(0, 100), - "fadeout_duration": random.randint(0, 100), - "opacity": random.random(), - "ui_scaling": random.random(), - "tracker": random.choice(["HMD", "LeftHand", "RightHand"]), - } - case "/set/data/send_message_format_parts": - data = self.config_dict["send_message_format_parts"] - case "/set/data/received_message_format_parts": - data = self.config_dict["received_message_format_parts"] - case "/set/data/websocket_host": - data = "127.0.0.1" - case "/set/data/websocket_port": - data = random.randint(1024, 65535) - case "/set/data/osc_ip_address": - data = "127.0.0.1" - case "/set/data/osc_port": - data = random.randint(1024, 65535) - case _: - data = None + if self.test_set_data_endpoints_single(endpoint) is False: + break + print("----データ設定系のエンドポイントのテスト終了----") - if data is not None: - print(f"data: {data}", end=" ", flush=True) + def test_run_endpoints_single(self, endpoint, test): + success = False + match endpoint: + case "/run/send_message_box": + data = test["data"] + expected_status = test["status"] result, status = self.main.handleRequest(endpoint, data) - if status == 200: - self.config_dict[endpoint.split("/")[-1]] = result + if status == expected_status: print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True else: print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") print(f" Current config_dict: {self.config_dict}") - break - else: - print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint.") - print("----データ設定系のエンドポイントのテスト終了----") + case "/run/typing_message_box" | "/run/stop_typing_message_box": + data = test["data"] + expected_status = test["status"] + expected_result = test["result"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status and result == expected_result: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + print(f" Current config_dict: {self.config_dict}") + case "/run/send_text_overlay": + data = test["data"] + expected_status = test["status"] + expected_result = test["result"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status and result == expected_result: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") + print(f" Current config_dict: {self.config_dict}") + case "/run/swap_your_language_and_target_language": + data = test["data"] + expected_status = test["status"] + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status: + print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + success = True + else: + print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f" Current config_dict: {self.config_dict}") + case _: + print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No tests defined for this endpoint.") + success = True + return success - def test_run_endpoints_single(self): + def test_run_endpoints_all(self): print("----実行系のエンドポイントのテスト----") for endpoint, tests in self.run_endpoints.items(): print(f"Testing endpoint: {endpoint}", end=" ", flush=True) - match endpoint: - case "/run/send_message_box": - for test in tests: - data = test["data"] - expected_status = test["status"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") - print(f" Current config_dict: {self.config_dict}") - break - case "/run/typing_message_box" | "/run/stop_typing_message_box": - for test in tests: - data = test["data"] - expected_status = test["status"] - expected_result = test["result"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status and result == expected_result: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - print(f" Current config_dict: {self.config_dict}") - break - case "/run/send_text_overlay": - for test in tests: - data = test["data"] - expected_status = test["status"] - expected_result = test["result"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status and result == expected_result: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - print(f" Current config_dict: {self.config_dict}") - break - case "/run/swap_your_language_and_target_language": - for test in tests: - data = test["data"] - expected_status = test["status"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") - else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") - print(f" Current config_dict: {self.config_dict}") - break + success = True + for test in tests: + if self.test_run_endpoints_single(endpoint, test) is False: + success = False + break + if success is False: + break print("----実行系のエンドポイントのテスト終了----") + def test_endpoints_all_random(self): + print("----すべてのエンドポイントのランダムアクセスのテスト----") + endpoint_types = [ + "validity", + "set_data", + "run", + ] + + for i in range(1000): + endpoints_type = random.choice(endpoint_types) + match endpoints_type: + case "validity": + endpoint = random.choice(self.validity_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + if self.test_endpoints_on_off_single(endpoint) is False: + break + case "set_data": + endpoint = random.choice(self.set_data_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", end=" ", flush=True) + if self.test_set_data_endpoints_single(endpoint) is False: + break + case "run": + endpoint = random.choice(list(self.run_endpoints.keys())) + test = random.choice(self.run_endpoints[endpoint]) + print(f"No.{i:04} Testing endpoint: {endpoint}", end=" ", flush=True) + if self.test_run_endpoints_single(endpoint, test) is False: + break + + # 最後にすべてOFFにして終了 + for endpoint in self.validity_endpoints: + if endpoint.startswith("/set/disable/"): + _, _ = self.main.handleRequest(endpoint, None) + print("----すべてのエンドポイントのランダムアクセスのテスト終了----") + if __name__ == "__main__": try: test = TestMainloop() - test.test_endpoints_on_off_single() - test.test_set_data_endpoints_single() - test.test_run_endpoints_single() + # test.test_endpoints_on_off_all() + # test.test_set_data_endpoints_all() + # test.test_run_endpoints_all() + test.test_endpoints_all_random() + # test.test_endpoints_on_off_continuous() + # test.test_endpoints_on_off_random() except KeyboardInterrupt: print("Interrupted by user, shutting down...") except Exception as e: From 1b0e93b8f86b54c40860fa98c1d81b04d49e9352 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Wed, 24 Sep 2025 21:12:08 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E7=89=B9=E5=AE=9A=E3=81=AE=E3=82=A8?= =?UTF-8?q?=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E3=81=99=E3=82=8B=E3=83=A9=E3=83=B3=E3=83=80=E3=83=A0?= =?UTF-8?q?=E3=82=A2=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=80=81=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92?= =?UTF-8?q?=E6=94=B9=E5=96=84=E3=80=82=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E7=AF=84=E5=9B=B2=E3=82=92=E6=8B=A1=E5=A4=A7=E3=81=97=E3=80=81?= =?UTF-8?q?=E7=84=A1=E5=8A=B9=E5=8C=96=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E5=BC=B7=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/test_endpoints.py | 107 +++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 29 deletions(-) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index e2f1b18f..61dfba90 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -1,6 +1,5 @@ # 初期化のため、config.jsonの削除 import os -import pprint import time import random if os.path.exists("config.json"): @@ -220,26 +219,26 @@ class TestMainloop(): result, status = self.main.handleRequest(endpoint, None) if result is True and status == 200: self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") print(f"Current config_dict: {self.config_dict}") elif endpoint.startswith("/set/disable/"): result, status = self.main.handleRequest(endpoint, None) if result is False and status == 200: self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") print(f"Current config_dict: {self.config_dict}") return success def test_endpoints_on_off_all(self): print("----ON/OFF系のエンドポイントのテスト----") for endpoint in self.validity_endpoints: - print(f"Testing endpoint: {endpoint}", end="", flush=True) + print(f"Testing endpoint: {endpoint}", flush=True) if self.test_endpoints_on_off_single(endpoint) is False: break print("----ON/OFF系のエンドポイントのテスト終了----") @@ -248,7 +247,7 @@ class TestMainloop(): print("----ON/OFFでのランダムアクセスのテスト----") for i in range(1000): endpoint = random.choice(self.validity_endpoints) - print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) if self.test_endpoints_on_off_single(endpoint) is False: break @@ -272,7 +271,7 @@ class TestMainloop(): # ] for i in range(1000): endpoint = random.choice(endpoints) - print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) if self.test_endpoints_on_off_single(endpoint) is False: break @@ -435,13 +434,13 @@ class TestMainloop(): result, status = self.main.handleRequest(endpoint, data) if status == 200: self.config_dict[endpoint.split("/")[-1]] = result - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") print(f" Current config_dict: {self.config_dict}") else: - print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint.") + print(f"-> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint: {endpoint}.") success = True return success @@ -461,45 +460,45 @@ class TestMainloop(): expected_status = test["status"] result, status = self.main.handleRequest(endpoint, data) if status == expected_status: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") - print(f" Current config_dict: {self.config_dict}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") case "/run/typing_message_box" | "/run/stop_typing_message_box": data = test["data"] expected_status = test["status"] expected_result = test["result"] result, status = self.main.handleRequest(endpoint, data) if status == expected_status and result == expected_result: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - print(f" Current config_dict: {self.config_dict}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}, Expected: {expected_result}") + print(f"Current config_dict: {self.config_dict}") case "/run/send_text_overlay": data = test["data"] expected_status = test["status"] expected_result = test["result"] result, status = self.main.handleRequest(endpoint, data) if status == expected_status and result == expected_result: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}, Expected: {expected_result}") - print(f" Current config_dict: {self.config_dict}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}, Expected: {expected_result}") + print(f"Current config_dict: {self.config_dict}") case "/run/swap_your_language_and_target_language": data = test["data"] expected_status = test["status"] result, status = self.main.handleRequest(endpoint, data) if status == expected_status: - print(f"\t -> {Color.GREEN}[PASS]{Color.RESET} Status: {status}, Result: {result}") + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: - print(f"\t -> {Color.RED}[ERROR]{Color.RESET} Status: {status}, Result: {result}") - print(f" Current config_dict: {self.config_dict}") + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") case _: - print(f"\t -> {Color.YELLOW}[SKIP]{Color.RESET} No tests defined for this endpoint.") + print(f"-> {Color.YELLOW}[SKIP]{Color.RESET} No tests defined for this endpoint :{endpoint}.") success = True return success @@ -524,23 +523,23 @@ class TestMainloop(): "run", ] - for i in range(1000): + for i in range(10000): endpoints_type = random.choice(endpoint_types) match endpoints_type: case "validity": endpoint = random.choice(self.validity_endpoints) - print(f"No.{i:04} Testing endpoint: {endpoint}", end="", flush=True) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) if self.test_endpoints_on_off_single(endpoint) is False: break case "set_data": endpoint = random.choice(self.set_data_endpoints) - print(f"No.{i:04} Testing endpoint: {endpoint}", end=" ", flush=True) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) if self.test_set_data_endpoints_single(endpoint) is False: break case "run": endpoint = random.choice(list(self.run_endpoints.keys())) test = random.choice(self.run_endpoints[endpoint]) - print(f"No.{i:04} Testing endpoint: {endpoint}", end=" ", flush=True) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) if self.test_run_endpoints_single(endpoint, test) is False: break @@ -550,15 +549,65 @@ class TestMainloop(): _, _ = self.main.handleRequest(endpoint, None) print("----すべてのエンドポイントのランダムアクセスのテスト終了----") + + def test_endpoints_specific_random(self): + print("----特定のエンドポイントのランダムアクセスのテスト----") + + self.validity_specific_endpoints = [ + "/set/enable/websocket_server", + "/set/disable/websocket_server", + ] + + self.set_data_specific_endpoints = [ + "/set/data/ctranslate2_weight_type", + "/set/data/websocket_host", + "/set/data/websocket_port", + "/set/data/osc_ip_address", + "/set/data/osc_port", + ] + + endpoint_types = [ + "validity", + "set_data", + # "run", + ] + + for i in range(1000): + endpoints_type = random.choice(endpoint_types) + match endpoints_type: + case "validity": + endpoint = random.choice(self.validity_specific_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) + if self.test_endpoints_on_off_single(endpoint) is False: + break + case "set_data": + endpoint = random.choice(self.set_data_specific_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) + if self.test_set_data_endpoints_single(endpoint) is False: + break + case "run": + endpoint = random.choice(list(self.run_endpoints.keys())) + test = random.choice(self.run_endpoints[endpoint]) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) + if self.test_run_endpoints_single(endpoint, test) is False: + break + + # 最後にすべてOFFにして終了 + for endpoint in self.validity_endpoints: + if endpoint.startswith("/set/disable/"): + _, _ = self.main.handleRequest(endpoint, None) + print("----特定のエンドポイントのランダムアクセスのテスト終了----") + if __name__ == "__main__": try: test = TestMainloop() # test.test_endpoints_on_off_all() # test.test_set_data_endpoints_all() # test.test_run_endpoints_all() - test.test_endpoints_all_random() + # test.test_endpoints_all_random() # test.test_endpoints_on_off_continuous() # test.test_endpoints_on_off_random() + test.test_endpoints_specific_random() except KeyboardInterrupt: print("Interrupted by user, shutting down...") except Exception as e: From 53f1b958433e308d9de31ec359aa064547de5f76 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Wed, 24 Sep 2025 23:51:22 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E6=9C=9F=E5=BE=85=E3=81=95=E3=82=8C=E3=82=8B=E3=82=B9=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=82=B9=E3=82=92=E5=BC=B7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=80=81=E3=83=AA=E3=82=AF=E3=82=A8=E3=82=B9=E3=83=88=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E7=B5=90=E6=9E=9C=E3=82=92=E6=94=B9=E5=96=84?= =?UTF-8?q?=E3=80=82=E3=83=87=E3=83=BC=E3=82=BF=E8=A8=AD=E5=AE=9A=E7=B3=BB?= =?UTF-8?q?=E3=81=AE=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=AB=E3=81=8A=E3=81=91=E3=82=8B=E3=83=A9=E3=83=B3?= =?UTF-8?q?=E3=83=80=E3=83=A0=E3=83=87=E3=83=BC=E3=82=BF=E3=81=AE=E7=AF=84?= =?UTF-8?q?=E5=9B=B2=E3=82=92=E6=8B=A1=E5=A4=A7=E3=81=97=E3=80=81=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92?= =?UTF-8?q?=E3=83=95=E3=83=A9=E3=83=83=E3=82=B7=E3=83=A5=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/test_endpoints.py | 99 +++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index 61dfba90..988405ad 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -50,10 +50,10 @@ class TestMainloop(): self.config_dict = {} for endpoint in self.main.mapping.keys(): if endpoint.startswith("/get/data/"): - self.config_dict[endpoint.split("/")[-1]] = self.main.handleRequest(endpoint, None)[0] + self.config_dict[endpoint.split("/")[-1]], _ = self.main.handleRequest(endpoint, None) elif endpoint.startswith("/set/disable/"): - self.config_dict[endpoint.split("/")[-1]] = self.main.handleRequest(endpoint, None)[0] - print(self.config_dict) + self.config_dict[endpoint.split("/")[-1]], _ = self.main.handleRequest(endpoint, None) + print(self.config_dict, flush=True) self.validity_endpoints = [ "/set/enable/translation", @@ -112,7 +112,7 @@ class TestMainloop(): "/set/data/selected_tab_no", "/set/data/selected_translation_engines", "/set/data/selected_your_languages", - "/set/data/selected_target_languages" + "/set/data/selected_target_languages", "/set/data/selected_transcription_engine", "/set/data/transparency", "/set/data/ui_scaling", @@ -215,10 +215,18 @@ class TestMainloop(): def test_endpoints_on_off_single(self, endpoint): success = False + expected_status = [200] if endpoint.startswith("/set/enable/"): + match endpoint: + case "/set/enable/websocket_server": + expected_status = [200, 400] + case _: + pass + result, status = self.main.handleRequest(endpoint, None) - if result is True and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result + if status in expected_status: + if status == 200: + self.config_dict[endpoint.split("/")[-1]] = result print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: @@ -226,8 +234,9 @@ class TestMainloop(): print(f"Current config_dict: {self.config_dict}") elif endpoint.startswith("/set/disable/"): result, status = self.main.handleRequest(endpoint, None) - if result is False and status == 200: - self.config_dict[endpoint.split("/")[-1]] = result + if status in expected_status: + if status == 200: + self.config_dict[endpoint.split("/")[-1]] = result print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: @@ -283,6 +292,7 @@ class TestMainloop(): def test_set_data_endpoints_single(self, endpoint): success = False + expected_status = [200] match endpoint: case "/set/data/selected_tab_no": data = random.choice(["1", "2", "3"]) @@ -335,19 +345,36 @@ class TestMainloop(): case "/set/data/ctranslate2_weight_type": data = random.choice(list(self.config_dict["selectable_ctranslate2_weight_type_dict"].keys())) case "/set/data/deepl_auth_key": - data = None # Set to None to avoid using a real key + data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + expected_status = [400] case "/set/data/selected_mic_host": data = random.choice(self.config_dict["mic_host_list"]) case "/set/data/selected_mic_device": data = random.choice(self.config_dict["mic_device_list"]) case "/set/data/mic_threshold": - data = random.randint(0, 100) + data = random.randint(-1000, 3000) + if 0 <= data <= 2000: + expected_status = [200] + else: + expected_status = [400] case "/set/data/mic_record_timeout": - data = random.randint(1, 3) + data = random.randint(-1, 10) + if 0 <= data <= self.config_dict["mic_phrase_timeout"]: + expected_status = [200] + else: + expected_status = [400] case "/set/data/mic_phrase_timeout": - data = random.randint(5, 10) + data = random.randint(-1, 10) + if self.config_dict["mic_record_timeout"] <= data: + expected_status = [200] + else: + expected_status = [400] case "/set/data/mic_max_phrases": - data = random.randint(1, 10) + data = random.randint(-1, 10) + if 0 <= data: + expected_status = [200] + else: + expected_status = [400] case "/set/data/hotkeys": data = { 'toggle_vrct_visibility': None, @@ -373,13 +400,29 @@ class TestMainloop(): case "/set/data/selected_speaker_device": data = random.choice(self.config_dict["speaker_device_list"]) case "/set/data/speaker_threshold": - data = random.randint(0, 100) + data = random.randint(-1000, 5000) + if 0 <= data <= 4000: + expected_status = [200] + else: + expected_status = [400] case "/set/data/speaker_record_timeout": - data = random.randint(1, 3) + data = random.randint(-1, 10) + if 0 <= data <= self.config_dict["speaker_phrase_timeout"]: + expected_status = [200] + else: + expected_status = [400] case "/set/data/speaker_phrase_timeout": - data = random.randint(5, 10) + data = random.randint(-1, 10) + if self.config_dict["speaker_record_timeout"] <= data: + expected_status = [200] + else: + expected_status = [400] case "/set/data/speaker_max_phrases": - data = random.randint(1, 10) + data = random.randint(-1, 10) + if 0 <= data: + expected_status = [200] + else: + expected_status = [400] case "/set/data/speaker_avg_logprob": data = random.uniform(-5, 0) case "/set/data/speaker_no_speech_prob": @@ -419,11 +462,20 @@ class TestMainloop(): case "/set/data/received_message_format_parts": data = self.config_dict["received_message_format_parts"] case "/set/data/websocket_host": - data = "127.0.0.1" + data = random.choice(["127.0.0.1", "aaaaadwafasdsd", "0210.1564.845.0"]) + if data == "127.0.0.1": + expected_status = [200, 400] + else: + expected_status = [400] case "/set/data/websocket_port": data = random.randint(1024, 65535) + expected_status = [200, 400] case "/set/data/osc_ip_address": - data = "127.0.0.1" + data = random.choice(["127.0.0.1", "aaaaadwafasdsd", "0210.1564.845.0"]) + if data == "127.0.0.1": + expected_status = [200] + else: + expected_status = [400] case "/set/data/osc_port": data = random.randint(1024, 65535) case _: @@ -432,8 +484,9 @@ class TestMainloop(): if data is not None: print(f"data: {data}", end=" ", flush=True) result, status = self.main.handleRequest(endpoint, data) - if status == 200: - self.config_dict[endpoint.split("/")[-1]] = result + if status in expected_status: + if status == 200: + self.config_dict[endpoint.split("/")[-1]] = result print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") success = True else: @@ -604,10 +657,10 @@ if __name__ == "__main__": # test.test_endpoints_on_off_all() # test.test_set_data_endpoints_all() # test.test_run_endpoints_all() - # test.test_endpoints_all_random() + test.test_endpoints_all_random() # test.test_endpoints_on_off_continuous() # test.test_endpoints_on_off_random() - test.test_endpoints_specific_random() + # test.test_endpoints_specific_random() except KeyboardInterrupt: print("Interrupted by user, shutting down...") except Exception as e: From 89a027a8e0b137843525506b3c7578c9d264d97f Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Thu, 25 Sep 2025 12:30:35 +0900 Subject: [PATCH 09/11] =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=92=E5=AE=9F=E6=96=BD=E3=81=97=E3=80=81=E5=8B=95?= =?UTF-8?q?=E7=9A=84=E3=81=AB=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=82=92=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E7=B5=90=E6=9E=9C=E3=81=AE=E8=A8=98=E9=8C=B2?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=80=81?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E7=B3=BB=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E6=96=B0=E3=81=9F=E3=81=AB=E5=AE=9F=E8=A3=85=E3=80=82?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E7=B5=90=E6=9E=9C=E3=81=AE=E3=82=B5?= =?UTF-8?q?=E3=83=9E=E3=83=AA=E3=83=BC=E8=A1=A8=E7=A4=BA=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=82=82=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/test_endpoints.py | 449 +++++++++++++++++------------------ 1 file changed, 223 insertions(+), 226 deletions(-) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index 988405ad..d5aa9cb4 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -55,162 +55,41 @@ class TestMainloop(): self.config_dict[endpoint.split("/")[-1]], _ = self.main.handleRequest(endpoint, None) print(self.config_dict, flush=True) - self.validity_endpoints = [ - "/set/enable/translation", - "/set/disable/translation", - "/set/enable/transcription_send", - "/set/disable/transcription_send", - "/set/enable/transcription_receive", - "/set/disable/transcription_receive", - "/set/enable/foreground", - "/set/disable/foreground", - "/set/enable/main_window_sidebar_compact_mode", - "/set/disable/main_window_sidebar_compact_mode", - "/set/enable/show_resend_button", - "/set/disable/show_resend_button", - "/set/enable/convert_message_to_romaji", - "/set/disable/convert_message_to_romaji", - "/set/enable/convert_message_to_hiragana", - "/set/disable/convert_message_to_hiragana", - "/set/enable/auto_mic_select", - "/set/disable/auto_mic_select", - "/set/enable/mic_automatic_threshold", - "/set/disable/mic_automatic_threshold", - "/set/enable/check_mic_threshold", - "/set/disable/check_mic_threshold", - "/set/enable/auto_speaker_select", - "/set/disable/auto_speaker_select", - "/set/enable/speaker_automatic_threshold", - "/set/disable/speaker_automatic_threshold", - "/set/enable/check_speaker_threshold", - "/set/disable/check_speaker_threshold", - "/set/enable/overlay_small_log", - "/set/disable/overlay_small_log", - "/set/enable/overlay_large_log", - "/set/disable/overlay_large_log", - "/set/enable/overlay_show_only_translated_messages", - "/set/disable/overlay_show_only_translated_messages", - "/set/enable/auto_clear_message_box", - "/set/disable/auto_clear_message_box", - "/set/enable/send_only_translated_messages", - "/set/disable/send_only_translated_messages", - "/set/enable/logger_feature", - "/set/disable/logger_feature", - "/set/enable/vrc_mic_mute_sync", - "/set/disable/vrc_mic_mute_sync", - "/set/enable/send_message_to_vrc", - "/set/disable/send_message_to_vrc", - "/set/enable/send_received_message_to_vrc", - "/set/disable/send_received_message_to_vrc", - "/set/enable/websocket_server", - "/set/disable/websocket_server", - "/set/enable/notification_vrc_sfx", - "/set/disable/notification_vrc_sfx", - ] + self.validity_endpoints = [] + for endpoint in self.main.mapping.keys(): + if endpoint.startswith("/set/enable/") or endpoint.startswith("/set/disable/"): + self.validity_endpoints.append(endpoint) - self.set_data_endpoints = [ - "/set/data/selected_tab_no", - "/set/data/selected_translation_engines", - "/set/data/selected_your_languages", - "/set/data/selected_target_languages", - "/set/data/selected_transcription_engine", - "/set/data/transparency", - "/set/data/ui_scaling", - "/set/data/textbox_ui_scaling", - "/set/data/message_box_ratio", - "/set/data/send_message_button_type", - "/set/data/font_family", - "/set/data/ui_language", - "/set/data/main_window_geometry", - "/set/data/selected_translation_compute_device", - "/set/data/selected_transcription_compute_device", - "/set/data/ctranslate2_weight_type", - "/set/data/deepl_auth_key", - "/set/data/selected_mic_host", - "/set/data/selected_mic_device", - "/set/data/mic_threshold", - "/set/data/mic_record_timeout", - "/set/data/mic_phrase_timeout", - "/set/data/mic_max_phrases", - "/set/data/hotkeys", - "/set/data/plugins_status", - "/set/data/mic_avg_logprob", - "/set/data/mic_no_speech_prob", - "/set/data/mic_word_filter", - "/set/data/selected_speaker_device", - "/set/data/speaker_threshold", - "/set/data/speaker_record_timeout", - "/set/data/speaker_phrase_timeout", - "/set/data/speaker_max_phrases", - "/set/data/speaker_avg_logprob", - "/set/data/speaker_no_speech_prob", - "/set/data/whisper_weight_type", - "/set/data/overlay_small_log_settings", - "/set/data/overlay_large_log_settings", - "/set/data/send_message_format_parts", - "/set/data/received_message_format_parts", - "/set/data/websocket_host", - "/set/data/websocket_port", - "/set/data/osc_ip_address", - "/set/data/osc_port", - ] + self.set_data_endpoints = [] + for endpoint in self.main.mapping.keys(): + if endpoint.startswith("/set/data/"): + self.set_data_endpoints.append(endpoint) - self.delete_data_endpoints = [ - "/delete/data/deepl_auth_key", - ] + self.delete_data_endpoints = [] + for endpoint in self.main.mapping.keys(): + if endpoint.startswith("/delete/data/"): + self.delete_data_endpoints.append(endpoint) - self.run_endpoints = { - "/run/send_message_box": [ - { - "data": {"id":"000001", "message":"test"}, - "status": 200, - }, - { - # 英語 - "data": {"id":"000002", "message":"Hello World!"}, - "status": 200, - }, - { - # 日本語 - "data": {"id":"000003", "message":"こんにちわ 世界!"}, - "status": 200, - }, - { - # 韓国語 - "data": {"id":"000004", "message":"안녕하세요 세계!"}, - "status": 200, - }, - { - # 中国語 繁体字 - "data": {"id":"000005", "message":"你好,世界!"}, - "status": 200, - }, - ], - "/run/typing_message_box": [{"data": None, "status": 200, "result": True}], - "/run/stop_typing_message_box": [{"data": None, "status": 200, "result": True}], - "/run/send_text_overlay": [{"data": "test_overlay", "status": 200, "result": "test_overlay"}], - "/run/swap_your_language_and_target_language": [{"data": None, "status": 200}], - # !!!Cant be tested here!!! - # "/run/update_software": [{"data": None, "status": 200, "result": True}], - # "/run/update_cuda_software": [{"data": None, "status": 200, "result": True}], - # "/run/download_ctranslate2_weight": [ - # {"data": "small", "status": 200, "result": True}, - # {"data": "large", "status": 400, "result": False}, - # ], - # "/run/download_whisper_weight": [ - # {"data": "tiny", "status": 200, "result": True}, - # {"data": "base", "status": 200, "result": True}, - # {"data": "small", "status": 200, "result": True}, - # {"data": "medium", "status": 200, "result": True}, - # {"data": "large-v1", "status": 200, "result": True}, - # {"data": "large-v2", "status": 400, "result": True}, - # {"data": "large-v3", "status": 400, "result": True}, - # {"data": "large-v3-turbo-int8", "status": 400, "result": True}, - # {"data": "large-v3-turbo", "status": 400, "result": True} - # ], - # "/run/open_filepath_logs": {"data": None, "status": 200, "result": True}, - # "/run/open_filepath_config_file": {"data": None, "status": 200, "result": True}, - # "/run/feed_watchdog": {"data": None, "status": 200, "result": True}, + self.run_endpoints = [] + for endpoint in self.main.mapping.keys(): + if endpoint.startswith("/run/"): + self.run_endpoints.append(endpoint) + + self.test_results = {} + + def record_test_result(self, endpoint, status, result, expected_status): + """ + テスト結果を記録する + :param endpoint: テスト対象のエンドポイント + :param status: 実際のステータスコード + :param result: 実際の結果 + :param expected_status: 期待されるステータスコード + """ + self.test_results[endpoint] = { + "status": status, + "result": result, + "expected_status": expected_status, + "success": status in expected_status } def test_endpoints_on_off_single(self, endpoint): @@ -242,14 +121,14 @@ class TestMainloop(): else: print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") print(f"Current config_dict: {self.config_dict}") + self.record_test_result(endpoint, status, result, expected_status) return success def test_endpoints_on_off_all(self): print("----ON/OFF系のエンドポイントのテスト----") for endpoint in self.validity_endpoints: print(f"Testing endpoint: {endpoint}", flush=True) - if self.test_endpoints_on_off_single(endpoint) is False: - break + self.test_endpoints_on_off_single(endpoint) print("----ON/OFF系のエンドポイントのテスト終了----") def test_endpoints_on_off_random(self): @@ -354,25 +233,25 @@ class TestMainloop(): case "/set/data/mic_threshold": data = random.randint(-1000, 3000) if 0 <= data <= 2000: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/mic_record_timeout": data = random.randint(-1, 10) if 0 <= data <= self.config_dict["mic_phrase_timeout"]: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/mic_phrase_timeout": data = random.randint(-1, 10) if self.config_dict["mic_record_timeout"] <= data: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/mic_max_phrases": data = random.randint(-1, 10) if 0 <= data: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/hotkeys": @@ -402,25 +281,25 @@ class TestMainloop(): case "/set/data/speaker_threshold": data = random.randint(-1000, 5000) if 0 <= data <= 4000: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/speaker_record_timeout": data = random.randint(-1, 10) if 0 <= data <= self.config_dict["speaker_phrase_timeout"]: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/speaker_phrase_timeout": data = random.randint(-1, 10) if self.config_dict["speaker_record_timeout"] <= data: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/speaker_max_phrases": data = random.randint(-1, 10) if 0 <= data: - expected_status = [200] + pass else: expected_status = [400] case "/set/data/speaker_avg_logprob": @@ -473,7 +352,7 @@ class TestMainloop(): case "/set/data/osc_ip_address": data = random.choice(["127.0.0.1", "aaaaadwafasdsd", "0210.1564.845.0"]) if data == "127.0.0.1": - expected_status = [200] + pass else: expected_status = [400] case "/set/data/osc_port": @@ -495,77 +374,113 @@ class TestMainloop(): else: print(f"-> {Color.YELLOW}[SKIP]{Color.RESET} No data to set for this endpoint: {endpoint}.") success = True + self.record_test_result(endpoint, status, result if data is not None else None, expected_status) # テスト結果を記録 return success def test_set_data_endpoints_all(self): print("----データ設定系のエンドポイントのテスト----") for endpoint in self.set_data_endpoints: print(f"Testing endpoint: {endpoint}", end=" ", flush=True) - if self.test_set_data_endpoints_single(endpoint) is False: - break + self.test_set_data_endpoints_single(endpoint) print("----データ設定系のエンドポイントのテスト終了----") - def test_run_endpoints_single(self, endpoint, test): + def test_run_endpoints_single(self, endpoint): success = False + expected_status = [200] match endpoint: case "/run/send_message_box": - data = test["data"] - expected_status = test["status"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status: - print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") - success = True - else: - print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") - print(f"Current config_dict: {self.config_dict}") - case "/run/typing_message_box" | "/run/stop_typing_message_box": - data = test["data"] - expected_status = test["status"] - expected_result = test["result"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status and result == expected_result: - print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") - success = True - else: - print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}, Expected: {expected_result}") - print(f"Current config_dict: {self.config_dict}") + data_list = [ + { + "data": {"id":"000001", "message":"test"}, + "status": [200], + }, + { + # 英語 + "data": {"id":"000002", "message":"Hello World!"}, + "status": [200], + }, + { + # 日本語 + "data": {"id":"000003", "message":"こんにちわ 世界!"}, + "status": [200], + }, + { + # 韓国語 + "data": {"id":"000004", "message":"안녕하세요 세계!"}, + "status": [200], + }, + { + # 中国語 繁体字 + "data": {"id":"000005", "message":"你好,世界!"}, + "status": [200], + }, + ] + choice_data = random.choice(data_list) + data, expected_status = choice_data["data"], choice_data["status"] + case "/run/typing_message_box": + data = None + case "/run/stop_typing_message_box": + data = None case "/run/send_text_overlay": - data = test["data"] - expected_status = test["status"] - expected_result = test["result"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status and result == expected_result: - print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") - success = True - else: - print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}, Expected: {expected_result}") - print(f"Current config_dict: {self.config_dict}") + data = "test_overlay" case "/run/swap_your_language_and_target_language": - data = test["data"] - expected_status = test["status"] - result, status = self.main.handleRequest(endpoint, data) - if status == expected_status: - print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") - success = True - else: - print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") - print(f"Current config_dict: {self.config_dict}") + data = None + case "/run/update_software": + data = None + expected_status = [401] # !!!Cant be tested here!!! + case "/run/update_cuda_software": + data = None + expected_status = [401] # !!!Cant be tested here!!! + case "/run/download_ctranslate2_weight": + data_list = random.choice(["small", "large"]) + data = random.choice(data_list) + expected_status = [401] # !!!Cant be tested here!!! + case "/run/download_whisper_weight": + data_list = [ + "tiny", "base", "small", "medium", + "large-v1", "large-v2", "large-v3", + "large-v3-turbo-int8", "large-v3-turbo" + ] + data = random.choice(data_list) + expected_status = [401] # !!!Cant be tested here!!! + case "/run/open_filepath_logs": + data = None + expected_status = [401] # !!!Cant be tested here!!! + case "/run/open_filepath_config_file": + data = None + expected_status = [401] # !!!Cant be tested here!!! + case "/run/feed_watchdog": + data = None + expected_status = [401] # !!!Cant be tested here!!! case _: - print(f"-> {Color.YELLOW}[SKIP]{Color.RESET} No tests defined for this endpoint :{endpoint}.") + data = None + expected_status = [404] success = True + + if expected_status == [401]: + print(f"-> {Color.YELLOW}[SKIP]{Color.RESET} No test available for this endpoint: {endpoint}.") + self.record_test_result(endpoint, None, None, expected_status) # テスト結果を記録 + return success + elif expected_status == [404]: + print(f"-> {Color.RED}[ERROR]{Color.RESET} Unknown endpoint: {endpoint}.") + self.record_test_result(endpoint, None, None, expected_status) # テスト結果を記録 + return False + + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status: + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") + success = True + else: + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") + self.record_test_result(endpoint, status, result, expected_status) # テスト結果を記録 return success def test_run_endpoints_all(self): print("----実行系のエンドポイントのテスト----") - for endpoint, tests in self.run_endpoints.items(): + for endpoint in self.run_endpoints: print(f"Testing endpoint: {endpoint}", end=" ", flush=True) - success = True - for test in tests: - if self.test_run_endpoints_single(endpoint, test) is False: - success = False - break - if success is False: - break + self.test_run_endpoints_single(endpoint) print("----実行系のエンドポイントのテスト終了----") def test_endpoints_all_random(self): @@ -574,6 +489,7 @@ class TestMainloop(): "validity", "set_data", "run", + "delete", ] for i in range(10000): @@ -590,10 +506,14 @@ class TestMainloop(): if self.test_set_data_endpoints_single(endpoint) is False: break case "run": - endpoint = random.choice(list(self.run_endpoints.keys())) - test = random.choice(self.run_endpoints[endpoint]) + endpoint = random.choice(self.run_endpoints) print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) - if self.test_run_endpoints_single(endpoint, test) is False: + if self.test_run_endpoints_single(endpoint) is False: + break + case "delete": + endpoint = random.choice(self.delete_data_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) + if self.test_delete_data_endpoints_single(endpoint) is False: break # 最後にすべてOFFにして終了 @@ -602,7 +522,6 @@ class TestMainloop(): _, _ = self.main.handleRequest(endpoint, None) print("----すべてのエンドポイントのランダムアクセスのテスト終了----") - def test_endpoints_specific_random(self): print("----特定のエンドポイントのランダムアクセスのテスト----") @@ -619,10 +538,14 @@ class TestMainloop(): "/set/data/osc_port", ] + self.run_specific_endpoints = [] + self.delete_data_endpoints = [] + endpoint_types = [ "validity", "set_data", # "run", + # "delete", ] for i in range(1000): @@ -639,10 +562,14 @@ class TestMainloop(): if self.test_set_data_endpoints_single(endpoint) is False: break case "run": - endpoint = random.choice(list(self.run_endpoints.keys())) - test = random.choice(self.run_endpoints[endpoint]) + endpoint = random.choice(self.run_specific_endpoints) print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) - if self.test_run_endpoints_single(endpoint, test) is False: + if self.test_run_endpoints_single(endpoint) is False: + break + case "delete": + endpoint = random.choice(self.delete_data_endpoints) + print(f"No.{i:04} Testing endpoint: {endpoint}", flush=True) + if self.test_delete_data_endpoints_single(endpoint) is False: break # 最後にすべてOFFにして終了 @@ -651,17 +578,87 @@ class TestMainloop(): _, _ = self.main.handleRequest(endpoint, None) print("----特定のエンドポイントのランダムアクセスのテスト終了----") + def test_delete_data_endpoints_single(self, endpoint): + success = False + expected_status = [200] + match endpoint: + case "/delete/data/deepl_auth_key": + data = None + case _: + data = None + expected_status = [404] + success = True + + if expected_status == [404]: + print(f"-> {Color.RED}[ERROR]{Color.RESET} Unknown endpoint: {endpoint}.") + self.record_test_result(endpoint, None, None, expected_status) # テスト結果を記録 + return False + + result, status = self.main.handleRequest(endpoint, data) + if status == expected_status: + print(f"-> {Color.GREEN}[PASS]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") + success = True + else: + print(f"-> {Color.RED}[ERROR]{Color.RESET} endpoint:{endpoint} Status: {status}, Result: {result}") + print(f"Current config_dict: {self.config_dict}") + self.record_test_result(endpoint, status, result, expected_status) # テスト結果を記録 + return success + + def test_delete_data_endpoints_all(self): + print("----データ削除系のエンドポイントのテスト----") + for endpoint in self.delete_data_endpoints: + print(f"Testing endpoint: {endpoint}", flush=True) + self.test_delete_data_endpoints_single(endpoint) + print("----データ削除系のエンドポイントのテスト終了----") + + def generate_summary(self): + """ + テスト結果のサマリーを生成して表示する + """ + total_tests = len(self.test_results) + passed_tests = sum(1 for result in self.test_results.values() if result["success"]) + untested_tests = sum(1 for result in self.test_results.values() if result["expected_status"] == [401]) + invalid_tests = sum(1 for result in self.test_results.values() if result["expected_status"] == [404]) + failed_tests = total_tests - passed_tests - untested_tests - invalid_tests + + print("\n---- テスト結果のサマリー ----") + print(f"総テスト数: {total_tests}") + print(f"成功したテスト数: {passed_tests}") + print(f"失敗したテスト数: {failed_tests}") + print(f"テストをしなかったテスト数: {untested_tests}") + print(f"無効なテスト数: {invalid_tests}\n") + + if untested_tests > 0: + print("テストをしなかったテストの詳細:") + for endpoint, result in self.test_results.items(): + if result["expected_status"] == [401]: + print(f"- エンドポイント: {endpoint}") + print(f" ステータス: {result['status']}") + print(f" 結果: {result['result']}\n") + if failed_tests > 0: + print("失敗したテストの詳細:") + for endpoint, result in self.test_results.items(): + if result["success"] != [200]: + print(f"- エンドポイント: {endpoint}") + print(f" ステータス: {result['status']} (期待されるステータス: {result['expected_status']})") + print(f" 結果: {result['result']}\n") + print("---- サマリー終了 ----\n") + if __name__ == "__main__": + import traceback try: test = TestMainloop() - # test.test_endpoints_on_off_all() - # test.test_set_data_endpoints_all() - # test.test_run_endpoints_all() - test.test_endpoints_all_random() + test.test_endpoints_on_off_all() + test.test_set_data_endpoints_all() + test.test_run_endpoints_all() + test.test_delete_data_endpoints_all() + # test.test_endpoints_all_random() # test.test_endpoints_on_off_continuous() # test.test_endpoints_on_off_random() # test.test_endpoints_specific_random() + test.generate_summary() except KeyboardInterrupt: print("Interrupted by user, shutting down...") except Exception as e: + traceback.print_exc() print(f"An error occurred: {e}") \ No newline at end of file From 93bdec7922e3d11ab15df1ca724e91070054a5f2 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Thu, 25 Sep 2025 12:37:13 +0900 Subject: [PATCH 10/11] =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=81=AB?= =?UTF-8?q?=E3=81=8A=E3=81=84=E3=81=A6=E3=80=81401=E3=81=8A=E3=82=88?= =?UTF-8?q?=E3=81=B3404=E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF=E3=82=B9?= =?UTF-8?q?=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=80=81=E8=A9=B2=E5=BD=93=E3=81=99=E3=82=8B=E3=82=A8=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=83=86=E3=82=B9=E3=83=88=E7=B5=90=E6=9E=9C?= =?UTF-8?q?=E3=82=92=E8=A8=98=E9=8C=B2=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=82=92=E5=AE=9F=E8=A3=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/test_endpoints.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src-python/test_endpoints.py b/src-python/test_endpoints.py index d5aa9cb4..b0ca93be 100644 --- a/src-python/test_endpoints.py +++ b/src-python/test_endpoints.py @@ -359,6 +359,16 @@ class TestMainloop(): data = random.randint(1024, 65535) case _: data = None + expected_status = [404] + + if expected_status == [401]: + print(f"-> {Color.YELLOW}[SKIP]{Color.RESET} No test available for this endpoint: {endpoint}.") + self.record_test_result(endpoint, None, None, expected_status) # テスト結果を記録 + return success + elif expected_status == [404]: + print(f"-> {Color.RED}[ERROR]{Color.RESET} Unknown endpoint: {endpoint}.") + self.record_test_result(endpoint, None, None, expected_status) # テスト結果を記録 + return False if data is not None: print(f"data: {data}", end=" ", flush=True) From 96ffd5509f3f55688d47317dac43980eb88aae84 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Thu, 25 Sep 2025 12:43:23 +0900 Subject: [PATCH 11/11] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AA=E5=90=8D=E5=89=8D=E3=82=92=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-python/{test_endpoints.py => backend_test.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src-python/{test_endpoints.py => backend_test.py} (100%) diff --git a/src-python/test_endpoints.py b/src-python/backend_test.py similarity index 100% rename from src-python/test_endpoints.py rename to src-python/backend_test.py