extract shared yaak send flow and wire CLI

This commit is contained in:
Gregory Schier
2026-02-16 13:57:27 -08:00
parent 9856383566
commit 7cd47ae811
15 changed files with 665 additions and 299 deletions

View File

@@ -0,0 +1,42 @@
use std::io::{Read, Write};
use std::net::TcpListener;
use std::thread;
pub struct TestHttpServer {
pub url: String,
handle: Option<thread::JoinHandle<()>>,
}
impl TestHttpServer {
pub fn spawn_ok(body: &'static str) -> Self {
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind test HTTP server");
let addr = listener.local_addr().expect("Failed to get local addr");
let url = format!("http://{addr}/test");
let body_bytes = body.as_bytes().to_vec();
let handle = thread::spawn(move || {
if let Ok((mut stream, _)) = listener.accept() {
let mut request_buf = [0u8; 4096];
let _ = stream.read(&mut request_buf);
let response = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: {}\r\nConnection: close\r\n\r\n",
body_bytes.len()
);
let _ = stream.write_all(response.as_bytes());
let _ = stream.write_all(&body_bytes);
let _ = stream.flush();
}
});
Self { url, handle: Some(handle) }
}
}
impl Drop for TestHttpServer {
fn drop(&mut self) {
if let Some(handle) = self.handle.take() {
let _ = handle.join();
}
}
}

View File

@@ -1,5 +1,7 @@
#![allow(dead_code)]
pub mod http_server;
use assert_cmd::Command;
use assert_cmd::cargo::cargo_bin_cmd;
use std::path::Path;

View File

@@ -1,8 +1,10 @@
mod common;
use common::http_server::TestHttpServer;
use common::{cli_cmd, parse_created_id, query_manager, seed_request, seed_workspace};
use predicates::str::contains;
use tempfile::TempDir;
use yaak_models::models::HttpResponseState;
#[test]
fn show_and_delete_yes_round_trip() {
@@ -105,3 +107,53 @@ fn update_requires_id_in_json_payload() {
.failure()
.stderr(contains("request update requires a non-empty \"id\" field"));
}
#[test]
fn request_send_persists_response_body_and_events() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let data_dir = temp_dir.path();
seed_workspace(data_dir, "wk_test");
let server = TestHttpServer::spawn_ok("hello from integration test");
let create_assert = cli_cmd(data_dir)
.args([
"request",
"create",
"wk_test",
"--name",
"Send Test",
"--url",
&server.url,
])
.assert()
.success();
let request_id = parse_created_id(&create_assert.get_output().stdout, "request create");
cli_cmd(data_dir)
.args(["request", "send", &request_id])
.assert()
.success()
.stdout(contains("HTTP 200 OK"))
.stdout(contains("hello from integration test"));
let qm = query_manager(data_dir);
let db = qm.connect();
let responses =
db.list_http_responses_for_request(&request_id, None).expect("Failed to load responses");
assert_eq!(responses.len(), 1, "expected exactly one persisted response");
let response = &responses[0];
assert_eq!(response.status, 200);
assert!(matches!(response.state, HttpResponseState::Closed));
assert!(response.error.is_none());
let body_path =
response.body_path.as_ref().expect("expected persisted response body path").to_string();
let body = std::fs::read_to_string(&body_path).expect("Failed to read response body file");
assert_eq!(body, "hello from integration test");
let events =
db.list_http_response_events(&response.id).expect("Failed to load response events");
assert!(!events.is_empty(), "expected at least one persisted response event");
}