aboutsummaryrefslogtreecommitdiff
path: root/planetwars-server/tests/integration.rs
diff options
context:
space:
mode:
Diffstat (limited to 'planetwars-server/tests/integration.rs')
-rw-r--r--planetwars-server/tests/integration.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/planetwars-server/tests/integration.rs b/planetwars-server/tests/integration.rs
new file mode 100644
index 0000000..29589ad
--- /dev/null
+++ b/planetwars-server/tests/integration.rs
@@ -0,0 +1,57 @@
+use axum::{
+ body::Body,
+ http::{self, Request, StatusCode},
+};
+use planetwars_server::{create_db_pool, create_pw_api, GlobalConfig};
+use serde_json::{self, json, Value as JsonValue};
+use std::{io, path::Path, sync::Arc};
+use tempfile::TempDir;
+use tower::ServiceExt;
+
+// Used to serialize tests that access the database.
+// TODO: see to what degree we could support transactional testing.
+static DB_LOCK: parking_lot::Mutex<()> = parking_lot::Mutex::new(());
+
+fn create_subdir<P: AsRef<Path>>(base_path: &Path, p: P) -> io::Result<String> {
+ let dir_path = base_path.join(p);
+ std::fs::create_dir(&dir_path)?;
+ let dir_path_string = dir_path.into_os_string().into_string().unwrap();
+ Ok(dir_path_string)
+}
+
+#[tokio::test]
+async fn test_application() -> io::Result<()> {
+ let _db_guard = DB_LOCK.lock();
+ let data_dir = TempDir::new().expect("failed to create temp dir");
+ let config = Arc::new(GlobalConfig {
+ database_url: "postgresql://planetwars:planetwars@localhost/planetwars-test".to_string(),
+ python_runner_image: "python:3.10-slim-buster".to_string(),
+ container_registry_url: "localhost:9001".to_string(),
+ root_url: "localhost:3000".to_string(),
+ bots_directory: create_subdir(data_dir.path(), "bots")?,
+ match_logs_directory: create_subdir(data_dir.path(), "matches")?,
+ maps_directory: create_subdir(data_dir.path(), "maps")?,
+ registry_directory: create_subdir(data_dir.path(), "registry")?,
+ registry_admin_password: "secret_admin_password".to_string(),
+ ranker_enabled: false,
+ });
+ let db_pool = create_db_pool(&config).await;
+ let app = create_pw_api(config, db_pool);
+
+ let response = app
+ .oneshot(
+ Request::builder()
+ .method(http::Method::GET)
+ .uri("/api/bots")
+ .body(Body::empty())
+ .unwrap(),
+ )
+ .await
+ .unwrap();
+
+ assert_eq!(response.status(), StatusCode::OK);
+ let body = hyper::body::to_bytes(response.into_body()).await.unwrap();
+ let resp: JsonValue = serde_json::from_slice(&body).unwrap();
+ assert_eq!(resp, json!([]));
+ Ok(())
+}