Files
coralogix__cx-cli/tests/e2e/contextual_data.rs
Liran Hason 13915ea843 Add all cx APIs to CLI with skills and docs (#51)
AIAG-696

## Summary

### Full API coverage
- Implement remaining cx CLI commands covering all Coralogix APIs
(dashboards, views, SLOs, incidents, notifications, webhooks,
enrichments, parsing-rules, TCO, quotas, usage, archive, integrations,
IAM, recording-rules, E2M, search-fields) - 27 command groups total
- Add user-facing skills for all command groups (cx-observability-setup,
cx-cost-optimization, cx-incident-management, cx-data-pipeline,
cx-platform-admin, cx-create-dashboard)
- Rename all skills to cx- prefix for consistency, update
cross-references and docs
- Add integration tests (wiremock) and E2E test scaffolding for all new
commands
- Update CLAUDE.md, README, CODEOWNERS, architecture docs, and
contributor guides
- Bug fixes: data_usage timestamp parsing, users error propagation,
team_groups unused params, dashboard skill API wire values, stale skill
paths

### CLI safety features
- Add `--read-only` global flag that blocks all write operations before
credential resolution - safe for exploration and agent use
- Add agent mode detection (`CX_AGENT_MODE`, `CLAUDECODE`, `CLAUDE_CODE`
env vars) - blocks write operations unless `--yes` is passed
- Wire `confirm_destructive()` to all write subcommands across all 27
command groups (104 call sites) - interactive confirmation for
create/update/delete/enable/disable operations
- Mark `iam` and `archive` as `(risky)` in help output
- Add `[requires --yes]` tags to all write subcommand help text (102
annotations)
- Update skills with read-only and agent mode guidance

### Testing
- 441 tests passing (88 ignored E2E)
- Add `tests/write_command_gating/` - systematic verification that every
write command is gated
- Add `tests/read_only/` - read-only mode enforcement tests
- Add `tests/agent_mode/` - agent mode detection and blocking tests
- Add integration tests (wiremock) for all new command groups
- Add E2E test scaffolding for all commands

## Test plan
- [x] `cargo fmt --check` passes
- [x] `cargo clippy` passes with no warnings
- [x] `cargo test` passes (441 unit + integration tests)
- [ ] `cargo test --test e2e -- --ignored --test-threads=1` passes
against test team (requires CX_API_KEY)
- [ ] `cx schema` outputs updated command tree with all new commands
- [ ] Skills trigger correctly in Claude Code sessions

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-03 13:34:50 +03:00

54 lines
1.6 KiB
Rust

use std::sync::OnceLock;
use crate::harness;
#[test]
#[ignore]
fn contextual_data_list() {
if harness::require_creds("contextual_data_list").is_none() {
return;
}
let v = harness::run_ok_json(&["integrations", "contextual-data", "list", "-o", "json"]);
harness::assert_nonempty_array_of_objects_with_keys(&v, &["id", "name"]);
}
#[test]
#[ignore]
fn contextual_data_get() {
if harness::require_creds("contextual_data_get").is_none() {
return;
}
let id = match discover_contextual_data_id() {
Some(id) => id,
None => {
eprintln!(
"[e2e] skipping contextual_data_get: no contextual data available on test team"
);
return;
}
};
let v = harness::run_ok_json(&["integrations", "contextual-data", "get", &id, "-o", "json"]);
harness::assert_get_response(&v, &["id", "name"]);
}
fn discover_contextual_data_id() -> Option<String> {
static CACHE: OnceLock<Option<String>> = OnceLock::new();
CACHE
.get_or_init(|| {
if harness::require_creds("contextual_data_discover").is_none() {
return None;
}
let stdout =
harness::run_ok(&["integrations", "contextual-data", "list", "-o", "json"]);
let v = harness::parse_json(&stdout)?;
v.as_array()?
.first()
.and_then(|item| item.get("id"))
.map(|x| match x {
serde_json::Value::String(s) => s.clone(),
other => other.to_string().trim_matches('"').to_string(),
})
})
.clone()
}