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", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "assert_matches" | ||||
| version = "1.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "async-tls" | ||||
| version = "0.7.0" | ||||
| @ -3689,6 +3695,7 @@ dependencies = [ | ||||
| name = "rest_api" | ||||
| version = "0.1.2" | ||||
| dependencies = [ | ||||
|  "assert_matches", | ||||
|  "beacon_chain", | ||||
|  "bls", | ||||
|  "eth2-libp2p", | ||||
|  | ||||
| @ -38,6 +38,7 @@ operation_pool = { path = "../operation_pool" } | ||||
| rayon = "1.3.0" | ||||
| 
 | ||||
| [dev-dependencies] | ||||
| assert_matches = "1.3.0" | ||||
| remote_beacon_node = { path = "../../common/remote_beacon_node" } | ||||
| node_test_rig = { path = "../../testing/node_test_rig" } | ||||
| tree_hash = "0.1.0" | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| #![cfg(test)] | ||||
| 
 | ||||
| #[macro_use] | ||||
| extern crate assert_matches; | ||||
| 
 | ||||
| use beacon_chain::{BeaconChain, BeaconChainTypes, StateSkipConfig}; | ||||
| use node_test_rig::{ | ||||
|     environment::{Environment, EnvironmentBuilder}, | ||||
| @ -1135,3 +1138,117 @@ fn attester_slashing() { | ||||
|     assert_eq!(attester_slashings.len(), 1); | ||||
|     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