let test_bot_config_from_toml () = let toml_content = {| name = "Test Bot" version = "1.0" [bot] api_key = "test-key" timeout = 30 enabled = true [features] caching = false |} in let temp_file = Filename.temp_file "bot_config" ".toml" in let oc = open_out temp_file in output_string oc toml_content; close_out oc; (match Zulip_bot.Bot_config.from_file temp_file with | Ok config -> Alcotest.(check (option string)) "name" (Some "Test Bot") (Zulip_bot.Bot_config.get config ~key:"name"); Alcotest.(check (option string)) "version" (Some "1.0") (Zulip_bot.Bot_config.get config ~key:"version"); Alcotest.(check (option string)) "api_key" (Some "test-key") (Zulip_bot.Bot_config.get config ~key:"api_key"); Alcotest.(check (option string)) "timeout" (Some "30") (Zulip_bot.Bot_config.get config ~key:"timeout"); Alcotest.(check (option string)) "enabled" (Some "true") (Zulip_bot.Bot_config.get config ~key:"enabled"); Alcotest.(check (option string)) "caching" (Some "false") (Zulip_bot.Bot_config.get config ~key:"caching"); Sys.remove temp_file | Error err -> Sys.remove temp_file; Alcotest.fail ("Failed to parse bot config TOML: " ^ Zulip.Error.message err)) let test_bot_config_required_key () = let config = Zulip_bot.Bot_config.create [ ("required_key", "present"); ("optional_key", "also_present"); ] in (match Zulip_bot.Bot_config.get_required config ~key:"required_key" with | Ok value -> Alcotest.(check string) "required value" "present" value | Error _ -> Alcotest.fail "Should have found required key"); (match Zulip_bot.Bot_config.get_required config ~key:"missing_key" with | Ok _ -> Alcotest.fail "Should have failed for missing key" | Error err -> Alcotest.(check bool) "has missing key error" true (String.contains (Zulip.Error.message err) 'm')) let test_bot_config_env_vars () = (* Set some test environment variables *) Unix.putenv "BOT_API_KEY" "env-test-key"; Unix.putenv "BOT_TIMEOUT" "45"; Unix.putenv "OTHER_VAR" "should-be-ignored"; (match Zulip_bot.Bot_config.from_env ~prefix:"BOT_" with | Ok config -> Alcotest.(check (option string)) "api_key from env" (Some "env-test-key") (Zulip_bot.Bot_config.get config ~key:"API_KEY"); Alcotest.(check (option string)) "timeout from env" (Some "45") (Zulip_bot.Bot_config.get config ~key:"TIMEOUT"); Alcotest.(check (option string)) "other var not included" None (Zulip_bot.Bot_config.get config ~key:"OTHER_VAR") | Error err -> Alcotest.fail ("Failed to read environment config: " ^ Zulip.Error.message err)) let () = let open Alcotest in run "Bot Config Tests" [ "bot_config", [ test_case "Parse bot config TOML" `Quick test_bot_config_from_toml; test_case "Required vs optional keys" `Quick test_bot_config_required_key; test_case "Environment variable config" `Quick test_bot_config_env_vars; ]; ]