mithril_aggregator_client/query/get/
get_aggregator_status.rs

1use async_trait::async_trait;
2use reqwest::StatusCode;
3
4use mithril_common::messages::AggregatorStatusMessage;
5
6use crate::AggregatorHttpClientResult;
7use crate::query::{AggregatorQuery, QueryContext, QueryMethod, ResponseExt};
8
9/// Query to get the status of the aggregator
10pub struct GetAggregatorStatusQuery {}
11
12impl GetAggregatorStatusQuery {
13    /// Instantiate a query to get the status of the aggregator
14    pub fn current() -> Self {
15        Self {}
16    }
17}
18
19#[cfg_attr(target_family = "wasm", async_trait(?Send))]
20#[cfg_attr(not(target_family = "wasm"), async_trait)]
21impl AggregatorQuery for GetAggregatorStatusQuery {
22    type Response = AggregatorStatusMessage;
23    type Body = ();
24
25    fn method() -> QueryMethod {
26        QueryMethod::Get
27    }
28
29    fn route(&self) -> String {
30        "status".to_string()
31    }
32
33    async fn handle_response(
34        &self,
35        context: QueryContext,
36    ) -> AggregatorHttpClientResult<Self::Response> {
37        match context.response.status() {
38            StatusCode::OK => context.response.parse_json().await,
39            _ => Err(context.unhandled_status_code().await),
40        }
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use serde_json::json;
47
48    use mithril_common::test::double::Dummy;
49
50    use crate::AggregatorHttpClientError;
51    use crate::test::{assert_error_matches, setup_server_and_client};
52
53    use super::*;
54
55    #[tokio::test]
56    async fn test_aggregator_status_ok_200() {
57        let (server, client) = setup_server_and_client();
58        let message_expected = AggregatorStatusMessage::dummy();
59        let _server_mock = server.mock(|when, then| {
60            when.path("/status");
61            then.status(200).body(json!(message_expected).to_string());
62        });
63
64        let message = client.send(GetAggregatorStatusQuery::current()).await.unwrap();
65
66        assert_eq!(message_expected, message);
67    }
68
69    #[tokio::test]
70    async fn test_aggregator_status_ko_500() {
71        let (server, client) = setup_server_and_client();
72        server.mock(|when, then| {
73            when.any_request();
74            then.status(500).body("an error occurred");
75        });
76
77        let error = client.send(GetAggregatorStatusQuery::current()).await.unwrap_err();
78
79        assert_error_matches!(error, AggregatorHttpClientError::RemoteServerTechnical(_));
80    }
81
82    #[tokio::test]
83    async fn test_aggregator_status_ko_json_serialization() {
84        let (server, client) = setup_server_and_client();
85        server.mock(|when, then| {
86            when.any_request();
87            then.status(200).body("this is not a json");
88        });
89
90        let error = client.send(GetAggregatorStatusQuery::current()).await.unwrap_err();
91
92        assert_error_matches!(error, AggregatorHttpClientError::JsonParseFailed(_));
93    }
94}