Skip to content

Commit 7131667

Browse files
committed
test(aggregator-client): add test to CertificateDetailsQuery and get latest genesis
imported and adapted from the associated route tests in the `mithril-aggregator` aggregator client.
1 parent 20479ce commit 7131667

File tree

4 files changed

+134
-15
lines changed

4 files changed

+134
-15
lines changed

internal/mithril-aggregator-client/src/client.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,24 +109,13 @@ impl AggregatorClient {
109109
#[cfg(test)]
110110
mod tests {
111111
use http::StatusCode;
112-
use httpmock::MockServer;
113112

114113
use mithril_common::test::api_version_extensions::ApiVersionProviderTestExtension;
115114

116-
use crate::test::TestLogger;
115+
use crate::test::{TestLogger, setup_server_and_client};
117116

118117
use super::*;
119118

120-
fn setup_server_and_client() -> (MockServer, AggregatorClient) {
121-
let server = MockServer::start();
122-
let client = AggregatorClient::builder(server.base_url())
123-
.with_logger(TestLogger::stdout())
124-
.build()
125-
.unwrap();
126-
127-
(server, client)
128-
}
129-
130119
#[derive(Debug, Eq, PartialEq, serde::Deserialize)]
131120
struct TestResponse {
132121
foo: String,

internal/mithril-aggregator-client/src/query/certificate/get_certificate_details.rs

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,15 @@ pub struct CertificateDetailsQuery {
1616

1717
impl CertificateDetailsQuery {
1818
/// Instantiate a query to get a certificate by hash
19-
pub fn by_hash(hash: String) -> Self {
20-
Self { hash }
19+
pub fn by_hash<H: Into<String>>(hash: H) -> Self {
20+
Self { hash: hash.into() }
21+
}
22+
23+
/// Instantiate a query to get the latest genesis certificate
24+
pub fn latest_genesis() -> Self {
25+
Self {
26+
hash: "genesis".to_string(),
27+
}
2128
}
2229
}
2330

@@ -51,3 +58,111 @@ impl AggregatorQuery for CertificateDetailsQuery {
5158
}
5259
}
5360
}
61+
62+
#[cfg(test)]
63+
mod tests {
64+
use serde_json::json;
65+
66+
use mithril_common::test::double::Dummy;
67+
68+
use crate::test::setup_server_and_client;
69+
70+
use super::*;
71+
72+
#[tokio::test]
73+
async fn test_certificates_details_ok_200() {
74+
let (server, client) = setup_server_and_client();
75+
let expected_message = CertificateMessage::dummy();
76+
let _server_mock = server.mock(|when, then| {
77+
when.path(format!("/certificate/{}", expected_message.hash));
78+
then.status(200).body(json!(expected_message).to_string());
79+
});
80+
81+
let fetched_message = client
82+
.send(CertificateDetailsQuery::by_hash(&expected_message.hash))
83+
.await
84+
.unwrap();
85+
86+
assert_eq!(Some(expected_message), fetched_message);
87+
}
88+
89+
#[tokio::test]
90+
async fn test_certificates_details_ok_404() {
91+
let (server, client) = setup_server_and_client();
92+
let _server_mock = server.mock(|when, then| {
93+
when.any_request();
94+
then.status(404);
95+
});
96+
97+
let fetched_message = client
98+
.send(CertificateDetailsQuery::by_hash("whatever"))
99+
.await
100+
.unwrap();
101+
102+
assert_eq!(None, fetched_message);
103+
}
104+
105+
#[tokio::test]
106+
async fn test_certificates_details_ko_500() {
107+
let (server, client) = setup_server_and_client();
108+
let _server_mock = server.mock(|when, then| {
109+
when.any_request();
110+
then.status(500).body("an error occurred");
111+
});
112+
113+
match client
114+
.send(CertificateDetailsQuery::by_hash("whatever"))
115+
.await
116+
.unwrap_err()
117+
{
118+
AggregatorClientError::RemoteServerTechnical(_) => (),
119+
e => panic!("Expected Aggregator::RemoteServerTechnical error, got '{e:?}'."),
120+
};
121+
}
122+
123+
#[tokio::test]
124+
async fn test_latest_genesis_ok_200() {
125+
let (server, client) = setup_server_and_client();
126+
let genesis_message = CertificateMessage::dummy();
127+
let _server_mock = server.mock(|when, then| {
128+
when.path("/certificate/genesis");
129+
then.status(200).body(json!(genesis_message).to_string());
130+
});
131+
132+
let fetched = client.send(CertificateDetailsQuery::latest_genesis()).await.unwrap();
133+
134+
assert_eq!(Some(genesis_message), fetched);
135+
}
136+
137+
#[tokio::test]
138+
async fn test_latest_genesis_ok_404() {
139+
let (server, client) = setup_server_and_client();
140+
let _server_mock = server.mock(|when, then| {
141+
when.path("/certificate/genesis");
142+
then.status(404);
143+
});
144+
145+
let fetched = client.send(CertificateDetailsQuery::latest_genesis()).await.unwrap();
146+
147+
assert_eq!(None, fetched);
148+
}
149+
150+
#[tokio::test]
151+
async fn test_latest_genesis_ko_500() {
152+
let (server, client) = setup_server_and_client();
153+
let _server_mock = server.mock(|when, then| {
154+
when.path("/certificate/genesis");
155+
then.status(500).body("an error occurred");
156+
});
157+
158+
let error = client
159+
.send(CertificateDetailsQuery::latest_genesis())
160+
.await
161+
.unwrap_err();
162+
163+
assert!(
164+
matches!(error, AggregatorClientError::RemoteServerTechnical(_)),
165+
"Expected Aggregator::RemoteServerTechnical error, got {error:?}"
166+
);
167+
}
168+
}

internal/mithril-aggregator-client/src/query/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Provides queries to retrieve or send data to a Mithril aggregator
22
//!
33
//! Available queries
4-
//! - Certificate: Get by hash
4+
//! - Certificate: Get by hash, get latest genesis certificate
55
//!
66
mod api;
77
mod certificate;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,17 @@
1+
use httpmock::MockServer;
2+
3+
use crate::AggregatorClient;
4+
15
#[cfg(test)]
26
mithril_common::define_test_logger!();
7+
8+
#[cfg(test)]
9+
pub(crate) fn setup_server_and_client() -> (MockServer, AggregatorClient) {
10+
let server = MockServer::start();
11+
let client = AggregatorClient::builder(server.base_url())
12+
.with_logger(TestLogger::stdout())
13+
.build()
14+
.unwrap();
15+
16+
(server, client)
17+
}

0 commit comments

Comments
 (0)