Skip to main content

wfe_core/primitives/
poll_endpoint.rs

1use async_trait::async_trait;
2
3use crate::models::poll_config::PollEndpointConfig;
4use crate::models::ExecutionResult;
5use crate::traits::step::{StepBody, StepExecutionContext};
6
7/// A step that polls an external HTTP endpoint until a condition is met.
8/// The actual HTTP polling is handled by the executor, not this step.
9#[derive(Default)]
10pub struct PollEndpointStep {
11    pub config: PollEndpointConfig,
12}
13
14#[async_trait]
15impl StepBody for PollEndpointStep {
16    async fn run(&mut self, _context: &StepExecutionContext<'_>) -> crate::Result<ExecutionResult> {
17        Ok(ExecutionResult::poll_endpoint(self.config.clone()))
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24    use crate::models::poll_config::{HttpMethod, PollCondition};
25    use crate::models::ExecutionPointer;
26    use crate::primitives::test_helpers::*;
27    use std::collections::HashMap;
28    use std::time::Duration;
29
30    #[tokio::test]
31    async fn returns_poll_config() {
32        let config = PollEndpointConfig {
33            url: "https://api.example.com/status".into(),
34            method: HttpMethod::Get,
35            headers: HashMap::new(),
36            body: None,
37            interval: Duration::from_secs(10),
38            timeout: Duration::from_secs(300),
39            condition: PollCondition::StatusCode(200),
40        };
41
42        let mut step = PollEndpointStep {
43            config: config.clone(),
44        };
45        let pointer = ExecutionPointer::new(0);
46        let wf_step = default_step();
47        let workflow = default_workflow();
48        let ctx = make_context(&pointer, &wf_step, &workflow);
49
50        let result = step.run(&ctx).await.unwrap();
51        assert!(!result.proceed);
52        assert_eq!(result.poll_endpoint, Some(config));
53    }
54}