Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ mocktail is a **minimal** crate for mocking HTTP and gRPC servers in Rust, with
1. Add `mocktail` to `Cargo.toml` as a development dependency:
```toml
[dev-dependencies]
mocktail = "0.2.5-alpha"
mocktail = "0.3.0"
```

2. Basic usage example:
Expand All @@ -46,7 +46,7 @@ mocktail is a **minimal** crate for mocking HTTP and gRPC servers in Rust, with
});

// Create and start a mock server
let mut server = MockServer::new("example").with_mocks(mocks);
let mut server = MockServer::new_http("example").with_mocks(mocks);
server.start().await?;

// Create a client
Expand Down
7 changes: 5 additions & 2 deletions book/src/concepts/mock-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

The mock server is a simple, lightweight HTTP server designed for serving mocks. It has 2 service implementations: `HttpMockService` and `GrpcMockService`. The server supports HTTP/1 and HTTP/2.

## HTTP
Use `MockServer::new_http()` to create a HTTP mock server.

## gRPC
By default, the `HttpMockService` is used for serving regular HTTP mocks. For gRPC, set the `grpc()` option on the server to enable the `GrpcMockService`. You can use tonic to connect to the gRPC service.
Use `MockServer::new_grpc()` to create a gRPC mock server. You can use tonic to connect to the gRPC service, e.g.

```rust
let server = MockServer::new().grpc();
let server = MockServer::new_grpc("name");
let url = format!("http://0.0.0.0:{}", server.port().unwrap());
let channel = tonic::Channel::from_shared(url)?
.connect()
Expand Down
4 changes: 2 additions & 2 deletions book/src/defining-mocks.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ You can define your mocks first, then create a mock server with your mock set:
// Alternatively, Mock::new() and mocks.insert(mock)

// Create mock server with the mock set
let mut server = MockServer::new("example").with_mocks(mocks);
let mut server = MockServer::new_http("example").with_mocks(mocks);
server.run().await?;
```

