// file: crates/ksp-app-config-desk/unit_tests/logging_editor.rs // version: 2 #[test] fn committed_logging_document_maps_complete_read_only_editor_contract() { let management = committed_management(); assert!(management.is_ok(), "committed management should construct: {management:?}"); if let std::result::Result::Ok(management) = management { let document = super::document_from_management(&management); assert!(document.is_ok(), "Logging editor document should load: {document:?}"); if let std::result::Result::Ok(document) = document { assert_eq!(document.file_id, ksp_config_lib::FILE_ID_STD_LOGGING); assert_eq!(document.format_version, 1); assert_eq!(document.logs_directory, "${KSP_LOGS_DIRECTORY:-logs}"); assert_eq!(document.default_profile, "local_dev"); assert_eq!(document.profiles.len(), 1); let profile = &document.profiles[0]; assert_eq!(profile.profile_id, "local_dev"); assert_eq!(profile.default_filter, "warn"); assert_eq!(profile.span_events, "new_and_close"); assert!(profile.console.enabled); assert_eq!(profile.console.output, "stderr"); assert_eq!(profile.console.format, "compact"); assert_eq!(profile.console.filter.level, "debug"); assert_eq!(profile.console.filter.targets, std::vec!["*".to_owned()]); assert_eq!(profile.console.filter.domains, std::vec!["*".to_owned()]); assert_eq!(profile.files.len(), 2); assert_eq!(profile.files[0].output_id, "file.all.debug"); assert_eq!(profile.files[0].filter.targets, std::vec!["*".to_owned()]); assert_eq!(profile.files[0].filter.domains, std::vec!["*".to_owned()]); assert_eq!(profile.target_filters.len(), 3); assert_eq!(profile.target_filters[2].target_prefix, "ksp-app-config-desk"); assert_eq!(profile.target_filters[2].level, "debug"); } } } #[test] fn logging_editor_mapping_preserves_multiple_targets_and_domains() { let filter = ksp_config_lib::LoggingOutputFilterConfig::new( "trace", std::vec!["ksp-config-lib".to_owned(), "ksp-app-config-desk".to_owned()], std::vec!["config".to_owned(), "frontend".to_owned()], ); let mapped = super::project_output_filter(&filter); assert_eq!(mapped.level, "trace"); assert_eq!(mapped.targets, std::vec!["ksp-config-lib".to_owned(), "ksp-app-config-desk".to_owned()]); assert_eq!(mapped.domains, std::vec!["config".to_owned(), "frontend".to_owned()]); } fn committed_management() -> ksp_core_lib::Result { let workspace = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../.."); let bootstrap = ksp_config_lib::ConfigBootstrapOptions::from_paths(workspace.join("config"), workspace.join("config/schemas")); let bootstrap = match bootstrap { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; let registry = ksp_config_lib::ConfigFileRegistry::defaults(); let registry = match registry { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; return std::result::Result::Ok(ksp_config_lib::ConfigManagement::new(ksp_config_lib::ConfigDocumentEngine::new(bootstrap, registry))); } #[test] fn editor_candidate_round_trips_through_typed_config_contract() { let management = committed_management(); assert!(management.is_ok(), "committed management should construct: {management:?}"); if let std::result::Result::Ok(management) = management { let document = super::document_from_management(&management); assert!(document.is_ok(), "Logging editor document should load: {document:?}"); if let std::result::Result::Ok(document) = document { let candidate = super::LoggingDocumentCandidateDto { logs_directory: document.logs_directory.clone(), default_profile: document.default_profile.clone(), profiles: document.profiles.clone(), }; let config = super::config_candidate(candidate); assert_eq!(config.logs_directory(), document.logs_directory); assert_eq!(config.default_profile(), document.default_profile); assert_eq!(config.profiles().len(), document.profiles.len()); assert_eq!(config.profiles()[0].files()[0].ansi(), document.profiles[0].files[0].ansi); } } } #[test] fn profile_candidate_preserves_multi_file_and_target_filter_shape() { let profile = super::LoggingProfileDto { profile_id: "clone_test".to_owned(), default_filter: "info".to_owned(), span_events: "full".to_owned(), console: super::LoggingConsoleDto { enabled: true, output: "stdout".to_owned(), ansi: false, format: "human".to_owned(), filter: super::LoggingOutputFilterDto { level: "info".to_owned(), targets: std::vec!["*".to_owned()], domains: std::vec!["*".to_owned()] }, }, files: std::vec![ super::LoggingFileDto { output_id: "file.one".to_owned(), enabled: true, path: "one.log".to_owned(), rotation: "daily".to_owned(), format: "human".to_owned(), ansi: false, filter: super::LoggingOutputFilterDto { level: "debug".to_owned(), targets: std::vec!["*".to_owned()], domains: std::vec!["*".to_owned()] }, }, super::LoggingFileDto { output_id: "file.two".to_owned(), enabled: false, path: "two.jsonl".to_owned(), rotation: "hourly".to_owned(), format: "json".to_owned(), ansi: false, filter: super::LoggingOutputFilterDto { level: "error".to_owned(), targets: std::vec!["ksp-config-lib".to_owned()], domains: std::vec!["config".to_owned()], }, }, ], target_filters: std::vec![super::LoggingTargetFilterDto { target_prefix: "ksp-app-config-desk".to_owned(), level: "trace".to_owned() }], }; let config = super::config_profile(profile); assert_eq!(config.profile_id(), "clone_test"); assert_eq!(config.files().len(), 2); assert_eq!(config.files()[1].rotation(), "hourly"); assert_eq!(config.target_filters().len(), 1); assert_eq!(config.target_filters()[0].level(), "trace"); }