mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-04 00:17:45 +08:00
第一批减负(对应 docs/operations/gateway-ci-timeout-reduction-plan.md): A1 架构守卫迁出 - 将 src/tests/architecture/**(208 项 / 约 1.5 万行字符串断言)迁至 tests/architecture/,入口 tests/architecture_guard.rs - 从 lib cfg(test) 巨型编译单元移除,压低 rustc 峰值与 OOM 风险 - 断言逻辑不变;helper 可见性改为 pub(crate) A2 构建指纹统一 - test_gateway 的 mold RUSTFLAGS / RUST_MIN_STACK / sccache 上移至 job 级 env - rust-ci.yml 全部 toolchain 钉住 1.95.0(与 rust-toolchain.toml、fmt/clippy 一致) - Gateway 独立 cache key,避免 mold 指纹与无 mold job 互相污染 A4 补安全集成测试 - 新增 Test integration targets:cargo nextest run -p aether-gateway --tests - 覆盖 architecture_guard + 此前未执行的 admin_unsigned_identity_headers 验证:architecture_guard + admin_unsigned 209 passed; cargo check -p aether-gateway --lib --tests 通过;cargo fmt --check 通过。 不创建 PR,仅本地分支提交。
671 lines
26 KiB
Rust
671 lines
26 KiB
Rust
use super::*;
|
|
|
|
#[test]
|
|
fn non_admin_handlers_do_not_depend_on_admin_stats_module() {
|
|
let handlers_mod = read_workspace_file("apps/aether-gateway/src/handlers/mod.rs");
|
|
assert!(
|
|
!handlers_mod.contains("pub(crate) use admin::{"),
|
|
"handlers/mod.rs should stay as pure module wiring after shared usage stats facade extraction"
|
|
);
|
|
|
|
for path in [
|
|
"apps/aether-gateway/src/handlers/public/support/user_me.rs",
|
|
"apps/aether-gateway/src/handlers/public/support/wallet/reads.rs",
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_store.rs",
|
|
] {
|
|
let file = read_workspace_file(path);
|
|
assert!(
|
|
!file.contains("handlers::admin::stats::"),
|
|
"{path} should not depend directly on admin::stats"
|
|
);
|
|
}
|
|
|
|
let admin_mod = read_workspace_file("apps/aether-gateway/src/handlers/admin/mod.rs");
|
|
assert!(
|
|
!admin_mod.contains("pub(crate) mod facade;"),
|
|
"handlers/admin/mod.rs should not keep admin facade after direct subdomain exposure"
|
|
);
|
|
|
|
let shared_mod = read_workspace_file("apps/aether-gateway/src/handlers/shared/mod.rs");
|
|
for pattern in [
|
|
"admin_stats_bad_request_response",
|
|
"parse_bounded_u32",
|
|
"round_to",
|
|
"AdminStatsTimeRange",
|
|
"AdminStatsUsageFilter",
|
|
] {
|
|
assert!(
|
|
shared_mod.contains(pattern),
|
|
"handlers/shared/mod.rs should expose shared usage stats helper {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
!shared_mod.contains("list_usage_for_optional_range"),
|
|
"handlers/shared/mod.rs should not expose unbounded usage range helpers"
|
|
);
|
|
|
|
let admin_observability_mod =
|
|
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/mod.rs");
|
|
for pattern in [
|
|
"aggregate_usage_stats",
|
|
"match_admin_monitoring_route",
|
|
"AdminMonitoringRoute",
|
|
"ADMIN_MONITORING_REDIS_REQUIRED_DETAIL",
|
|
"test_support",
|
|
] {
|
|
assert!(
|
|
!admin_observability_mod.contains(pattern),
|
|
"handlers/admin/observability/mod.rs should not re-export {pattern}"
|
|
);
|
|
}
|
|
for pattern in [
|
|
"admin_stats_bad_request_response",
|
|
"parse_bounded_u32",
|
|
"round_to",
|
|
"AdminStatsTimeRange",
|
|
"AdminStatsUsageFilter",
|
|
] {
|
|
assert!(
|
|
admin_observability_mod.contains(pattern),
|
|
"handlers/admin/observability/mod.rs should expose admin stats facade helper {pattern}"
|
|
);
|
|
}
|
|
for pattern in ["list_usage_for_optional_range", "list_usage_for_range"] {
|
|
assert!(
|
|
!admin_observability_mod.contains(pattern),
|
|
"handlers/admin/observability/mod.rs should not re-export deprecated usage helper {pattern}"
|
|
);
|
|
}
|
|
|
|
let shared_usage_stats =
|
|
read_workspace_file("apps/aether-gateway/src/handlers/shared/usage_stats.rs");
|
|
assert!(
|
|
shared_usage_stats.contains("crate::admin_api::{"),
|
|
"handlers/shared/usage_stats.rs should depend on crate::admin_api facade directly"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn admin_monitoring_root_stays_thin() {
|
|
let monitoring_mod = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/mod.rs",
|
|
);
|
|
for pattern in [
|
|
"mod common;",
|
|
"use self::activity::{",
|
|
"use self::cache::{",
|
|
"use self::resilience::{",
|
|
"use self::trace::{",
|
|
"pub(crate) use self::routes::{",
|
|
"const ADMIN_MONITORING_",
|
|
] {
|
|
assert!(
|
|
!monitoring_mod.contains(pattern),
|
|
"handlers/admin/observability/monitoring/mod.rs should not act as a glue re-export layer for {pattern}"
|
|
);
|
|
}
|
|
|
|
assert!(
|
|
monitoring_mod.contains("routes::maybe_build_local_admin_monitoring_response"),
|
|
"handlers/admin/observability/monitoring/mod.rs should delegate through routes module"
|
|
);
|
|
assert!(
|
|
monitoring_mod.contains("mod cache_config;"),
|
|
"handlers/admin/observability/monitoring/mod.rs should register cache_config as a dedicated cache boundary"
|
|
);
|
|
assert!(
|
|
monitoring_mod.contains("mod cache_mutations;"),
|
|
"handlers/admin/observability/monitoring/mod.rs should register cache_mutations as a dedicated mutation boundary"
|
|
);
|
|
assert!(
|
|
!monitoring_mod.contains("mod responses;"),
|
|
"handlers/admin/observability/monitoring/mod.rs should not keep local monitoring responses after crate split"
|
|
);
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/common.rs",
|
|
),
|
|
"handlers/admin/observability/monitoring/common.rs should stay removed after boundary split"
|
|
);
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/responses.rs",
|
|
),
|
|
"handlers/admin/observability/monitoring/responses.rs should stay removed after crate split"
|
|
);
|
|
|
|
let monitoring_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/routes.rs",
|
|
);
|
|
for pattern in [
|
|
"use aether_admin::observability::monitoring::{",
|
|
"match_admin_monitoring_route",
|
|
"AdminMonitoringRoute",
|
|
] {
|
|
assert!(
|
|
monitoring_routes.contains(pattern),
|
|
"handlers/admin/observability/monitoring/routes.rs should depend on crate-owned monitoring seam {pattern}"
|
|
);
|
|
}
|
|
for pattern in [
|
|
"pub(crate) enum AdminMonitoringRoute",
|
|
"pub(crate) fn match_admin_monitoring_route(",
|
|
] {
|
|
assert!(
|
|
!monitoring_routes.contains(pattern),
|
|
"handlers/admin/observability/monitoring/routes.rs should not keep local monitoring route matcher {pattern}"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn admin_stats_root_stays_thin() {
|
|
let stats_mod =
|
|
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/stats/mod.rs");
|
|
for pattern in [
|
|
"use self::leaderboard::{",
|
|
"enum AdminStatsComparisonType",
|
|
"enum AdminStatsGranularity",
|
|
"struct AdminStatsForecastPoint",
|
|
"struct AdminStatsLeaderboardItem",
|
|
"struct AdminStatsUserMetadata",
|
|
"struct AdminStatsTimeSeriesBucket",
|
|
"impl AdminStatsTimeRange {",
|
|
"pub(crate) fn round_to(",
|
|
"mod helpers;",
|
|
"mod responses;",
|
|
"mod timeseries;",
|
|
"pub(crate) use self::helpers::{round_to, AdminStatsTimeRange, AdminStatsUsageFilter};",
|
|
"pub(crate) use self::responses::admin_stats_bad_request_response;",
|
|
"pub(crate) use self::timeseries::aggregate_usage_stats;",
|
|
] {
|
|
assert!(
|
|
!stats_mod.contains(pattern),
|
|
"handlers/admin/observability/stats/mod.rs should not own stats helper implementation {pattern}"
|
|
);
|
|
}
|
|
for pattern in [
|
|
"pub(crate) use aether_admin::observability::stats::{",
|
|
"admin_stats_bad_request_response",
|
|
"aggregate_usage_stats",
|
|
"round_to",
|
|
"AdminStatsTimeRange",
|
|
"AdminStatsUsageFilter",
|
|
] {
|
|
assert!(
|
|
stats_mod.contains(pattern),
|
|
"handlers/admin/observability/stats/mod.rs should stay as a thin seam for {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
stats_mod.contains("pub(crate) use self::range::{"),
|
|
"handlers/admin/observability/stats/mod.rs should re-export the split range seam"
|
|
);
|
|
let pattern = "parse_bounded_u32";
|
|
assert!(
|
|
stats_mod.contains(pattern),
|
|
"handlers/admin/observability/stats/mod.rs should keep range re-export {pattern}"
|
|
);
|
|
for pattern in ["list_usage_for_optional_range", "list_usage_for_range"] {
|
|
assert!(
|
|
!stats_mod.contains(pattern),
|
|
"handlers/admin/observability/stats/mod.rs should not re-export deprecated range helper {pattern}"
|
|
);
|
|
}
|
|
|
|
let analytics_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/stats/analytics_routes.rs",
|
|
);
|
|
for pattern in [
|
|
"use aether_admin::observability::stats::{",
|
|
"AdminStatsComparisonType",
|
|
"build_admin_stats_comparison_response",
|
|
] {
|
|
assert!(
|
|
analytics_routes.contains(pattern),
|
|
"stats/analytics_routes.rs should depend on crate-owned stats helper {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
!analytics_routes.contains("use super::helpers::{")
|
|
&& !analytics_routes.contains("use super::responses::{")
|
|
&& !analytics_routes.contains("use super::timeseries::{"),
|
|
"stats/analytics_routes.rs should no longer depend on local stats pure bridges"
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("use super::range::{")
|
|
|| analytics_routes.contains("use super::range::build_comparison_range;"),
|
|
"stats/analytics_routes.rs should depend on the split stats range seam"
|
|
);
|
|
|
|
let cost_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/stats/cost_routes.rs",
|
|
);
|
|
for pattern in [
|
|
"use super::range::{",
|
|
"use aether_admin::observability::stats::{",
|
|
"build_admin_stats_cost_forecast_response",
|
|
] {
|
|
assert!(
|
|
cost_routes.contains(pattern),
|
|
"stats/cost_routes.rs should depend on crate-owned stats helper {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
!cost_routes.contains("use super::helpers::{")
|
|
&& !cost_routes.contains("use super::responses::{")
|
|
&& !cost_routes.contains("use super::timeseries::{"),
|
|
"stats/cost_routes.rs should no longer depend on local stats pure bridges"
|
|
);
|
|
|
|
let leaderboard_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/stats/leaderboard_routes.rs",
|
|
);
|
|
for pattern in [
|
|
"use super::leaderboard::{",
|
|
"use super::range::{",
|
|
"use aether_admin::observability::stats::{",
|
|
"admin_stats_leaderboard_empty_response",
|
|
] {
|
|
assert!(
|
|
leaderboard_routes.contains(pattern),
|
|
"stats/leaderboard_routes.rs should depend on explicit local/crate owner {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
!leaderboard_routes.contains("use super::helpers::{")
|
|
&& !leaderboard_routes.contains("use super::responses::{"),
|
|
"stats/leaderboard_routes.rs should no longer depend on local stats pure bridges"
|
|
);
|
|
|
|
let provider_quota_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/stats/provider_quota_routes.rs",
|
|
);
|
|
assert!(
|
|
provider_quota_routes.contains("use aether_admin::observability::stats::{")
|
|
|| provider_quota_routes.contains(
|
|
"use aether_admin::observability::stats::admin_stats_provider_quota_usage_empty_response;",
|
|
),
|
|
"stats/provider_quota_routes.rs should depend on crate-owned responses directly"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn admin_monitoring_cache_mutations_are_split_from_reads() {
|
|
let monitoring_cache = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache.rs",
|
|
);
|
|
for pattern in [
|
|
"pub(super) async fn build_admin_monitoring_cache_users_delete_response(",
|
|
"pub(super) async fn build_admin_monitoring_cache_affinity_delete_response(",
|
|
"pub(super) async fn build_admin_monitoring_cache_flush_response(",
|
|
"pub(super) async fn build_admin_monitoring_cache_provider_delete_response(",
|
|
"pub(super) async fn build_admin_monitoring_model_mapping_delete_response(",
|
|
"pub(super) async fn build_admin_monitoring_model_mapping_delete_model_response(",
|
|
"pub(super) async fn build_admin_monitoring_model_mapping_delete_provider_response(",
|
|
"pub(super) async fn build_admin_monitoring_redis_keys_delete_response(",
|
|
] {
|
|
assert!(
|
|
!monitoring_cache.contains(pattern),
|
|
"monitoring/cache.rs should stay focused on read/report handlers, not {pattern}"
|
|
);
|
|
}
|
|
|
|
let monitoring_cache_mutations = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/mod.rs",
|
|
);
|
|
for pattern in [
|
|
"mod users;",
|
|
"mod affinity;",
|
|
"mod flush;",
|
|
"mod provider;",
|
|
"mod model_mapping;",
|
|
"mod redis_keys;",
|
|
"pub(super) use users::build_admin_monitoring_cache_users_delete_response;",
|
|
"pub(super) use affinity::build_admin_monitoring_cache_affinity_delete_response;",
|
|
"pub(super) use flush::build_admin_monitoring_cache_flush_response;",
|
|
"pub(super) use provider::build_admin_monitoring_cache_provider_delete_response;",
|
|
"pub(super) use model_mapping::{",
|
|
"pub(super) use redis_keys::build_admin_monitoring_redis_keys_delete_response;",
|
|
] {
|
|
assert!(
|
|
monitoring_cache_mutations.contains(pattern),
|
|
"monitoring/cache_mutations/mod.rs should own {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations.rs"
|
|
),
|
|
"monitoring/cache_mutations.rs should stay removed after directory split"
|
|
);
|
|
|
|
let monitoring_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/routes.rs",
|
|
);
|
|
assert!(
|
|
monitoring_routes.contains("use super::cache_mutations::{"),
|
|
"monitoring/routes.rs should depend on cache_mutations directly for delete handlers"
|
|
);
|
|
assert!(
|
|
monitoring_routes.contains("use super::cache_affinity_reads::{"),
|
|
"monitoring/routes.rs should depend on cache_affinity_reads directly for affinity read handlers"
|
|
);
|
|
assert!(
|
|
monitoring_routes.contains("use super::cache_model_mapping::{"),
|
|
"monitoring/routes.rs should depend on cache_model_mapping directly for model-mapping read handlers"
|
|
);
|
|
|
|
let monitoring_mod = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/mod.rs",
|
|
);
|
|
for pattern in ["mod cache_affinity_reads;", "mod cache_model_mapping;"] {
|
|
assert!(
|
|
monitoring_mod.contains(pattern),
|
|
"monitoring/mod.rs should register split read module {pattern}"
|
|
);
|
|
}
|
|
|
|
let monitoring_affinity_reads = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_affinity_reads.rs",
|
|
);
|
|
for pattern in [
|
|
"pub(super) async fn build_admin_monitoring_cache_affinities_response(",
|
|
"pub(super) async fn build_admin_monitoring_cache_affinity_response(",
|
|
] {
|
|
assert!(
|
|
monitoring_affinity_reads.contains(pattern),
|
|
"monitoring/cache_affinity_reads.rs should own {pattern}"
|
|
);
|
|
}
|
|
|
|
let monitoring_model_mapping = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_model_mapping.rs",
|
|
);
|
|
for pattern in [
|
|
"pub(super) async fn build_admin_monitoring_model_mapping_stats_response(",
|
|
"pub(super) async fn build_admin_monitoring_redis_cache_categories_response(",
|
|
] {
|
|
assert!(
|
|
monitoring_model_mapping.contains(pattern),
|
|
"monitoring/cache_model_mapping.rs should own {pattern}"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn admin_monitoring_route_payloads_prefer_crate_owned_builders() {
|
|
for (path, pattern) in [
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/activity.rs",
|
|
"build_admin_monitoring_system_status_payload_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/trace.rs",
|
|
"build_admin_monitoring_trace_provider_stats_payload_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/history.rs",
|
|
"build_admin_monitoring_circuit_history_payload_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/status.rs",
|
|
"build_admin_monitoring_resilience_status_payload_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/reset.rs",
|
|
"build_admin_monitoring_reset_error_stats_payload_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/flush.rs",
|
|
"build_admin_monitoring_cache_flush_success_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/provider.rs",
|
|
"admin_monitoring_cache_provider_not_found_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/model_mapping.rs",
|
|
"build_admin_monitoring_model_mapping_delete_success_response",
|
|
),
|
|
(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/redis_keys.rs",
|
|
"build_admin_monitoring_redis_keys_delete_success_response",
|
|
),
|
|
] {
|
|
let file = read_workspace_file(path);
|
|
assert!(
|
|
file.contains("use aether_admin::observability::monitoring::{")
|
|
|| file.contains("use aether_admin::observability::monitoring::"),
|
|
"{path} should depend on aether_admin::observability::monitoring"
|
|
);
|
|
assert!(
|
|
file.contains(pattern),
|
|
"{path} should route payload building through crate-owned helper {pattern}"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn admin_usage_root_stays_thin() {
|
|
let usage_mod =
|
|
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/usage/mod.rs");
|
|
for pattern in ["pub(crate) use analytics::{", "pub(crate) use helpers::{"] {
|
|
assert!(
|
|
!usage_mod.contains(pattern),
|
|
"handlers/admin/observability/usage/mod.rs should not re-export helper seam {pattern}"
|
|
);
|
|
}
|
|
for pattern in [
|
|
"mod analytics;",
|
|
"mod analytics_routes;",
|
|
"mod detail_routes;",
|
|
"mod replay;",
|
|
"mod summary_routes;",
|
|
"detail_routes::maybe_build_local_admin_usage_detail_response",
|
|
"summary_routes::maybe_build_local_admin_usage_summary_response",
|
|
"analytics_routes::maybe_build_local_admin_usage_analytics_response",
|
|
] {
|
|
assert!(
|
|
usage_mod.contains(pattern),
|
|
"handlers/admin/observability/usage/mod.rs should stay as a thin router for {pattern}"
|
|
);
|
|
}
|
|
|
|
let analytics_mod = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/mod.rs",
|
|
);
|
|
for pattern in [
|
|
"mod aggregations;",
|
|
"mod cache_affinity;",
|
|
"mod filters;",
|
|
"pub(super) use aggregations::admin_usage_aggregation_by_user_json;",
|
|
"pub(super) use cache_affinity::list_usage_cache_affinity_intervals;",
|
|
"pub(super) use filters::admin_usage_provider_key_names;",
|
|
] {
|
|
assert!(
|
|
analytics_mod.contains(pattern),
|
|
"usage/analytics/mod.rs should keep explicit analytics owner seam {pattern}"
|
|
);
|
|
}
|
|
for pattern in [
|
|
"mod parse;",
|
|
"admin_usage_aggregation_by_model_json",
|
|
"admin_usage_parse_limit",
|
|
"admin_usage_matches_search",
|
|
] {
|
|
assert!(
|
|
!analytics_mod.contains(pattern),
|
|
"usage/analytics/mod.rs should not keep pure crate forwarders {pattern}"
|
|
);
|
|
}
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics.rs"
|
|
),
|
|
"usage/analytics.rs should be removed once analytics is directoryized"
|
|
);
|
|
|
|
let analytics_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics_routes/mod.rs",
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("mod aggregation;"),
|
|
"usage/analytics_routes/mod.rs should register aggregation owner"
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("mod cache_affinity_hit_analysis;"),
|
|
"usage/analytics_routes/mod.rs should register cache_affinity_hit_analysis owner"
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("mod cache_affinity_interval_timeline;"),
|
|
"usage/analytics_routes/mod.rs should register cache_affinity_interval_timeline owner"
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("mod cache_affinity_ttl_analysis;"),
|
|
"usage/analytics_routes/mod.rs should register cache_affinity_ttl_analysis owner"
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("mod heatmap;"),
|
|
"usage/analytics_routes/mod.rs should register heatmap owner"
|
|
);
|
|
assert!(
|
|
analytics_routes.contains("aggregation::build_admin_usage_aggregation_stats_response"),
|
|
"usage/analytics_routes/mod.rs should delegate aggregation handling to aggregation owner"
|
|
);
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics_routes.rs"
|
|
),
|
|
"usage/analytics_routes.rs should stay removed after directory split"
|
|
);
|
|
|
|
let summary_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/summary_routes.rs",
|
|
);
|
|
assert!(
|
|
summary_routes.contains("use super::analytics::admin_usage_provider_key_names;"),
|
|
"usage/summary_routes.rs should keep only the local stateful analytics lookup"
|
|
);
|
|
assert!(
|
|
summary_routes.contains("use aether_admin::observability::usage::{"),
|
|
"usage/summary_routes.rs should depend on crate-owned usage helpers directly"
|
|
);
|
|
|
|
let detail_routes = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/detail_routes.rs",
|
|
);
|
|
assert!(
|
|
detail_routes.contains("use super::analytics::admin_usage_provider_key_names;"),
|
|
"usage/detail_routes.rs should keep only the local stateful analytics lookup"
|
|
);
|
|
assert!(
|
|
detail_routes.contains("use aether_admin::observability::usage::{"),
|
|
"usage/detail_routes.rs should depend on crate-owned usage helpers directly"
|
|
);
|
|
|
|
let replay =
|
|
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/usage/replay.rs");
|
|
assert!(
|
|
replay.contains("use aether_admin::observability::usage::{"),
|
|
"usage/replay.rs should depend on crate-owned usage helpers directly"
|
|
);
|
|
|
|
let analytics_aggregations = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/aggregations.rs",
|
|
);
|
|
assert!(
|
|
analytics_aggregations
|
|
.contains("pub(in super::super) async fn admin_usage_aggregation_by_user_json("),
|
|
"usage/analytics/aggregations.rs should keep only the local user aggregation owner"
|
|
);
|
|
let analytics_cache_affinity = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/cache_affinity.rs",
|
|
);
|
|
assert!(
|
|
analytics_cache_affinity
|
|
.contains("pub(in super::super) async fn list_usage_cache_affinity_intervals("),
|
|
"usage/analytics/cache_affinity.rs should own cache-affinity analytics helpers"
|
|
);
|
|
let analytics_filters = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/filters.rs",
|
|
);
|
|
assert!(
|
|
analytics_filters.contains("pub(in super::super) async fn admin_usage_provider_key_names("),
|
|
"usage/analytics/filters.rs should keep only the local provider key lookup"
|
|
);
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/helpers.rs"
|
|
),
|
|
"usage/helpers.rs should stay removed after crate split"
|
|
);
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/parse.rs"
|
|
),
|
|
"usage/analytics/parse.rs should stay removed after crate split"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn admin_monitoring_snapshots_stay_app_local() {
|
|
let monitoring_cache_types = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_types.rs",
|
|
);
|
|
for pattern in [
|
|
"pub(super) struct AdminMonitoringCacheSnapshot",
|
|
"pub(super) struct AdminMonitoringCacheAffinityRecord",
|
|
] {
|
|
assert!(
|
|
monitoring_cache_types.contains(pattern),
|
|
"monitoring/cache_types.rs should own {pattern}"
|
|
);
|
|
}
|
|
|
|
let monitoring_resilience = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/mod.rs",
|
|
);
|
|
assert!(
|
|
monitoring_resilience.contains("mod history;"),
|
|
"monitoring/resilience/mod.rs should register history owner"
|
|
);
|
|
assert!(
|
|
monitoring_resilience.contains("mod snapshot;"),
|
|
"monitoring/resilience/mod.rs should register snapshot owner"
|
|
);
|
|
assert!(
|
|
monitoring_resilience.contains("mod status;"),
|
|
"monitoring/resilience/mod.rs should register status owner"
|
|
);
|
|
assert!(
|
|
monitoring_resilience.contains("mod reset;"),
|
|
"monitoring/resilience/mod.rs should register reset owner"
|
|
);
|
|
assert!(
|
|
!workspace_file_exists(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience.rs"
|
|
),
|
|
"monitoring/resilience.rs should stay removed after directory split"
|
|
);
|
|
|
|
let resilience_snapshot = read_workspace_file(
|
|
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/snapshot.rs",
|
|
);
|
|
assert!(
|
|
resilience_snapshot.contains("AdminMonitoringResilienceSnapshot"),
|
|
"monitoring/resilience/snapshot.rs should keep resilience snapshot ownership locally"
|
|
);
|
|
assert!(
|
|
resilience_snapshot.contains("pub(super) struct AdminMonitoringResilienceSnapshot"),
|
|
"monitoring/resilience/snapshot.rs should define AdminMonitoringResilienceSnapshot locally"
|
|
);
|
|
|
|
let data_system = read_workspace_file("crates/aether-data/runtime/src/repository/system.rs");
|
|
assert!(
|
|
!data_system.contains("AdminMonitoringCacheSnapshot")
|
|
&& !data_system.contains("AdminMonitoringResilienceSnapshot"),
|
|
"monitoring snapshots are admin view DTOs and should not move into aether-data"
|
|
);
|
|
}
|