@@ -16,8 +16,15 @@ pub struct CertificateDetailsQuery {
1616
1717impl 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+ }
0 commit comments