gobby-core 0.6.1

Shared foundation primitives for Gobby CLI tools
Documentation
use super::*;
use crate::config::AiCapability;

#[test]
fn sends_local_token_and_multipart() {
    let (port, request) = spawn_server(r#"{"description":"diagram","ocr_text":null}"#);
    let home = temp_home();
    let _env = EnvGuard::set_home(home.path());
    write_daemon_files(home.path(), port, "local-secret");
    let cfg = test_context(None);

    describe_image_via_daemon(&cfg, b"png bytes".to_vec(), "figure.png", "image/png").unwrap();
    let request = request.join().unwrap().unwrap();

    assert!(request.starts_with("POST /api/llm/vision/extract HTTP/1.1"));
    assert!(has_header(&request, "x-gobby-local-token", "local-secret"));
    assert!(request.contains("multipart/form-data"));
    assert!(request.contains("name=\"file\"; filename=\"figure.png\""));
    assert!(request.contains("Content-Type: image/png"));

    let (port, request) =
        spawn_server(r#"{"text":"hello","segments":[{"start":0.0,"end":1.0,"text":"hello"}]}"#);
    write_daemon_files(home.path(), port, "local-secret");

    transcribe_via_daemon(
        &cfg,
        b"audio bytes".to_vec(),
        "meeting.m4a",
        "audio/mp4",
        DaemonTranscriptionOptions::default(),
    )
    .unwrap();
    let request = request.join().unwrap().unwrap();

    assert!(request.starts_with("POST /api/voice/transcribe HTTP/1.1"));
    assert!(has_header(&request, "x-gobby-local-token", "local-secret"));
    assert!(request.contains("multipart/form-data"));
    assert!(request.contains("name=\"file\"; filename=\"meeting.m4a\""));
    assert!(request.contains("Content-Type: audio/mp4"));
}

#[test]
fn voice_multipart_carries_capability_fields() {
    let (port, request) = spawn_server(r#"{"text":"hello","segments":[]}"#);
    let home = temp_home();
    let _env = EnvGuard::set_home(home.path());
    write_daemon_files(home.path(), port, "voice-token");
    let cfg = test_context(None);

    transcribe_via_daemon(
        &cfg,
        b"audio bytes".to_vec(),
        "meeting.wav",
        "audio/wav",
        DaemonTranscriptionOptions {
            capability: AiCapability::AudioTranslate,
            language: Some("es"),
            target_lang: Some("en"),
            prompt: Some("names: Gobby"),
        },
    )
    .unwrap();
    let request = request.join().unwrap().unwrap();

    assert!(multipart_has_field(
        &request,
        "capability",
        "audio_translate"
    ));
    assert!(multipart_has_field(&request, "provider", "daemon-provider"));
    assert!(multipart_has_field(&request, "model", "daemon-model"));
    assert!(multipart_has_field(&request, "language", "es"));
    assert!(multipart_has_field(&request, "target_lang", "en"));
    assert!(multipart_has_field(&request, "prompt", "names: Gobby"));
    assert!(!multipart_has_field(&request, "capability", "translate"));

    let (port, request) = spawn_server(r#"{"text":"hello","segments":[]}"#);
    write_daemon_files(home.path(), port, "voice-token");

    transcribe_via_daemon(
        &cfg,
        b"audio bytes".to_vec(),
        "meeting.wav",
        "audio/wav",
        DaemonTranscriptionOptions::default(),
    )
    .unwrap();
    let request = request.join().unwrap().unwrap();

    assert!(multipart_has_field(
        &request,
        "capability",
        "audio_transcribe"
    ));
    assert!(!multipart_has_field(&request, "capability", "transcribe"));
}