Or, you can create a mock server with a default empty mock set and register mocks directly to the server:
```rust
// Create mock server
let mut server = MockServer::new("example");
let mut server = MockServer::new_http("example");
server.run().await?;

// Build and insert a mock to the server's mock set
Expand Down
4 changes: 2 additions & 2 deletions book/src/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
1. Add `mocktail` to `Cargo.toml` as a development dependency:
```toml
[dev-dependencies]
mocktail = "0.2.5-alpha"
mocktail = "0.3.0"
```

2. Basic usage example:
Expand All @@ -24,7 +24,7 @@
});

// Create and start a mock server
let mut server = MockServer::new("example").with_mocks(mocks);
let mut server = MockServer::new_http("example").with_mocks(mocks);
server.start().await?;

// Create a client
Expand Down
4 changes: 2 additions & 2 deletions mocktail-tests/tests/examples/grpc_streaming.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async fn test_client_streaming() -> Result<(), Error> {
});
});

let server = MockServer::new("example.Hello").grpc().with_mocks(mocks);
let server = MockServer::new_grpc("example.Hello").with_mocks(mocks);
server.start().await?;

let channel = Channel::from_shared(format!("http://0.0.0.0:{}", server.port().unwrap()))?
Expand Down Expand Up @@ -68,7 +68,7 @@ async fn test_server_streaming() -> Result<(), Error> {
]);
});

let server = MockServer::new("example.Hello").grpc().with_mocks(mocks);
let server = MockServer::new_grpc("example.Hello").with_mocks(mocks);
server.start().await?;

let channel = Channel::from_shared(format!("http://0.0.0.0:{}", server.port().unwrap()))?
Expand Down
4 changes: 2 additions & 2 deletions mocktail-tests/tests/examples/grpc_unary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ async fn test_unary() -> Result<(), Error> {
});
});

let server = MockServer::new("example.Hello").grpc().with_mocks(mocks);
let server = MockServer::new_grpc("example.Hello").with_mocks(mocks);
server.start().await?;

let channel = Channel::from_shared(format!("http://0.0.0.0:{}", server.port().unwrap()))?
Expand Down Expand Up @@ -48,7 +48,7 @@ async fn test_unary_errors() -> Result<(), anyhow::Error> {
then.internal_server_error().message("unexpected error");
});

let server = MockServer::new("example.Hello").grpc().with_mocks(mocks);
let server = MockServer::new_grpc("example.Hello").with_mocks(mocks);
server.start().await?;

let channel = Channel::from_shared(format!("http://0.0.0.0:{}", server.port().unwrap()))?
Expand Down
2 changes: 1 addition & 1 deletion mocktail-tests/tests/examples/headers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async fn test_headers() -> Result<(), Error> {
then.text("you had the header!");
});

let server = MockServer::new("hello").with_mocks(mocks);
let server = MockServer::new_http("hello").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down
6 changes: 3 additions & 3 deletions mocktail-tests/tests/examples/http_streaming.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ async fn test_json_lines_stream() -> Result<(), Error> {
]);
});

let server = MockServer::new("hello").with_mocks(mocks);
let server = MockServer::new_http("hello").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down Expand Up @@ -76,7 +76,7 @@ async fn test_bytes_stream() -> Result<(), Error> {
then.bytes_stream(["hello dan!", "hello mateus!"]);
});

let server = MockServer::new("hello").with_mocks(mocks);
let server = MockServer::new_http("hello").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down Expand Up @@ -120,7 +120,7 @@ async fn test_sse_stream() -> Result<(), Error> {
]);
});

let server = MockServer::new("sse").with_mocks(mocks);
let server = MockServer::new_http("sse").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down
8 changes: 4 additions & 4 deletions mocktail-tests/tests/examples/http_unary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ async fn test_unary() -> Result<(), Error> {
then.text("hello!");
});

let server = MockServer::new("hello").with_mocks(mocks);
let server = MockServer::new_http("hello").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down Expand Up @@ -71,7 +71,7 @@ async fn test_unary_errors() -> Result<(), Error> {
then.bad_request();
});

let server = MockServer::new("hello").with_mocks(mocks);
let server = MockServer::new_http("hello").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down Expand Up @@ -129,7 +129,7 @@ async fn test_any() -> Result<(), Error> {
then.text("yo!");
});

let server = MockServer::new("any").with_mocks(mocks);
let server = MockServer::new_http("any").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down Expand Up @@ -158,7 +158,7 @@ async fn test_unary_headers() -> Result<(), Error> {
then.text("yo!");
});

let server = MockServer::new("any").with_mocks(mocks);
let server = MockServer::new_http("any").with_mocks(mocks);
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down
4 changes: 2 additions & 2 deletions mocktail-tests/tests/misc/validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use test_log::test;

#[test(tokio::test)]
async fn test_grpc_service() -> Result<(), Error> {
let server = MockServer::new("test").grpc();
let server = MockServer::new_grpc("test");
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand All @@ -30,7 +30,7 @@ async fn test_grpc_service() -> Result<(), Error> {

#[test(tokio::test)]
async fn test_http_service() -> Result<(), Error> {
let server = MockServer::new("test");
let server = MockServer::new_http("test");
server.start().await?;

let client = reqwest::Client::builder().http2_prior_knowledge().build()?;
Expand Down
2 changes: 1 addition & 1 deletion mocktail/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "mocktail"
version = "0.2.5-alpha"
version = "0.3.0"
edition = "2021"
authors = ["Dan Clark"]
description = "HTTP & gRPC server mocking for Rust"
Expand Down
4 changes: 2 additions & 2 deletions mocktail/src/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ impl std::str::FromStr for Method {
"OPTIONS" => Ok(Method::OPTIONS),
"TRACE" => Ok(Method::TRACE),
"PATCH" => Ok(Method::PATCH),
_ => Err(format!("Invalid HTTP method {}", value)),
_ => Err(format!("Invalid HTTP method {value}")),
}
}
}
Expand All @@ -132,7 +132,7 @@ impl TryFrom<&str> for Method {
"OPTIONS" => Ok(Self::OPTIONS),
"TRACE" => Ok(Self::TRACE),
"PATCH" => Ok(Self::PATCH),
_ => Err(format!("Invalid HTTP method {}", value)),
_ => Err(format!("Invalid HTTP method {value}")),
}
}
}
Expand Down
27 changes: 26 additions & 1 deletion mocktail/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ pub struct MockServer {
}

impl MockServer {
/// Creates a new [`MockServer`].
/// Creates a new HTTP [`MockServer`].
pub fn new(name: &'static str) -> Self {
Self {
name,
Expand All @@ -48,7 +48,32 @@ impl MockServer {
}
}

/// Creates a new HTTP [`MockServer`].
pub fn new_http(name: &'static str) -> Self {
Self {
name,
kind: ServerKind::Http,
addr: OnceLock::new(),
base_url: OnceLock::new(),
state: Arc::new(MockServerState::default()),
config: MockServerConfig::default(),
}
}

/// Creates a new gRPC [`MockServer`].
pub fn new_grpc(name: &'static str) -> Self {
Self {
name,
kind: ServerKind::Grpc,
addr: OnceLock::new(),
base_url: OnceLock::new(),
state: Arc::new(MockServerState::default()),
config: MockServerConfig::default(),
}
}

/// Sets the server type to gRPC.
#[deprecated(since = "0.3.0", note = "please use `new_grpc` instead")]
pub fn grpc(mut self) -> Self {
self.kind = ServerKind::Grpc;
self
Expand Down