minifly-api 0.1.2

API server for Minifly - Local Fly.io development simulator
Documentation
// 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_create_app() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    // Create app request
    let req = CreateAppRequest {
        name: "test-app".to_string(),
        org_slug: "test-org".to_string(),
    };
    
    let response = client
        .post(&format!("{}/v1/apps", url))
        .header("fly-region", "local")
        .json(&req)
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::CREATED);
    
    let app: App = response.json().await.expect("Failed to parse response");
    assert_eq!(app.name, "test-app");
    assert_eq!(app.organization.slug, "test-org");
    assert_eq!(app.status, AppStatus::Running);
}

#[tokio::test]
async fn test_create_app_duplicate_name() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    // Create first app
    let req = CreateAppRequest {
        name: "duplicate-app".to_string(),
        org_slug: "test-org".to_string(),
    };
    
    let response = client
        .post(&format!("{}/v1/apps", url))
        .header("fly-region", "local")
        .json(&req)
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::CREATED);
    
    // Try to create duplicate
    let response = client
        .post(&format!("{}/v1/apps", url))
        .header("fly-region", "local")
        .json(&req)
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::BAD_REQUEST);
    
    let error: ErrorResponse = response.json().await.expect("Failed to parse error");
    assert!(error.error.contains("already exists"));
}

#[tokio::test]
async fn test_get_app() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    // Create app first
    let req = CreateAppRequest {
        name: "get-test-app".to_string(),
        org_slug: "test-org".to_string(),
    };
    
    client
        .post(&format!("{}/v1/apps", url))
        .header("fly-region", "local")
        .json(&req)
        .send()
        .await
        .expect("Failed to create app");
    
    // Get the app
    let response = client
        .get(&format!("{}/v1/apps/get-test-app", url))
        .header("fly-region", "local")
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::OK);
    
    let app: App = response.json().await.expect("Failed to parse response");
    assert_eq!(app.name, "get-test-app");
}

#[tokio::test]
async fn test_get_app_not_found() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    let response = client
        .get(&format!("{}/v1/apps/nonexistent-app", url))
        .header("fly-region", "local")
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::NOT_FOUND);
}

#[tokio::test]
async fn test_delete_app() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    // Create app first
    let req = CreateAppRequest {
        name: "delete-test-app".to_string(),
        org_slug: "test-org".to_string(),
    };
    
    client
        .post(&format!("{}/v1/apps", url))
        .header("fly-region", "local")
        .json(&req)
        .send()
        .await
        .expect("Failed to create app");
    
    // Delete the app
    let response = client
        .delete(&format!("{}/v1/apps/delete-test-app", url))
        .header("fly-region", "local")
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::NO_CONTENT);
    
    // Verify it's gone
    let response = client
        .get(&format!("{}/v1/apps/delete-test-app", url))
        .header("fly-region", "local")
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::NOT_FOUND);
}

#[tokio::test]
async fn test_delete_app_not_found() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    let response = client
        .delete(&format!("{}/v1/apps/nonexistent-app", url))
        .header("fly-region", "local")
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::NOT_FOUND);
}

#[tokio::test]
async fn test_region_header_required() {
    let (url, _handle) = start_test_server().await;
    let client = test_client();
    
    // Try without region header
    let req = CreateAppRequest {
        name: "test-app".to_string(),
        org_slug: "test-org".to_string(),
    };
    
    let response = client
        .post(&format!("{}/v1/apps", url))
        // No fly-region header
        .json(&req)
        .send()
        .await
        .expect("Failed to send request");
    
    assert_status!(response, StatusCode::BAD_REQUEST);
    
    let error: ErrorResponse = response.json().await.expect("Failed to parse error");
    assert!(error.error.contains("region"));
}
*/