Skip to content

Commit bf04cd3

Browse files
Merge branch 'main' into pr-424
2 parents bf50cb3 + b38b093 commit bf04cd3

11 files changed

Lines changed: 1323 additions & 231 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,6 @@ tests/mockdd/mockdd
3636
tests/compare_bin
3737
tests/gen_commands_bin
3838
/tmp/
39+
40+
# worktrees
41+
.claude/worktrees/

src/client.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,9 @@ static UNSTABLE_OPS: &[&str] = &[
227227
"v2.activate_content_pack",
228228
"v2.deactivate_content_pack",
229229
"v2.get_content_packs_states",
230+
// Indicators of Compromise (2)
231+
"v2.list_indicators_of_compromise",
232+
"v2.get_indicator_of_compromise",
230233
// Code Coverage (2)
231234
"v2.get_code_coverage_branch_summary",
232235
"v2.get_code_coverage_commit_summary",
@@ -1018,7 +1021,7 @@ mod tests {
10181021

10191022
#[test]
10201023
fn test_unstable_ops_count() {
1021-
assert_eq!(UNSTABLE_OPS.len(), 150);
1024+
assert_eq!(UNSTABLE_OPS.len(), 152);
10221025
}
10231026

10241027
#[test]

src/commands/api_keys.rs

Lines changed: 124 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,33 +54,151 @@ mod tests {
5454

5555
use crate::test_support::*;
5656

57+
// -----------------------------------------------------------------------
58+
// list()
59+
// -----------------------------------------------------------------------
60+
5761
#[tokio::test]
58-
async fn test_api_keys_list() {
62+
async fn test_api_keys_list_success() {
5963
let _lock = lock_env().await;
6064
let mut s = mockito::Server::new_async().await;
6165
let cfg = test_config(&s.url());
6266
mock_all(&mut s, r#"{"data": []}"#).await;
63-
let _ = super::list(&cfg).await;
67+
let result = super::list(&cfg).await;
68+
assert!(result.is_ok(), "list should succeed: {:?}", result.err());
69+
cleanup_env();
70+
}
71+
72+
#[tokio::test]
73+
async fn test_api_keys_list_error_403() {
74+
let _lock = lock_env().await;
75+
let mut server = mockito::Server::new_async().await;
76+
let cfg = test_config(&server.url());
77+
let _mock = server
78+
.mock("GET", mockito::Matcher::Any)
79+
.with_status(403)
80+
.with_header("content-type", "application/json")
81+
.with_body(r#"{"errors":["Forbidden"]}"#)
82+
.create_async()
83+
.await;
84+
let result = super::list(&cfg).await;
85+
assert!(result.is_err(), "expected error on 403");
86+
let err_msg = result.unwrap_err().to_string();
87+
assert!(
88+
err_msg.contains("failed to list API keys"),
89+
"error should mention failed listing: {err_msg}"
90+
);
6491
cleanup_env();
6592
}
6693

94+
// -----------------------------------------------------------------------
95+
// get()
96+
// -----------------------------------------------------------------------
97+
6798
#[tokio::test]
68-
async fn test_api_keys_get() {
99+
async fn test_api_keys_get_success() {
69100
let _lock = lock_env().await;
70101
let mut s = mockito::Server::new_async().await;
71102
let cfg = test_config(&s.url());
72103
mock_all(&mut s, r#"{"data": {}}"#).await;
73-
let _ = super::get(&cfg, "k1").await;
104+
let result = super::get(&cfg, "key-id-123").await;
105+
assert!(result.is_ok(), "get should succeed: {:?}", result.err());
106+
cleanup_env();
107+
}
108+
109+
#[tokio::test]
110+
async fn test_api_keys_get_error_404() {
111+
let _lock = lock_env().await;
112+
let mut server = mockito::Server::new_async().await;
113+
let cfg = test_config(&server.url());
114+
let _mock = server
115+
.mock("GET", mockito::Matcher::Any)
116+
.with_status(404)
117+
.with_header("content-type", "application/json")
118+
.with_body(r#"{"errors":["Not Found"]}"#)
119+
.create_async()
120+
.await;
121+
let result = super::get(&cfg, "missing").await;
122+
assert!(result.is_err(), "expected error on 404");
123+
let err_msg = result.unwrap_err().to_string();
124+
assert!(
125+
err_msg.contains("failed to get API key"),
126+
"error should mention failed get: {err_msg}"
127+
);
74128
cleanup_env();
75129
}
76130

131+
// -----------------------------------------------------------------------
132+
// create()
133+
// -----------------------------------------------------------------------
134+
77135
#[tokio::test]
78-
async fn test_api_keys_delete() {
136+
async fn test_api_keys_create_success() {
137+
let _lock = lock_env().await;
138+
let mut s = mockito::Server::new_async().await;
139+
let cfg = test_config(&s.url());
140+
mock_all(&mut s, r#"{"data": {"id":"k1","type":"api_keys"}}"#).await;
141+
let result = super::create(&cfg, "my-new-key").await;
142+
assert!(result.is_ok(), "create should succeed: {:?}", result.err());
143+
cleanup_env();
144+
}
145+
146+
#[tokio::test]
147+
async fn test_api_keys_create_error_400() {
148+
let _lock = lock_env().await;
149+
let mut server = mockito::Server::new_async().await;
150+
let cfg = test_config(&server.url());
151+
let _mock = server
152+
.mock("POST", mockito::Matcher::Any)
153+
.with_status(400)
154+
.with_header("content-type", "application/json")
155+
.with_body(r#"{"errors":["Invalid name"]}"#)
156+
.create_async()
157+
.await;
158+
let result = super::create(&cfg, "").await;
159+
assert!(result.is_err(), "expected error on 400");
160+
let err_msg = result.unwrap_err().to_string();
161+
assert!(
162+
err_msg.contains("failed to create API key"),
163+
"error should mention failed create: {err_msg}"
164+
);
165+
cleanup_env();
166+
}
167+
168+
// -----------------------------------------------------------------------
169+
// delete()
170+
// -----------------------------------------------------------------------
171+
172+
#[tokio::test]
173+
async fn test_api_keys_delete_success() {
79174
let _lock = lock_env().await;
80175
let mut s = mockito::Server::new_async().await;
81176
let cfg = test_config(&s.url());
82177
mock_all(&mut s, r#"{}"#).await;
83-
let _ = super::delete(&cfg, "k1").await;
178+
let result = super::delete(&cfg, "k1").await;
179+
assert!(result.is_ok(), "delete should succeed: {:?}", result.err());
180+
cleanup_env();
181+
}
182+
183+
#[tokio::test]
184+
async fn test_api_keys_delete_error_404() {
185+
let _lock = lock_env().await;
186+
let mut server = mockito::Server::new_async().await;
187+
let cfg = test_config(&server.url());
188+
let _mock = server
189+
.mock("DELETE", mockito::Matcher::Any)
190+
.with_status(404)
191+
.with_header("content-type", "application/json")
192+
.with_body(r#"{"errors":["Not Found"]}"#)
193+
.create_async()
194+
.await;
195+
let result = super::delete(&cfg, "nope").await;
196+
assert!(result.is_err(), "expected error on 404");
197+
let err_msg = result.unwrap_err().to_string();
198+
assert!(
199+
err_msg.contains("failed to delete API key"),
200+
"error should mention failed delete: {err_msg}"
201+
);
84202
cleanup_env();
85203
}
86204
}

0 commit comments

Comments
 (0)