Files

180 lines
4.9 KiB
Markdown

# Integration Testing
This doc covers `test-models`, the e2e test command for validating provider APIs work correctly.
## When to Run
Run `test-models` when:
- adding a new provider or model
- updating provider adapters
- debugging API connectivity issues
- verifying API keys are valid
- before releases (CI runs this automatically)
## Quick Start
```bash
# test all configured providers (requires API keys)
hyprvoice test-models
# output results to json
hyprvoice test-models --output results.json
```
## What It Tests
The command validates:
1. **Transcription providers**: sends a sample audio file through each model and verifies a transcription is returned
2. **LLM providers**: sends a test phrase through each model and verifies post-processing works
For each model, it reports:
- pass: API responded with valid output
- fail: API error or timeout
- skip: missing API key or dependency (e.g. whisper-cli not installed)
## API Keys
Keys are resolved from config or environment variables:
- `OPENAI_API_KEY`
- `GROQ_API_KEY`
- `DEEPGRAM_API_KEY`
- `ELEVENLABS_API_KEY`
- `MISTRAL_API_KEY`
Models without a valid key are skipped (not failed).
## Options
| Flag | Default | Description |
|------|---------|-------------|
| `--audio` | (downloaded sample) | custom WAV file to use |
| `--record-seconds` | 0 | record mic instead of using a file (e.g. `5s`) |
| `--timeout` | 45s | per-model timeout |
| `--output` | (none) | write JSON report to file |
| `--realtime` | true | pace streaming chunks in real time |
| `--both-modes` | true | test batch+streaming models in both modes |
| `--local-model` | (smallest) | whisper-cpp model to test |
| `--download-local` | false | download local model if missing |
| `--language` | en | language code for tests |
| `--keywords` | Hyprvoice,transcription,dictation | keywords for provider hints |
| `--no-keywords` | false | skip keyword hints |
| `--no-language` | false | use auto-detect instead of explicit language |
## Examples
```bash
# basic run - uses downloaded sample audio
hyprvoice test-models
# use your own audio file
hyprvoice test-models --audio ~/voice-sample.wav
# record 5 seconds from mic
hyprvoice test-models --record-seconds 5s
# longer timeout for slow connections
hyprvoice test-models --timeout 90s
# test local whisper-cpp with specific model
hyprvoice test-models --local-model base.en --download-local
# json report for CI
hyprvoice test-models --output test-results.json
```
## Output
Terminal output shows pass/fail/skip for each model:
```
test-models: total=25 pass=18 fail=2 skip=5
audio: /home/user/.cache/hyprvoice/testaudio.wav
pass openai/whisper-1 batch 1234ms output="She had your dark suit..."
pass openai/gpt-4o-transcribe batch 2156ms output="She had your dark suit..."
pass groq-transcription/whisper-large-v3 batch 456ms output="She had your dark suit..."
skip deepgram/nova-3 batch error=missing api key
fail mistral-transcription/voxtral-mini-latest batch 45000ms error=context deadline exceeded
pass openai/gpt-4o-mini llm 892ms output="I want to test Hyprvoice..."
```
JSON report (`--output`) includes full details:
```json
{
"started_at": "2024-01-15T10:30:00Z",
"audio_src": "/home/user/.cache/hyprvoice/testaudio.wav",
"results": [
{
"provider": "openai",
"model": "whisper-1",
"type": "transcription",
"mode": "batch",
"local": false,
"status": "pass",
"duration_ms": 1234,
"output": "She had your dark suit...",
"output_chars": 45
}
],
"pass_count": 18,
"fail_count": 2,
"skip_count": 5,
"total_count": 25
}
```
## CI Integration
The repo includes a GitHub Actions workflow (`.github/workflows/e2e.yml`) that runs `test-models` on demand:
```yaml
# triggered manually via workflow_dispatch
./hyprvoice test-models \
--timeout=60s \
--output=test-models-report.json
```
Secrets required in repo settings:
- `OPENAI_API_KEY`
- `GROQ_API_KEY`
- `DEEPGRAM_API_KEY`
- `ELEVENLABS_API_KEY`
- `MISTRAL_API_KEY`
## Adding a New Provider
When adding a new provider:
1. implement the adapter in `internal/transcriber/` or `internal/llm/`
2. register models in `internal/provider/`
3. add env var mapping if needed
4. run `test-models` to verify:
```bash
hyprvoice test-models --output before-merge.json
```
5. add the API key to CI secrets
## Local Model Testing
whisper-cpp models require:
- `whisper-cli` binary installed
- model downloaded (`hyprvoice model download <model>`)
Use `--download-local` to auto-download during test:
```bash
hyprvoice test-models --local-model tiny.en --download-local
```
Only the smallest local model is tested by default to save time. If it works, larger models should work too.
## Troubleshooting
**All models skipped**: check API keys are set in env or config
**Timeouts**: increase `--timeout`, check network connectivity
**whisper-cpp skipped**: install `whisper-cli` and download a model
**Streaming failures**: some providers have separate streaming endpoints - check provider docs