use crate::cli::{CliCommandRegistration, CliHandlerRegistration};
use crate::init_all_plugins;
use crate::prelude::ApiError;
use sdforge_macros::service_api;
#[service_api(name = "t010_init_cmd", version = "v1", cli = true)]
async fn t010_init_cmd() -> Result<String, ApiError> {
Ok("ok".to_string())
}
#[test]
#[serial_test::serial]
fn test_init_all_plugins_registers_cli_commands() {
let counts = init_all_plugins();
let cli_count: usize = counts.cli_commands;
assert!(
cli_count >= 1,
"expected at least one CLI command registered after init_all_plugins, got {}",
cli_count
);
let cmd = inventory::iter::<CliCommandRegistration>()
.find(|c| c.name == "t010_init_cmd")
.expect("t010_init_cmd must be linked after init_all_plugins");
assert_eq!(cmd.version, "v1");
let handler = inventory::iter::<CliHandlerRegistration>()
.find(|h| h.name == "t010_init_cmd")
.expect("t010_init_cmd handler must be linked after init_all_plugins");
let _ = handler.handler;
}
#[test]
#[serial_test::serial]
fn test_init_all_plugins_cli_count_is_idempotent() {
let first = init_all_plugins();
let second = init_all_plugins();
assert_eq!(
first.cli_commands, second.cli_commands,
"init_all_plugins must return stable cli_commands counts across calls"
);
}
#[cfg(feature = "docs")]
#[test]
#[serial_test::serial]
fn test_init_all_plugins_with_docs_feature_keeps_cli_inventory() {
let counts = init_all_plugins();
assert!(
counts.cli_commands >= 1,
"init_all_plugins must still link CLI inventory under docs feature, got {}",
counts.cli_commands
);
use crate::cli::CliBuilder;
let cmd = CliBuilder::new().build();
assert!(
cmd.find_subcommand("docs").is_some(),
"CliBuilder::build() must include `docs` subcommand when docs feature is enabled"
);
}