#![allow(missing_docs)] use std::collections::HashMap;
use std::path::{Path, PathBuf};
use asset_container::AssetManager;
use tracing::trace;
use wick_packet::{InherentData, RuntimeConfig};
use super::template_config::Renderable;
use super::LiquidJsonConfig;
use crate::config::test_case;
use crate::error::ManifestError;
#[derive(
Debug, Clone, derive_builder::Builder, derive_asset_container::AssetManager, property::Property, serde::Serialize,
)]
#[property(get(public), set(public), mut(public, suffix = "_mut"))]
#[asset(asset(crate::config::AssetReference))]
#[must_use]
pub struct TestConfiguration {
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) name: Option<String>,
#[asset(skip)]
#[property(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) source: Option<PathBuf>,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) config: Option<LiquidJsonConfig>,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) cases: Vec<test_case::TestCase>,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) env: Option<HashMap<String, String>>,
}
impl TestConfiguration {
pub fn set_source(&mut self, source: &Path) {
let source = source.to_path_buf();
self.source = Some(source);
}
pub(super) fn update_baseurls(&self) {
#[allow(clippy::expect_used)]
let mut source = self.source.clone().expect("No source set for this configuration");
if !source.is_dir() {
source.pop();
}
self.set_baseurl(&source);
}
#[allow(clippy::missing_const_for_fn)]
pub fn validate(&self) -> Result<(), ManifestError> {
Ok(())
}
pub fn initialize(&mut self) -> Result<&Self, ManifestError> {
let source = self.source.clone();
trace!(
source = ?source,
"initializing test configuration"
);
let env = self.env.clone();
self.render_config(source.as_deref(), None, env.as_ref())?;
Ok(self)
}
}
impl Renderable for TestConfiguration {
fn render_config(
&mut self,
source: Option<&Path>,
root_config: Option<&RuntimeConfig>,
env: Option<&HashMap<String, String>>,
) -> Result<(), ManifestError> {
if let Some(config) = self.config.as_mut() {
config.set_value(Some(config.render(
source,
root_config,
None,
env,
Some(&InherentData::unsafe_default()),
)?));
}
self.cases.render_config(source, root_config, env)?;
Ok(())
}
}