@@ -16,8 +16,15 @@ pub struct CertificateDetailsQuery {
16
16
17
17
impl CertificateDetailsQuery {
18
18
/// 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
+ }
21
28
}
22
29
}
23
30
@@ -51,3 +58,111 @@ impl AggregatorQuery for CertificateDetailsQuery {
51
58
}
52
59
}
53
60
}
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