use crate::common::TestServer; use serde_json::json; #[tokio::test] async fn add_and_list_repository() { let server = TestServer::start().await; // Initially empty let resp = server.get("/api/v1/repositories").await; assert_eq!(resp.status(), 200); let body: serde_json::Value = resp.json().await.unwrap(); assert_eq!(body["data"].as_array().unwrap().len(), 0); // Add a repository let resp = server .post( "/api/v1/repositories", &json!({ "name": "test-repo", "git_url": "https://github.com/example/test-repo.git", }), ) .await; assert_eq!(resp.status(), 200); let body: serde_json::Value = resp.json().await.unwrap(); let repo_id = body["data"]["id"].as_str().unwrap().to_string(); assert!(!repo_id.is_empty()); // List should now return 1 let resp = server.get("/api/v1/repositories").await; let body: serde_json::Value = resp.json().await.unwrap(); let repos = body["data"].as_array().unwrap(); assert_eq!(repos.len(), 1); assert_eq!(repos[0]["name"], "test-repo"); server.cleanup().await; } #[tokio::test] async fn add_duplicate_repository_fails() { let server = TestServer::start().await; let payload = json!({ "name": "dup-repo", "git_url": "https://github.com/example/dup-repo.git", }); // First add succeeds let resp = server.post("/api/v1/repositories", &payload).await; assert_eq!(resp.status(), 200); // Second add with same git_url should fail (unique index) let resp = server.post("/api/v1/repositories", &payload).await; assert_ne!(resp.status(), 200); server.cleanup().await; } #[tokio::test] async fn delete_repository() { let server = TestServer::start().await; // Add a repo let resp = server .post( "/api/v1/repositories", &json!({ "name": "to-delete", "git_url": "https://github.com/example/to-delete.git", }), ) .await; let body: serde_json::Value = resp.json().await.unwrap(); let repo_id = body["data"]["id"].as_str().unwrap(); // Delete it let resp = server .delete(&format!("/api/v1/repositories/{repo_id}")) .await; assert_eq!(resp.status(), 200); // List should be empty again let resp = server.get("/api/v1/repositories").await; let body: serde_json::Value = resp.json().await.unwrap(); assert_eq!(body["data"].as_array().unwrap().len(), 0); server.cleanup().await; } #[tokio::test] async fn delete_nonexistent_repository_returns_404() { let server = TestServer::start().await; let resp = server .delete("/api/v1/repositories/000000000000000000000000") .await; assert_eq!(resp.status(), 404); server.cleanup().await; } #[tokio::test] async fn delete_invalid_id_returns_400() { let server = TestServer::start().await; let resp = server.delete("/api/v1/repositories/not-a-valid-id").await; assert_eq!(resp.status(), 400); server.cleanup().await; }