test(backend): add comprehensive test coverage for backend modules

Added a new `.coveragerc` file configuring coverage thresholds and exclusions.
Included `pytest.ini` to enable coverage reporting for multiple backend modules (`main`, `llm`, `prompt`, `geoip`, `tts_asr`) with a 90 % fail‑under requirement and detailed HTML output.
Implemented a suite of unit tests:

* `test_geoip.py` – validates geo‑location lookup logic.
* `test_llm_extended.py` – tests LLm response extraction and Ollama interactions.
* `test_main_endpoints.py` – covers API endpoints for completions, OCR, and TTS.
* `test_prompt_extended.py` – verifies language sanitization, timestamp generation, and prompt building.
* `test_tts_asr_coverage.py` – checks device detection, cache clearing, and model loading under various environment configurations.
* `test_tts_asr_extended.py` – further tests TTS/ASR device selection and time‑outs.

Updated `backend/requirements.txt` to use newer, compatible packages, removed obsolete testing dependencies, and added `qwen-tts`.
Modified `backend/tts_asr.py` to work with the new `Qwen3TTSModel`, simplified imports, and adjusted device mapping logic.

Additionally, frontend changes added a new `TreeNodeItem` component, updated Markdown rendering, added TTS instruction fields, and reworked context menu handling.

No breaking changes were introduced.
This commit is contained in:
2026-04-07 23:38:23 +08:00
parent bece7be267
commit 2fdc996af9
19 changed files with 3420 additions and 2325 deletions
+7
View File
@@ -23,6 +23,8 @@ export const useSettingsStore = defineStore('settings', () => {
const backgroundType = ref('default') // 'default' | 'warm' | 'reading' | 'image'
const backgroundImage = ref('')
const backgroundOpacity = ref(0.2) // 0.05 - 0.50
// TTS Voice
const ttsInstruct = ref('')
// --- Getters ---
const uiLanguage = computed(() => {
@@ -70,6 +72,7 @@ export const useSettingsStore = defineStore('settings', () => {
}
if (data.backgroundImage) backgroundImage.value = data.backgroundImage
if (data.backgroundOpacity) backgroundOpacity.value = data.backgroundOpacity
if (typeof data.ttsInstruct === 'string') ttsInstruct.value = data.ttsInstruct
}
} catch {
// Failed to load settings, use defaults
@@ -89,6 +92,7 @@ export const useSettingsStore = defineStore('settings', () => {
backgroundType: backgroundType.value,
backgroundImage: backgroundImage.value,
backgroundOpacity: backgroundOpacity.value,
ttsInstruct: ttsInstruct.value,
}
localStorage.setItem('llm-in-text-settings', JSON.stringify(data))
} catch {
@@ -107,6 +111,7 @@ export const useSettingsStore = defineStore('settings', () => {
backgroundType.value = 'default'
backgroundImage.value = ''
backgroundOpacity.value = 0.2
ttsInstruct.value = ''
saveSettings()
}
@@ -122,6 +127,7 @@ export const useSettingsStore = defineStore('settings', () => {
backgroundType,
backgroundImage,
backgroundOpacity,
ttsInstruct,
],
() => {
saveSettings()
@@ -141,6 +147,7 @@ export const useSettingsStore = defineStore('settings', () => {
backgroundType,
backgroundImage,
backgroundOpacity,
ttsInstruct,
uiLanguage,
t,
initialMarkdown,