mirror of
https://github.com/hanzoai/insights.git
synced 2026-10-30 16:15:31 +00:00
The tree was a debranded snapshot of upstream taken around 2026-02-20, and upstream has moved about five months since. This replaces it with upstream master, mechanically re-derived: bin/debrand does the rename, and the pipeline and squashed migrations are restored from the shipped tree. Not a merge. The previous import replaced the tree wholesale in a single commit, so there is no shared content history to merge against. Reproducing the rename on the new tree is what actually converges. What survives: .hanzo/workflows, the Dockerfiles and bin/docker* entrypoints, compose files, LLM.md, and insights/migrations. The squashed initial migration is load-bearing — the live database records it by name, so upstream's ~918 individual migrations cannot come back. Nine products are dropped as unreferenced. Twenty-one more that we do not run are kept anyway because the core app still imports them; unpicking those is a refactor and does not belong in a rebase. This base does not build yet, and the reasons are not in the rename: upstream now wants Python 3.13.13 against our 3.12.12 and Django 5.2 against our 4.2, and the dependency manifests still name upstream packages that we republish under our own names. Those are decisions, not renames.
60 lines
2.2 KiB
Rust
60 lines
2.2 KiB
Rust
#[path = "common/integration_utils.rs"]
|
|
mod integration_utils;
|
|
use integration_utils::build_router_for_mode;
|
|
|
|
use axum::http::StatusCode;
|
|
use axum_test_helper::TestClient;
|
|
use capture::config::CaptureMode;
|
|
|
|
// Import mode must not register the AI or OTEL handlers: they build their own
|
|
// ProcessingContext with historical_migration: false, so they would bypass both
|
|
// Import gates (historical-only drop and GRL) and return a false 200 for traffic
|
|
// this deployment silently discards. Events mode keeps them.
|
|
#[tokio::test]
|
|
async fn test_import_mode_does_not_register_ai_or_otel_routes() {
|
|
let client = TestClient::new(build_router_for_mode(CaptureMode::Import));
|
|
|
|
for path in ["/i/v0/ai", "/i/v0/ai/", "/i/v0/ai/otel", "/i/v0/ai/otel/"] {
|
|
let resp = client.post(path).body(vec![]).send().await;
|
|
assert_eq!(
|
|
StatusCode::NOT_FOUND,
|
|
resp.status(),
|
|
"Import mode must not register {path}, expected 404",
|
|
);
|
|
}
|
|
}
|
|
|
|
// The gated batch/event paths stay reachable in Import mode. /i/v0/ai/batch lives
|
|
// on batch_router (not ai_router) and dispatches to the gated v0_endpoint::event,
|
|
// so it survives the split. "Not 404" is the assertion: an empty body yields a 4xx
|
|
// from the handler, which still proves the route is registered.
|
|
#[tokio::test]
|
|
async fn test_import_mode_serves_gated_event_routes() {
|
|
let client = TestClient::new(build_router_for_mode(CaptureMode::Import));
|
|
|
|
for path in ["/i/v0/e", "/batch", "/i/v0/ai/batch"] {
|
|
let resp = client.post(path).body(vec![]).send().await;
|
|
assert_ne!(
|
|
StatusCode::NOT_FOUND,
|
|
resp.status(),
|
|
"Import mode must serve {path}, got 404",
|
|
);
|
|
}
|
|
}
|
|
|
|
// Guard the contrast: Events mode does register the AI/OTEL routes, so the split
|
|
// above is the only thing withholding them from Import.
|
|
#[tokio::test]
|
|
async fn test_events_mode_registers_ai_and_otel_routes() {
|
|
let client = TestClient::new(build_router_for_mode(CaptureMode::Events));
|
|
|
|
for path in ["/i/v0/ai", "/i/v0/ai/otel"] {
|
|
let resp = client.post(path).body(vec![]).send().await;
|
|
assert_ne!(
|
|
StatusCode::NOT_FOUND,
|
|
resp.status(),
|
|
"Events mode must register {path}, got 404",
|
|
);
|
|
}
|
|
}
|