1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// Integration tests temporarily disabled due to complex mocking requirements
// TODO: Implement proper test infrastructure with mock Docker and database
/*
use minifly_api::*;
use minifly_core::models::*;
use reqwest::StatusCode;
use serde_json::json;
mod common;
use common::*;
#[tokio::test]
async fn test_health_check() {
let (url, _handle) = start_test_server().await;
let client = test_client();
let response = client
.get(&format!("{}/v1/health", url))
.header("fly-region", "local")
.send()
.await
.expect("Failed to send request");
assert_status!(response, StatusCode::OK);
let health: serde_json::Value = response.json().await.expect("Failed to parse response");
assert_eq!(health["status"], "healthy");
assert_eq!(health["service"], "minifly-api");
}
#[tokio::test]
async fn test_comprehensive_health() {
let (url, _handle) = start_test_server().await;
let client = test_client();
let response = client
.get(&format!("{}/v1/health/comprehensive", url))
.header("fly-region", "local")
.send()
.await
.expect("Failed to send request");
assert_status!(response, StatusCode::OK);
let health: serde_json::Value = response.json().await.expect("Failed to parse response");
assert_eq!(health["status"], "healthy");
assert_eq!(health["service"], "minifly-api");
assert!(health["uptime_seconds"].is_number());
assert!(health["memory_usage"].is_object());
assert!(health["checks"].is_object());
}
#[tokio::test]
async fn test_liveness_check() {
let (url, _handle) = start_test_server().await;
let client = test_client();
let response = client
.get(&format!("{}/v1/health/live", url))
.header("fly-region", "local")
.send()
.await
.expect("Failed to send request");
assert_status!(response, StatusCode::OK);
let health: serde_json::Value = response.json().await.expect("Failed to parse response");
assert_eq!(health["status"], "healthy");
assert!(health["timestamp"].is_string());
}
#[tokio::test]
async fn test_readiness_check() {
let (url, _handle) = start_test_server().await;
let client = test_client();
let response = client
.get(&format!("{}/v1/health/ready", url))
.header("fly-region", "local")
.send()
.await
.expect("Failed to send request");
assert_status!(response, StatusCode::OK);
let health: serde_json::Value = response.json().await.expect("Failed to parse response");
assert_eq!(health["status"], "healthy");
assert_eq!(health["ready"], true);
assert!(health["checks"].is_object());
}
#[tokio::test]
async fn test_admin_status() {
let (url, _handle) = start_test_server().await;
let client = test_client();
// Create some test data first
let app_req = CreateAppRequest {
name: "status-test-app".to_string(),
org_slug: "test-org".to_string(),
};
client
.post(&format!("{}/v1/apps", url))
.header("fly-region", "local")
.json(&app_req)
.send()
.await
.expect("Failed to create app");
// Get system status
let response = client
.get(&format!("{}/v1/admin/status", url))
.header("fly-region", "local")
.send()
.await
.expect("Failed to send request");
assert_status!(response, StatusCode::OK);
let status: serde_json::Value = response.json().await.expect("Failed to parse response");
assert!(status["stats"]["apps_count"].is_number());
assert!(status["stats"]["machines_count"].is_number());
assert!(status["stats"]["volumes_count"].is_number());
assert!(status["stats"]["leases_count"].is_number());
assert!(status["region"].is_string());
assert!(status["version"].is_string());
}
#[tokio::test]
async fn test_health_without_region_header() {
let (url, _handle) = start_test_server().await;
let client = test_client();
// Health endpoints should work without region header
let response = client
.get(&format!("{}/v1/health", url))
// No fly-region header
.send()
.await
.expect("Failed to send request");
// Should still work - health endpoints don't require region
assert_status!(response, StatusCode::OK);
}
*/