use aok::Result;
use axum::{Router, body::Body, routing::get};
use cookie_b::BrowserIdLayer;
use http::{Request, header};
use tower::ServiceExt;
#[static_init::constructor(0)]
extern "C" fn init() {
loginit::init()
}
async fn handler() -> &'static str {
"Hello, World!"
}
#[tokio::test]
async fn test_browser_id_middleware() -> Result<()> {
let app = Router::new().route("/", get(handler)).layer(BrowserIdLayer);
let req = Request::builder()
.uri("/")
.header("host", "127.0.0.1")
.body(Body::empty())?;
let res = app.clone().oneshot(req).await?;
let cookies: Vec<_> = res
.headers()
.get_all(header::SET_COOKIE)
.iter()
.filter_map(|v| v.to_str().ok())
.collect();
assert!(!cookies.is_empty(), "应该设置至少一个 cookie");
let browser_id = cookies[0]
.split(';')
.next()
.unwrap()
.trim_start_matches("b=");
assert!(!browser_id.is_empty(), "browser_id 不能为空");
let req = Request::builder()
.uri("/")
.header("host", "127.0.0.1") .header(header::COOKIE, format!("b={};r=", browser_id))
.body(Body::empty())?;
let res = app.oneshot(req).await?;
assert!(res.headers().get(header::SET_COOKIE).is_none());
Ok(())
}