spacegate-plugin 0.2.0-alpha.4

A library-first, lightweight, high-performance, cloud-native supported API gateway
Documentation
use std::net::SocketAddr;

use hyper::{service::HttpService, Request};
use serde_json::json;
use spacegate_kernel::{extension::PeerAddr, service::http_route::HttpBackend, BoxError, SgBody};
use spacegate_model::{PluginConfig, PluginInstanceId, PluginInstanceName};
use spacegate_plugin::{mount::MountPointIndex, PluginRepository};

#[tokio::test]
async fn test_hot_update() -> Result<(), BoxError> {
    let mock_addr = SocketAddr::from(([127, 0, 0, 1], 0));
    let repo = PluginRepository::global();
    let id = PluginInstanceId::new("maintenance", PluginInstanceName::named("name"));
    repo.create_or_update_instance(PluginConfig {
        id: id.clone(),
        spec: json!(
            {
                "code": "maintenance",
                "msg": "hello world",
                "body": {
                    "kind": "Json",
                    "value": {"message": "hello world"}
                }
            }
        ),
    })?;
    let mut backend = HttpBackend::builder().build();
    repo.mount(
        &mut backend,
        MountPointIndex::HttpBackend {
            gateway: "".into(),
            route: "".into(),
            rule: 0,
            backend: 0,
        },
        id.clone(),
    )
    .expect("success to mount plugin");
    let mut svc = backend.as_service();
    let req = Request::get("/").extension(PeerAddr(mock_addr)).body(SgBody::empty()).unwrap();
    let resp = svc.call(req).await?;
    assert_eq!(resp.status(), 503);
    let dumped = resp.into_body().dump().await?;
    let body = dumped.get_dumped().expect("body dumped");
    dbg!(body);
    repo.create_or_update_instance(PluginConfig {
        id: id.clone(),
        spec: json!(
            {
                "code": "maintenance",
                "msg": "hello world",
                "body": {
                    "kind": "Json",
                    "value": {"message": "hello world"}
                },
                "redirect": "/redirect",
            }
        ),
    })?;
    let req = Request::get("/").extension(PeerAddr(mock_addr)).body(SgBody::empty()).unwrap();
    let resp = svc.call(req).await?;

    assert_eq!(resp.status(), 307);
    let dumped = resp.into_body().dump().await?;
    let body = dumped.get_dumped().expect("body dumped");
    dbg!(body);
    Ok(())
}