Node icon indicating copy to clipboard operation
Node copied to clipboard

Validate Requests for a Response in MockBlockchainClientServer

Open utkarshg6 opened this issue 1 year ago • 1 comments

At first, we need to modify the below function inside MBCSBuilder:

pub fn response<R>(self, result: R) -> Self
where
    R: Serialize,
{
    let result = serde_json::to_string(&result).unwrap();
    let body = format!(
        r#"{{"jsonrpc": "2.0", "result": {}, "id": null}}"#,
        result
    );
    self.store_response_string(body)
}

This function accepts the response as the first argument.

The second argument is only useful in the websocket connections. Since we are not using any and probably won't be using them for a very long period of time, it's advisable to get rid of it.

Now, once you do that, make sure you introduce another argument, expected_request, which should accept a type of web3 call. For example, "eth_getLogs". (Refer to the Quicknode documentation) This argument could be a string as well as an Enum. It's better to create an enum because it'll make it easier to use, as the developer won't need to provide the accurate string everywhere, and adding a new call to the enum will be quick too.

This request should be stored the same way responses are stored and should be validated before sending a response. This validation should exist inside the function thread_guts() of MockBlockchainClientServer.

utkarshg6 avatar Oct 22 '24 07:10 utkarshg6

Here are some examples of legacy code that I'm sharing for historical reference:

  • For the test blockchain_interface_web3_retrieves_transactions

    let requests = test_server.requests_so_far();
    let bodies: Vec<String> = requests
        .into_iter()
        .map(|request| serde_json::from_slice(&request.body()).unwrap())
        .map(|b: Value| serde_json::to_string(&b).unwrap())
        .collect();
    let expected_body_prefix = r#"[{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]},{"id":1,"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":"0x384dec25e03f94931767ce4c3556168468ba24c3","fromBlock":"0x2a","toBlock":"0x400","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",null,"0x000000000000000000000000"#;
    let expected_body_suffix = r#""]}]}]"#;
    let expected_body = format!(
        "{}{}{}",
        expected_body_prefix,
        &to[2..],
        expected_body_suffix
    );
    assert_eq!(bodies, vec!(expected_body));
    
  • For the test blockchain_interface_web3_handles_no_retrieved_transactions

    let requests = test_server.requests_so_far();
    let bodies: Vec<String> = requests
        .into_iter()
        .map(|request| serde_json::from_slice(&request.body()).unwrap())
        .map(|b: Value| serde_json::to_string(&b).unwrap())
        .collect();
    let expected_body_prefix = r#"[{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]},{"id":1,"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":"0x384dec25e03f94931767ce4c3556168468ba24c3","fromBlock":"0x2a","toBlock":"0x400","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",null,"0x000000000000000000000000"#;
    let expected_body_suffix = r#""]}]}]"#;
    let expected_body = format!(
        "{}{}{}",
        expected_body_prefix,
        &to[2..],
        expected_body_suffix
    );
    assert_eq!(bodies, vec!(expected_body));
    

utkarshg6 avatar Jan 06 '25 08:01 utkarshg6