From 3a5528d9267091caed9bca9786f2af54d80bc80d Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 4 Sep 2026 10:09:24 -0400 Subject: [PATCH] test(rust): add query/successful_query --- features/query/successful_query/feature.rs | 114 +++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 features/query/successful_query/feature.rs diff --git a/features/query/successful_query/feature.rs b/features/query/successful_query/feature.rs new file mode 100644 index 00000000..95518f64 --- /dev/null +++ b/features/query/successful_query/feature.rs @@ -0,0 +1,114 @@ +use anyhow::{Result, ensure}; +use temporalio_client::{ + WorkflowGetResultOptions, WorkflowQueryOptions, WorkflowSignalOptions, +}; +use temporalio_features_harness::{Feature, FeatureContext, async_trait}; +use temporalio_macros::{workflow, workflow_methods}; +use temporalio_sdk::{ + SyncWorkflowContext, WorkerOptions, WorkflowContext, WorkflowContextView, WorkflowResult, +}; + +#[workflow] +#[derive(Default)] +pub struct SuccessfulQueryWorkflow { + counter: i32, +} + +#[workflow_methods] +impl SuccessfulQueryWorkflow { + #[run] + pub async fn run(ctx: &mut WorkflowContext) -> WorkflowResult<()> { + ctx.wait_condition(|state| state.counter == 5).await?; + Ok(()) + } + + #[signal(name = "counterInc")] + pub fn increment(&mut self, _ctx: &mut SyncWorkflowContext) { + self.counter += 1; + } + + #[query(name = "counterQ")] + pub fn counter(&self, _ctx: &WorkflowContextView) -> i32 { + self.counter + } +} + +struct SuccessfulQueryFeature; + +#[async_trait] +impl Feature for SuccessfulQueryFeature { + 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( + SuccessfulQueryWorkflow::run, + (), + context.workflow_start_options(), + ) + .await?; + + let result = handle + .query( + SuccessfulQueryWorkflow::counter, + (), + WorkflowQueryOptions::default(), + ) + .await?; + ensure!(result == 0, "expected counter 0, got {result}"); + + handle + .signal( + SuccessfulQueryWorkflow::increment, + (), + WorkflowSignalOptions::default(), + ) + .await?; + let result = handle + .query( + SuccessfulQueryWorkflow::counter, + (), + WorkflowQueryOptions::default(), + ) + .await?; + ensure!(result == 1, "expected counter 1, got {result}"); + + for _ in 0..3 { + handle + .signal( + SuccessfulQueryWorkflow::increment, + (), + WorkflowSignalOptions::default(), + ) + .await?; + } + let result = handle + .query( + SuccessfulQueryWorkflow::counter, + (), + WorkflowQueryOptions::default(), + ) + .await?; + ensure!(result == 4, "expected counter 4, got {result}"); + + handle + .signal( + SuccessfulQueryWorkflow::increment, + (), + WorkflowSignalOptions::default(), + ) + .await?; + handle + .get_result(WorkflowGetResultOptions::default()) + .await?; + Ok(()) + } +} + +pub fn feature() -> impl Feature { + SuccessfulQueryFeature +}