Add response updating logic

This commit is contained in:
Mubelotix
2025-08-26 10:59:12 +02:00
parent b2a72b0363
commit 4290901dea
10 changed files with 233 additions and 85 deletions

View File

@ -1,4 +1,4 @@
use std::time::Duration;
use std::{sync::Arc, time::Duration};
use crate::common::{args::CommonArgs, client::Client, logs::setup_logs, workload::Workload};
use anyhow::{bail, Context};
@ -15,6 +15,14 @@ pub struct TestDeriveArgs {
/// Common arguments shared with other commands
#[command(flatten)]
common: CommonArgs,
/// Enables workloads to be rewritten in place to update expected responses.
#[arg(short, long, default_value_t = false)]
pub update_responses: bool,
/// Enables workloads to be rewritten in place to add missing expected responses.
#[arg(short, long, default_value_t = false)]
pub add_missing_responses: bool,
}
pub fn run(args: TestDeriveArgs) -> anyhow::Result<()> {
@ -30,18 +38,19 @@ async fn run_inner(args: TestDeriveArgs) -> anyhow::Result<()> {
setup_logs(&args.common.log_filter)?;
// setup clients
let assets_client = Client::new(
let assets_client = Arc::new(Client::new(
None,
args.common.assets_key.as_deref(),
Some(Duration::from_secs(3600)), // 1h
)?;
)?);
let meili_client = Client::new(
let meili_client = Arc::new(Client::new(
Some("http://127.0.0.1:7700".into()),
args.common.master_key.as_deref(),
Some(Duration::from_secs(args.common.tasks_queue_timeout_secs)),
)?;
)?);
let asset_folder = args.common.asset_folder.clone().leak();
for workload_file in &args.common.workload_file {
let workload: Workload = serde_json::from_reader(
std::fs::File::open(workload_file)
@ -49,16 +58,18 @@ async fn run_inner(args: TestDeriveArgs) -> anyhow::Result<()> {
)
.with_context(|| format!("error parsing {} as JSON", workload_file.display()))?;
let Workload::Test(mut workload) = workload else {
let Workload::Test(workload) = workload else {
bail!("workload file {} is not a test workload", workload_file.display());
};
match workload.run(&args, &assets_client, &meili_client).await {
let name = workload.name.clone();
match workload.run(&args, &assets_client, &meili_client, asset_folder).await {
Ok(_) => {
println!("✅ Workload {} completed successfully", workload.name,);
println!("✅ Workload {name} completed successfully");
}
Err(error) => {
println!("❌ Workload {} failed: {error}", workload.name,);
println!("❌ Workload {name} failed: {error}");
println!("Is this intentional? If so, rerun with --update-responses to update the workload files.");
return Err(error);
}
}