1use flow_component::SharedComponent;
2use tap_harness::TestRunner;
3use wick_config::config::test_case::TestCase;
4use wick_packet::RuntimeConfig;
5
6use crate::{run_test, TestError, UnitTest};
7
8#[derive(Debug)]
9#[must_use]
10pub struct TestGroup<'a> {
11 pub(crate) tests: Vec<UnitTest<'a>>,
12 pub(crate) root_config: Option<RuntimeConfig>,
13 pub(crate) name: String,
14}
15
16impl<'a> TestGroup<'a> {
17 pub fn from_test_cases<'b>(root_config: Option<RuntimeConfig>, tests: &'b [TestCase]) -> Self
18 where
19 'b: 'a,
20 {
21 let defs: Vec<UnitTest<'b>> = tests.iter().map(UnitTest::new).collect();
22 Self {
23 tests: defs,
24 root_config,
25 name: "Test".to_owned(),
26 }
27 }
28
29 #[allow(clippy::missing_const_for_fn)]
30 pub fn name(mut self, name: String) -> Self {
31 self.name = name;
32 self
33 }
34
35 pub async fn run(
36 &'a mut self,
37 component_id: Option<&str>,
38 component: SharedComponent,
39 filter: &[String],
40 ) -> Result<TestRunner, TestError> {
41 let name = self.name.clone();
42 let config = self.root_config.clone();
43 let tests = self
44 .tests
45 .iter_mut()
46 .filter(|test| {
47 if filter.is_empty() {
48 return true;
49 }
50 test
51 .test
52 .name()
53 .map_or(false, |name| filter.iter().any(|f| name.contains(f)))
54 })
55 .collect();
56 run_test(name, tests, component_id, component, config).await
57 }
58}