#[ allow( unused_imports ) ]
use super::*;
#[ cfg( feature = "general-diagnostics" ) ]
#[ allow( unused_imports ) ]
use the_module::*;
#[ cfg( feature = "general-diagnostics" ) ]
mod general_diagnostics_functionality_tests
{
use super::*;
#[ test ]
fn test_request_lifecycle_tracking()
{
use the_module::RequestTracker;
let mut tracker = RequestTracker::new();
let request_id = tracker.start_request( "test-request-id" );
assert!( tracker.is_active( &request_id ), "Request should be active" );
assert_eq!( tracker.get_status( &request_id ), Some( RequestStatus::InProgress ) );
tracker.complete_request( &request_id, RequestResult::Success );
assert_eq!( tracker.get_status( &request_id ), Some( RequestStatus::Completed ) );
assert!( !tracker.is_active( &request_id ), "Request should no longer be active" );
}
#[ test ]
fn test_performance_metrics_collection()
{
use the_module::PerformanceMetrics;
use std::time::Duration;
let mut metrics = PerformanceMetrics::new();
metrics.record_request_duration( "message_creation", Duration::from_millis( 150 ) );
metrics.record_request_duration( "message_creation", Duration::from_millis( 200 ) );
metrics.record_request_duration( "embedding_creation", Duration::from_millis( 75 ) );
let message_stats = metrics.get_operation_stats( "message_creation" );
assert_eq!( message_stats.count(), 2 );
assert_eq!( message_stats.average_duration(), Duration::from_millis( 175 ) );
let embedding_stats = metrics.get_operation_stats( "embedding_creation" );
assert_eq!( embedding_stats.count(), 1 );
assert_eq!( embedding_stats.average_duration(), Duration::from_millis( 75 ) );
}
#[ test ]
fn test_error_analysis()
{
use the_module::ErrorAnalyzer;
let mut analyzer = ErrorAnalyzer::new();
analyzer.record_error( "authentication_failed", "Invalid API key", "401" );
analyzer.record_error( "rate_limited", "Too many requests", "429" );
analyzer.record_error( "authentication_failed", "Expired token", "401" );
let auth_errors = analyzer.get_error_category( "authentication_failed" );
assert_eq!( auth_errors.count(), 2 );
assert!( auth_errors.contains_message( "Invalid API key" ) );
assert!( auth_errors.contains_message( "Expired token" ) );
let rate_limit_errors = analyzer.get_error_category( "rate_limited" );
assert_eq!( rate_limit_errors.count(), 1 );
let error_summary = analyzer.get_summary();
assert_eq!( error_summary.total_errors(), 3 );
assert_eq!( error_summary.most_common_category(), "authentication_failed" );
}
#[ test ]
fn test_diagnostics_context()
{
use the_module::DiagnosticsContext;
let context = DiagnosticsContext::new()
.request_id( "req-123" )
.user_id( "user-456" )
.operation( "create_message" )
.model( "claude-3-sonnet-20240229" );
assert_eq!( context.get_request_id(), "req-123" );
assert_eq!( context.get_user_id(), Some( "user-456" ) );
assert_eq!( context.get_operation(), "create_message" );
assert_eq!( context.get_model(), Some( "claude-3-sonnet-20240229" ) );
let context_json = context.to_json();
assert!( context_json.contains( "req-123" ) );
assert!( context_json.contains( "create_message" ) );
}
#[ test ]
fn test_diagnostics_aggregation()
{
use the_module::DiagnosticsAggregator;
let mut aggregator = DiagnosticsAggregator::new();
aggregator.record_request_start( "req-1", "create_message" );
aggregator.record_request_duration( "req-1", std::time::Duration::from_millis( 100 ) );
aggregator.record_request_success( "req-1" );
aggregator.record_request_start( "req-2", "create_embedding" );
aggregator.record_request_error( "req-2", "rate_limited" );
let summary = aggregator.get_summary();
assert_eq!( summary.total_requests(), 2 );
assert_eq!( summary.successful_requests(), 1 );
assert_eq!( summary.failed_requests(), 1 );
assert_eq!( summary.average_duration(), std::time::Duration::from_millis( 100 ) );
let message_metrics = aggregator.get_operation_metrics( "create_message" );
assert_eq!( message_metrics.success_rate(), 1.0 );
let embedding_metrics = aggregator.get_operation_metrics( "create_embedding" );
assert_eq!( embedding_metrics.success_rate(), 0.0 );
}
#[ cfg( feature = "curl-diagnostics" ) ]
#[ test ]
fn test_curl_diagnostics_integration()
{
use the_module::DiagnosticsCollector;
let collector = DiagnosticsCollector::new();
let request = the_module::CreateMessageRequest::builder()
.model( "claude-3-sonnet-20240229" )
.max_tokens( 1000 )
.messages( vec![ the_module::Message::user( "Test integration" ) ] )
.build();
let diagnostics = collector.collect_for_request( &request );
assert!( diagnostics.has_curl_representation(), "Should include cURL data" );
assert!( diagnostics.curl_command().contains( "claude-3-sonnet-20240229" ) );
assert!( diagnostics.request_size() > 0, "Should calculate request size" );
assert!( diagnostics.estimated_cost().is_some(), "Should estimate API cost" );
}
#[ test ]
fn test_diagnostics_performance_overhead()
{
use std::time::Instant;
use the_module::DiagnosticsCollector;
let collector = DiagnosticsCollector::new();
let request = the_module::CreateMessageRequest::builder()
.model( "claude-3-sonnet-20240229" )
.max_tokens( 1000 )
.messages( vec![ the_module::Message::user( "Performance test" ) ] )
.build();
let start = Instant::now();
for _ in 0..1000
{
let _diagnostics = collector.collect_for_request( &request );
}
let duration = start.elapsed();
assert!( duration.as_millis() < 50, "Diagnostics overhead should be minimal : {}ms", duration.as_millis() );
}
#[ test ]
fn test_realtime_monitoring()
{
use the_module::RealtimeMonitor;
let mut monitor = RealtimeMonitor::new();
monitor.on_high_latency( |duration| {
let _ = duration;
});
monitor.record_latency( std::time::Duration::from_millis( 1200 ) );
monitor.record_latency( std::time::Duration::from_millis( 800 ) );
monitor.record_latency( std::time::Duration::from_millis( 1500 ) );
monitor.process_events();
assert_eq!( monitor.get_alert_count(), 2, "Should trigger alerts for high latency" );
assert!( monitor.get_current_status().is_degraded(), "Should detect degraded performance" );
}
#[ test ]
fn test_diagnostics_export()
{
use the_module::DiagnosticsExporter;
let exporter = DiagnosticsExporter::new();
let mut data = the_module::DiagnosticsData::new();
data.add_request_metric( "req-1", "create_message", std::time::Duration::from_millis( 150 ), true );
data.add_request_metric( "req-2", "create_embedding", std::time::Duration::from_millis( 75 ), false );
let json_export = exporter.to_json( &data );
assert!( json_export.contains( "create_message" ) );
assert!( json_export.contains( "150" ) );
let csv_export = exporter.to_csv( &data );
assert!( csv_export.contains( "request_id,operation,duration_ms,success" ) );
assert!( csv_export.contains( "req-1,create_message,150,true" ) );
let metrics_export = exporter.to_prometheus_metrics( &data );
assert!( metrics_export.contains( "api_request_duration_ms" ) );
assert!( metrics_export.contains( "api_request_total" ) );
}
}
#[ cfg( feature = "general-diagnostics" ) ]
#[ cfg( feature = "integration" ) ]
mod general_diagnostics_integration_tests
{
use super::*;
#[ tokio::test ]
#[ ignore = "Requires workspace secrets file" ]
async fn test_end_to_end_diagnostics()
{
use the_module::DiagnosticsCollector;
let client = the_module::Client::from_workspace()
.expect( "Must have valid API key for integration test" );
let collector = DiagnosticsCollector::new();
let request = the_module::CreateMessageRequest::builder()
.model( "claude-3-haiku-20240307" )
.max_tokens( 50 )
.messages( vec![ the_module::Message::user( "Test diagnostics collection" ) ] )
.build();
let collection_id = collector.start_collection( &request );
let response = client.create_message( request ).await;
match &response
{
Err( the_module::AnthropicError::Api( ref api_err ) ) if api_err.message.contains( "credit balance is too low" ) =>
{
println!( "INTEGRATION TEST SKIPPED: Credit balance exhausted - this confirms real API usage" );
println!( " Diagnostics test would validate credit exhaustion tracking in production" );
return;
},
_ => {
}
}
let diagnostics = collector.complete_collection( collection_id, &response );
if response.is_ok()
{
assert!( diagnostics.request_succeeded(), "Should track successful request" );
assert!( diagnostics.response_time() > std::time::Duration::from_millis( 0 ) );
assert!( diagnostics.tokens_used() > 0, "Should track token usage" );
} else {
assert!( diagnostics.request_failed(), "Should track failed request" );
assert!( diagnostics.error_category().is_some(), "Should categorize error" );
}
assert!( diagnostics.can_export(), "Should be exportable" );
assert!( diagnostics.curl_equivalent().contains( "claude-3-haiku-20240307" ) );
}
#[ tokio::test ]
#[ ignore = "Requires workspace secrets file" ]
async fn test_diagnostics_under_load()
{
use the_module::{ DiagnosticsCollector, LoadTester };
let client = the_module::Client::from_workspace()
.expect( "Must have valid API key for integration test" );
let collector = DiagnosticsCollector::new();
let load_tester = LoadTester::new( collector.clone() );
let results = load_tester.run_concurrent_requests( &client, 5, 10 );
assert_eq!( results.total_requests(), 50 );
assert!( results.average_latency() > std::time::Duration::from_millis( 0 ) );
assert!( results.success_rate() >= 0.8, "Should maintain high success rate under load" );
let aggregated_diagnostics = collector.get_aggregated_metrics();
assert_eq!( aggregated_diagnostics.request_count(), 50 );
assert!( aggregated_diagnostics.has_performance_data(), "Should collect performance data" );
}
#[ tokio::test ]
async fn test_diagnostics_alerting()
{
use the_module::{ DiagnosticsCollector, AlertingSystem };
let collector = DiagnosticsCollector::new();
let mut alerting = AlertingSystem::new( collector );
alerting.set_latency_threshold( std::time::Duration::from_millis( 2000 ) );
alerting.set_error_rate_threshold( 0.1 );
let client = the_module::Client::new(
the_module::Secret::new_unchecked( "sk-ant-invalid-key".to_string() )
);
for _ in 0..20
{
let request = the_module::CreateMessageRequest::builder()
.model( "claude-3-haiku-20240307" )
.max_tokens( 50 )
.messages( vec![ the_module::Message::user( "Alert test" ) ] )
.build();
let _result = client.create_message( request ).await;
}
alerting.process_alerts();
let alerts = alerting.get_recent_alerts();
assert!( !alerts.is_empty(), "Should generate alerts for high error rate" );
assert!( alerts.iter().any( |a| a.alert_type() == "high_error_rate" ) );
}
}
#[ cfg( not( feature = "general-diagnostics" ) ) ]
mod general_diagnostics_feature_disabled_tests
{
#[ test ]
fn test_general_diagnostics_feature_gated()
{
assert!( true, "Feature gating working correctly - general diagnostics types not available" );
}
}