fix: run Rust tests in CI (#671)

* fix: run Rust tests in CI

Fixes #670

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: run Rust tests in CI

Adds a separate test.yml workflow to run existing Rust unit tests.

Fixes #670

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: use mock TranscriptionManager in CI tests

Swap to a mock adapter during CI to avoid compiling whisper/Vulkan.
The mock has the same interface but no heavy dependencies.
Existing tests don't exercise transcription code, so this is safe.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Josh Ribakoff 2026-01-31 19:18:50 -08:00 committed by GitHub
parent 9b361f661b
commit a033a67b13
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 79 additions and 0 deletions

24
.github/workflows/test.yml vendored Normal file
View file

@ -0,0 +1,24 @@
name: "test"
on: [pull_request]
jobs:
rust-tests:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev libasound2-dev libssl-dev
- name: Use mock TranscriptionManager (CI only)
working-directory: src-tauri
run: |
# Swap to mock adapter - avoids compiling whisper/Vulkan
cp src/managers/transcription_mock.rs src/managers/transcription.rs
sed -i '/^transcribe-rs/d' Cargo.toml
- name: Run Rust tests
working-directory: src-tauri
run: cargo test

View file

@ -0,0 +1,55 @@
// CI-only mock TranscriptionManager - avoids whisper/Vulkan dependencies.
// This file is copied over transcription.rs during CI tests.
// Existing tests don't exercise transcription, so this is safe.
use crate::managers::model::ModelManager;
use anyhow::Result;
use serde::Serialize;
use std::sync::Arc;
use tauri::AppHandle;
#[derive(Clone, Debug, Serialize)]
pub struct ModelStateEvent {
pub event_type: String,
pub model_id: Option<String>,
pub model_name: Option<String>,
pub error: Option<String>,
}
#[derive(Clone)]
pub struct TranscriptionManager {
#[allow(dead_code)]
app_handle: AppHandle,
}
impl TranscriptionManager {
pub fn new(app_handle: &AppHandle, _model_manager: Arc<ModelManager>) -> Result<Self> {
Ok(Self {
app_handle: app_handle.clone(),
})
}
pub fn is_model_loaded(&self) -> bool {
false
}
pub fn unload_model(&self) -> Result<()> {
Ok(())
}
pub fn maybe_unload_immediately(&self, _context: &str) {}
pub fn load_model(&self, _model_id: &str) -> Result<()> {
Ok(())
}
pub fn initiate_model_load(&self) {}
pub fn get_current_model(&self) -> Option<String> {
None
}
pub fn transcribe(&self, _audio: Vec<f32>) -> Result<String> {
Ok(String::new())
}
}