#[cfg(test)]
mod tests {
use std::str::FromStr;
use smallvec::smallvec;
use crate::{
http::{
errors::HttpError, methods::HttpMethod, requests::HttpRequest, responses::HttpResponse,
status::HttpStatus,
},
tree::{EndpointType, HttpTree},
utils::buffer::Buffer,
};
#[test]
fn test_add_and_get_endpoint() {
let mut tree = HttpTree::new();
tree.add_endpoint(
"/api/data",
HttpMethod::GET,
EndpointType::Handler(|_, _| Ok(())),
);
let result = tree.get_endpoint_from_path("/api/data", HttpMethod::GET);
assert!(result.is_ok());
let (endpoint, remaining_path) = result.unwrap();
assert_eq!(remaining_path, "");
assert!(matches!(endpoint.endpoint_type, EndpointType::Handler(_)));
}
#[test]
fn test_get_endpoint_not_found() {
let tree = HttpTree::new();
let result = tree.get_endpoint_from_path("/nonexistent", HttpMethod::GET);
assert!(matches!(result, Err(HttpError::NotFound)));
}
#[test]
fn test_get_endpoint_method_not_allowed() {
let mut tree = HttpTree::new();
tree.add_endpoint(
"/api/data",
HttpMethod::POST,
EndpointType::Handler(|_, _| Ok(())),
);
let result = tree.get_endpoint_from_path("/api/data", HttpMethod::GET);
assert!(matches!(result, Err(HttpError::MethodNotAllowed)));
}
#[test]
fn test_apply_range() {
let mut tree = HttpTree::new();
tree.add_endpoint(
"/handler",
HttpMethod::GET,
EndpointType::Handler(mock_handler),
);
let mut request = mock_request();
request.body = None;
request.uri = "/handler".to_owned();
request.range = Some((0, 4));
let mut response = mock_response();
let (endpoint, remaining_path) = tree
.get_endpoint_from_path("/handler", HttpMethod::GET)
.unwrap();
assert!(
endpoint
.handle(&request, &mut response, remaining_path)
.is_ok()
);
assert_eq!(response.status, HttpStatus::PartialContent);
assert_eq!(response.body.unwrap().to_string(), "Hello");
}
fn mock_request() -> HttpRequest {
HttpRequest::new(HttpMethod::GET, "/".to_owned(), (1, 1), smallvec![], None)
}
fn mock_response() -> HttpResponse {
HttpResponse::new((1, 1), HttpStatus::Ok, smallvec![], None, None)
}
pub fn mock_handler(request: &HttpRequest, response: &mut HttpResponse) -> Result<(), String> {
response.status = HttpStatus::Ok;
response.version = (1, 1);
response.range = request.range;
response.body = Buffer::from_str("Hello world!").ok();
Ok(())
}
}