diff --git a/features/signal/basic/feature.rs b/features/signal/basic/feature.rs new file mode 100644 index 00000000..948986c2 --- /dev/null +++ b/features/signal/basic/feature.rs @@ -0,0 +1,66 @@ +use anyhow::{Result, ensure}; +use temporalio_client::{ + WorkflowGetResultOptions, WorkflowSignalOptions, +}; +use temporalio_features_harness::{Feature, FeatureContext, async_trait}; +use temporalio_macros::{workflow, workflow_methods}; +use temporalio_sdk::{SyncWorkflowContext, WorkerOptions, WorkflowContext, WorkflowResult}; + +const SIGNAL_DATA: &str = "signal-data"; + +#[workflow] +#[derive(Default)] +pub struct BasicSignalWorkflow { + result: Option, +} + +#[workflow_methods] +impl BasicSignalWorkflow { + #[run] + pub async fn run(ctx: &mut WorkflowContext) -> WorkflowResult { + ctx.wait_condition(|state| state.result.is_some()).await?; + Ok(ctx.state(|state| state.result.clone().unwrap_or_default())) + } + + #[signal(name = "mySignal")] + pub fn receive(&mut self, _ctx: &mut SyncWorkflowContext, value: String) { + self.result = Some(value); + } +} + +struct BasicSignalFeature; + +#[async_trait] +impl Feature for BasicSignalFeature { + fn worker_options(&self, mut worker_options: WorkerOptions) -> Result { + worker_options.register_workflow::()?; + Ok(worker_options) + } + + async fn execute(&self, context: FeatureContext) -> Result<()> { + let handle = context + .client + .start_workflow( + BasicSignalWorkflow::run, + (), + context.workflow_start_options(), + ) + .await?; + handle + .signal( + BasicSignalWorkflow::receive, + SIGNAL_DATA.to_owned(), + WorkflowSignalOptions::default(), + ) + .await?; + let result = handle + .get_result(WorkflowGetResultOptions::default()) + .await?; + ensure!(result == SIGNAL_DATA, "unexpected signal result: {result}"); + Ok(()) + } +} + +pub fn feature() -> impl Feature { + BasicSignalFeature +}