feat: implement full-stack TaskPilot scheduler
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
use axum::{
|
||||
body::Body,
|
||||
http::{Request, StatusCode, header},
|
||||
};
|
||||
use http_body_util::BodyExt;
|
||||
use task_pilot_backend::state::AppState;
|
||||
use tempfile::TempDir;
|
||||
use tower::ServiceExt;
|
||||
|
||||
#[tokio::test]
|
||||
async fn serves_spa_and_keeps_api_404_as_json() {
|
||||
let temp = TempDir::new().unwrap();
|
||||
let static_dir = temp.path().join("web");
|
||||
std::fs::create_dir_all(&static_dir).unwrap();
|
||||
std::fs::write(
|
||||
static_dir.join("index.html"),
|
||||
"<!doctype html><title>TaskPilot SPA</title>",
|
||||
)
|
||||
.unwrap();
|
||||
let pool = task_pilot_backend::database::connect("sqlite::memory:")
|
||||
.await
|
||||
.unwrap();
|
||||
let state = AppState::start(pool, temp.path().join("logs"))
|
||||
.await
|
||||
.unwrap();
|
||||
let app = task_pilot_backend::router_with_static(state.clone(), static_dir);
|
||||
|
||||
let page = app
|
||||
.clone()
|
||||
.oneshot(
|
||||
Request::builder()
|
||||
.uri("/tasks/example")
|
||||
.body(Body::empty())
|
||||
.unwrap(),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(page.status(), StatusCode::OK);
|
||||
let page_body = page.into_body().collect().await.unwrap().to_bytes();
|
||||
assert!(String::from_utf8_lossy(&page_body).contains("TaskPilot SPA"));
|
||||
|
||||
let api_not_found = app
|
||||
.oneshot(
|
||||
Request::builder()
|
||||
.uri("/api/v1/does-not-exist")
|
||||
.body(Body::empty())
|
||||
.unwrap(),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(api_not_found.status(), StatusCode::NOT_FOUND);
|
||||
assert_eq!(
|
||||
api_not_found.headers().get(header::CONTENT_TYPE),
|
||||
Some(&header::HeaderValue::from_static("application/json"))
|
||||
);
|
||||
state.shutdown();
|
||||
}
|
||||
Reference in New Issue
Block a user