[−][src]Crate http_test_server
HTTP Test Server
Programatically create end-points that listen for connections and return pre-defined responses.
- Allows multiple endpoints and simultaneous client connections
- Streaming support
- Helper functions to retrieve data such as request count, number of connected clients and requests metadata
- Automatically allocates free port and close server after use
Examples:
Accept POST requests:
extern crate http_test_server; use http_test_server::{TestServer, Resource}; use http_test_server::http::{Status, Method}; let server = TestServer::new().unwrap(); let resource = server.create_resource("/some-endpoint/new"); resource .status(Status::Created) .method(Method::POST) .header("Content-Type", "application/json") .header("Cache-Control", "no-cache") .body("{ \"message\": \"this is a message\" }"); // request: POST /some-endpoint/new // HTTP/1.1 201 Created\r\n // Content-Type: application/json\r\n // Cache-Control: no-cache\r\n // \r\n // { "message": "this is a message" }
Use path and query parameters:
extern crate http_test_server; use http_test_server::{TestServer, Resource}; use http_test_server::http::{Status, Method}; let server = TestServer::new().unwrap(); let resource = server.create_resource("/user/{userId}?filter=*"); resource .status(Status::OK) .header("Content-Type", "application/json") .header("Cache-Control", "no-cache") .body(r#"{ "id": "{path.userId}", "filter": "{query.filter}" }"#); // request: GET /user/abc123?filter=all // HTTP/1.1 200 Ok\r\n // Content-Type: application/json\r\n // Cache-Control: no-cache\r\n // \r\n // { "id": "abc123", "filter": "all" }
Expose a persistent stream:
let server = TestServer::new().unwrap(); let resource = server.create_resource("/sub"); resource .header("Content-Type", "text/event-stream") .header("Cache-Control", "no-cache") .stream() .body(": initial data"); // ... resource .send("some data") .send(" some extra data\n") .send_line("some extra data with line break") .close_open_connections(); // request: GET /sub // HTTP/1.1 200 Ok\r\n // Content-Type: text/event-stream\r\n // Cache-Control: no-cache\r\n // \r\n // : initial data // some data some extra data\n // some extra data with line break\n
Redirects:
let server = TestServer::new().unwrap(); let resource_redirect = server.create_resource("/original"); let resource_target = server.create_resource("/new"); resource_redirect .status(Status::SeeOther) .header("Location", "/new" ); resource_target.body("Hi!"); // request: GET /original // HTTP/1.1 303 See Other\r\n // Location: /new\r\n // \r\n
Regex URI:
let server = TestServer::new().unwrap(); let resource = server.create_resource("/hello/[0-9]/[A-z]/.*"); // request: GET /hello/8/b/doesntmatter-hehe // HTTP/1.1 200 Ok\r\n // \r\n
NOTE: This is not intended to work as a full featured server. For this reason, many validations
and behaviours are not implemented. e.g: A request with Accept
header with not supported
Content-Type
won't trigger a 406 Not Acceptable
.
As this crate was devised to be used in tests, smart behaviours could be confusing and misleading. Having said that, for the sake of convenience, some default behaviours were implemented:
- Server returns
404 Not Found
when requested resource was not configured. - Server returns
405 Method Not Allowed
when trying to reach resource with different method from those configured. - When a resource is created it responds to
GET
with200 Ok
by default.
Re-exports
pub use resource::Resource; |
Modules
http | HTTP constants |
resource | Server resource builders |
Structs
Request | Request information |
TestServer | Controls the listener life cycle and creates new resources |