Example
Generate Server Code
For each gRPC server you need to generate codes using the [generate!] macro.
mod wiremock_gen {
wiremock_grpc::generate!("hello.Greeter", MyMockServer);
}
use wiremock_gen::*; use wiremock_grpc::*;
Use it
#[tokio::test]
async fn default() {
let mut server = MyMockServer::start_default().await;
let request1 = server.setup(
MockBuilder::when()
.path("/hello.Greeter/SayHello")
.then()
.return_status(Code::Ok)
.return_body(|| HelloReply {
message: "Hello Mustakim".into(),
}),
);
let channel =
tonic::transport::Channel::from_shared(format!("http://[::1]:{}", server.address().port()))
.unwrap()
.connect()
.await
.unwrap();
let mut client = GreeterClient::new(channel);
let response = client
.say_hello(HelloRequest {
name: "Mustakim".into(),
})
.await
.unwrap();
assert_eq!("Hello Mustakim", response.into_inner().message);
let requests = server.find(&request1);
assert!(requests.is_some(), "Request must be logged");
assert_eq!(1, requests.unwrap().len(), "Only 1 request must be logged");
let request = server.find_one(&request1);
assert_eq!(
format!(
"http://[::1]:{}/hello.Greeter/SayHello",
server.address().port()
),
request.uri
);
}
Notes
- It panics when dropped if there are rules set but no requesta are received.
- Request to route without any rules set will return
Unimplemented gRPC status.
Limitations
- You have to pass the service prefix (eg.
hello.Greeter) or RPC path (eg. /hello.Greeter/SayHello) as string. These paths are written as string literal in the generated code using tonic_build. I have to figure out how access these string literals from a given type or function of the generated code.
- You are unable to spy the request body send to the mock server or set a mock based on a specific request body. I'm yet to get a solid grip on 🦀 to be able to do this.