Add tests for REST API /validator/attestation
(#1189)
added tests that ensures `/validator/attestation` returns BAD_REQUEST if the required query parameters are missing in the request
This commit is contained in:
parent
ea56dcb179
commit
a88afb7409
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -169,6 +169,12 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "assert_matches"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-tls"
|
name = "async-tls"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
@ -3689,6 +3695,7 @@ dependencies = [
|
|||||||
name = "rest_api"
|
name = "rest_api"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"assert_matches",
|
||||||
"beacon_chain",
|
"beacon_chain",
|
||||||
"bls",
|
"bls",
|
||||||
"eth2-libp2p",
|
"eth2-libp2p",
|
||||||
|
@ -38,6 +38,7 @@ operation_pool = { path = "../operation_pool" }
|
|||||||
rayon = "1.3.0"
|
rayon = "1.3.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
assert_matches = "1.3.0"
|
||||||
remote_beacon_node = { path = "../../common/remote_beacon_node" }
|
remote_beacon_node = { path = "../../common/remote_beacon_node" }
|
||||||
node_test_rig = { path = "../../testing/node_test_rig" }
|
node_test_rig = { path = "../../testing/node_test_rig" }
|
||||||
tree_hash = "0.1.0"
|
tree_hash = "0.1.0"
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#![cfg(test)]
|
#![cfg(test)]
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate assert_matches;
|
||||||
|
|
||||||
use beacon_chain::{BeaconChain, BeaconChainTypes, StateSkipConfig};
|
use beacon_chain::{BeaconChain, BeaconChainTypes, StateSkipConfig};
|
||||||
use node_test_rig::{
|
use node_test_rig::{
|
||||||
environment::{Environment, EnvironmentBuilder},
|
environment::{Environment, EnvironmentBuilder},
|
||||||
@ -1135,3 +1138,117 @@ fn attester_slashing() {
|
|||||||
assert_eq!(attester_slashings.len(), 1);
|
assert_eq!(attester_slashings.len(), 1);
|
||||||
assert_eq!(attester_slashing, attester_slashings[0]);
|
assert_eq!(attester_slashing, attester_slashings[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod validator_attestation {
|
||||||
|
use super::*;
|
||||||
|
use http::StatusCode;
|
||||||
|
use node_test_rig::environment::Environment;
|
||||||
|
use remote_beacon_node::{Error::DidNotSucceed, HttpClient};
|
||||||
|
use types::{Attestation, AttestationDuty, MinimalEthSpec};
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
fn setup() -> (
|
||||||
|
Environment<MinimalEthSpec>,
|
||||||
|
LocalBeaconNode<MinimalEthSpec>,
|
||||||
|
HttpClient<MinimalEthSpec>,
|
||||||
|
Url,
|
||||||
|
AttestationDuty,
|
||||||
|
) {
|
||||||
|
let mut env = build_env();
|
||||||
|
let node = build_node(&mut env, testing_client_config());
|
||||||
|
let remote_node = node.remote_node().expect("should produce remote node");
|
||||||
|
let client = remote_node.http.clone();
|
||||||
|
let socket_addr = node
|
||||||
|
.client
|
||||||
|
.http_listen_addr()
|
||||||
|
.expect("A remote beacon node must have a http server");
|
||||||
|
let url = Url::parse(&format!(
|
||||||
|
"http://{}:{}/validator/attestation",
|
||||||
|
socket_addr.ip(),
|
||||||
|
socket_addr.port()
|
||||||
|
))
|
||||||
|
.expect("should be valid endpoint");
|
||||||
|
|
||||||
|
// Find a validator that has duties in the current slot of the chain.
|
||||||
|
let mut validator_index = 0;
|
||||||
|
let beacon_chain = node
|
||||||
|
.client
|
||||||
|
.beacon_chain()
|
||||||
|
.expect("client should have beacon chain");
|
||||||
|
let state = beacon_chain.head().expect("should get head").beacon_state;
|
||||||
|
let duties = loop {
|
||||||
|
let duties = state
|
||||||
|
.get_attestation_duties(validator_index, RelativeEpoch::Current)
|
||||||
|
.expect("should have attestation duties cache")
|
||||||
|
.expect("should have attestation duties");
|
||||||
|
|
||||||
|
if duties.slot == node.client.beacon_chain().unwrap().slot().unwrap() {
|
||||||
|
break duties;
|
||||||
|
} else {
|
||||||
|
validator_index += 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
(env, node, client, url, duties)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn requires_query_parameters() {
|
||||||
|
let (mut env, _node, client, url, _duties) = setup();
|
||||||
|
|
||||||
|
let attestation = env.runtime().block_on(
|
||||||
|
// query parameters are missing
|
||||||
|
client.json_get::<Attestation<MinimalEthSpec>>(url.clone(), vec![]),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
attestation.expect_err("should not succeed"),
|
||||||
|
DidNotSucceed { status, body } => {
|
||||||
|
assert_eq!(status, StatusCode::BAD_REQUEST);
|
||||||
|
assert_eq!(body, "URL query must be valid and contain at least one of the following keys: [\"slot\"]".to_owned());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn requires_slot() {
|
||||||
|
let (mut env, _node, client, url, duties) = setup();
|
||||||
|
|
||||||
|
let attestation = env.runtime().block_on(
|
||||||
|
// `slot` is missing
|
||||||
|
client.json_get::<Attestation<MinimalEthSpec>>(
|
||||||
|
url.clone(),
|
||||||
|
vec![("committee_index".into(), format!("{}", duties.index))],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
attestation.expect_err("should not succeed"),
|
||||||
|
DidNotSucceed { status, body } => {
|
||||||
|
assert_eq!(status, StatusCode::BAD_REQUEST);
|
||||||
|
assert_eq!(body, "URL query must be valid and contain at least one of the following keys: [\"slot\"]".to_owned());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn requires_committee_index() {
|
||||||
|
let (mut env, _node, client, url, duties) = setup();
|
||||||
|
|
||||||
|
let attestation = env.runtime().block_on(
|
||||||
|
// `committee_index` is missing.
|
||||||
|
client.json_get::<Attestation<MinimalEthSpec>>(
|
||||||
|
url.clone(),
|
||||||
|
vec![("slot".into(), format!("{}", duties.slot))],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
attestation.expect_err("should not succeed"),
|
||||||
|
DidNotSucceed { status, body } => {
|
||||||
|
assert_eq!(status, StatusCode::BAD_REQUEST);
|
||||||
|
assert_eq!(body, "URL query must be valid and contain at least one of the following keys: [\"committee_index\"]".to_owned());
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user