francoisgib_webserver 1.0.3

HTTP Webserver
Documentation
#[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(())
    }
}