Skip to main content

wfe_core/primitives/
poll_endpoint.rs

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