From 6959f65fcc2cda4368e273639b88869323bc77a4 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 9 Sep 2025 11:58:13 +0300 Subject: [PATCH] refactor(src/adapter.rs): reduce code duplication in tests Signed-off-by: Lars Wirzenius --- src/adapter.rs | 153 ++++++++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 73 deletions(-) diff --git a/src/adapter.rs b/src/adapter.rs index e60fc55a..53fcd6a5 100644 --- a/src/adapter.rs +++ b/src/adapter.rs @@ -447,9 +447,9 @@ pub enum AdapterError { #[cfg(test)] mod test { - use std::{fs::write, io::ErrorKind, time::Duration}; + use std::{fs::write, io::ErrorKind, path::PathBuf, time::Duration}; - use tempfile::{tempdir, NamedTempFile}; + use tempfile::{tempdir, NamedTempFile, TempDir}; use radicle::git::Oid; use radicle::prelude::RepoId; @@ -485,17 +485,24 @@ mod test { .build()) } + #[allow(clippy::unwrap_used)] + fn adapter(tmp: &TempDir, shell: &'static str) -> PathBuf { + let bin = tmp.path().join("adapter.sh"); + mock_adapter(&bin, shell).unwrap(); + bin + } + #[test] fn adapter_reports_success() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"success"}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -509,15 +516,15 @@ echo '{"response":"finished","result":"success"}' #[test] fn adapter_reports_failure() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"failure"}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -536,17 +543,17 @@ echo '{"response":"finished","result":"failure"}' #[test] fn adapter_exits_nonzero() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"failure"}' echo woe be me 1>&2 exit 1 -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -562,13 +569,13 @@ exit 1 #[test] fn adapter_is_killed_before_any_messages() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh -kill -9 $$ -"#; - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; + let bin = adapter( + &tmp, + r#"#!/bin/sh +kill -9 $$ +"#, + ); let db = db()?; let mut run = run()?; @@ -583,12 +590,12 @@ kill -9 $$ #[test] fn adapter_ends_ok_before_first_message() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh -"#; - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; + let bin = adapter( + &tmp, + r#"#!/bin/sh +"#, + ); let db = db()?; let mut run = run()?; @@ -603,15 +610,15 @@ kill -9 $$ #[test] fn adapter_is_killed_before_first_message() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' kill -9 $$ -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -626,14 +633,14 @@ kill -9 $$ #[test] fn adapter_ends_ok_before_second_message() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -648,16 +655,16 @@ echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' #[test] fn adapter_is_killed_after_second_message() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"success"}' kill -9 $$ -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -676,15 +683,15 @@ kill -9 $$ #[test] fn adapter_produces_as_bad_message() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"success","bad":"field"}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -702,14 +709,14 @@ echo '{"response":"finished","result":"success","bad":"field"}' #[test] fn adapter_first_message_isnt_triggered() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"finished","result":"success"}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -729,16 +736,16 @@ echo '{"response":"finished","result":"success"}' #[test] fn adapter_outputs_too_many_messages() -> TestResult<()> { - const ADAPTER: &str = r#"#!/bin/sh + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/sh read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"success"}' echo '{"response":"finished","result":"success"}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?; @@ -813,15 +820,15 @@ echo '{"response":"finished","result":"success"}' // paths and errors should happen when a binary can't be // loaded due to missing dynamic linker or library or such. - const ADAPTER: &str = r#"#!/bin/does-not-exist + let tmp = tempdir()?; + let bin = adapter( + &tmp, + r#"#!/bin/does-not-exist read echo '{"response":"triggered","run_id":{"id":"xyzzy"}}' echo '{"response":"finished","result":"success"}' -"#; - - let tmp = tempdir()?; - let bin = tmp.path().join("adapter.sh"); - mock_adapter(&bin, ADAPTER)?; +"#, + ); let db = db()?; let mut run = run()?;