use std::{
collections::{BTreeMap, BTreeSet},
path::PathBuf,
};
use crate::{
config::Input,
descriptor::EnvValue,
id::{DataId, NodeId},
metadata::MetadataParameters,
};
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct IntegrationTestInput {
pub id: NodeId,
pub name: Option<String>,
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub args: Option<String>,
pub env: Option<BTreeMap<String, EnvValue>>,
#[serde(default)]
pub outputs: BTreeSet<DataId>,
#[serde(default)]
pub inputs: BTreeMap<DataId, Input>,
#[serde(skip_serializing_if = "Option::is_none")]
pub send_stdout_as: Option<String>,
pub events: Vec<TimedIncomingEvent>,
}
impl IntegrationTestInput {
pub fn new(id: NodeId, events: Vec<TimedIncomingEvent>) -> Self {
Self {
id,
name: None,
description: None,
args: None,
env: None,
outputs: BTreeSet::new(),
inputs: BTreeMap::new(),
send_stdout_as: None,
events,
}
}
}
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct TimedIncomingEvent {
pub time_offset_secs: f64,
#[serde(flatten)]
pub event: IncomingEvent,
}
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type")]
pub enum IncomingEvent {
Stop,
Input {
id: DataId,
metadata: Option<MetadataParameters>,
#[serde(flatten)]
data: Option<Box<InputData>>,
},
InputClosed {
id: DataId,
},
AllInputsClosed,
}
#[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)]
#[serde(untagged)]
pub enum InputData {
JsonObject {
data: serde_json::Value,
data_type: Option<serde_json::Value>,
},
ArrowFile {
path: PathBuf,
#[serde(default)]
batch_index: usize,
column: Option<String>,
},
}