From 656048a0ad30e9b9a8268b08af2cf6711e6ee517 Mon Sep 17 00:00:00 2001 From: Hare Date: Tue, 9 Jun 2026 21:38:12 +0900 Subject: [PATCH] test: cover project role feature profiles --- crates/manifest/src/profile.rs | 106 +++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/crates/manifest/src/profile.rs b/crates/manifest/src/profile.rs index 640ec153..ef07233d 100644 --- a/crates/manifest/src/profile.rs +++ b/crates/manifest/src/profile.rs @@ -1818,6 +1818,112 @@ language = "nested" assert!(matches!(err, ProfileError::UnsupportedProfileType { .. })); assert!(err.to_string().contains("Lua profiles must end in .lua")); } + #[test] + fn actual_project_role_profiles_resolve_explicit_feature_defaults() { + let tmp = TempDir::new().unwrap(); + let workspace = tmp.path().join("workspace"); + let profiles_dir = tmp.path().join(".yoi/profiles"); + std::fs::create_dir_all(&workspace).unwrap(); + std::fs::create_dir_all(&profiles_dir).unwrap(); + for (name, content) in [ + ( + "_base.lua", + include_str!("../../../.yoi/profiles/_base.lua"), + ), + ( + "coder.lua", + include_str!("../../../.yoi/profiles/coder.lua"), + ), + ( + "intake.lua", + include_str!("../../../.yoi/profiles/intake.lua"), + ), + ( + "orchestrator.lua", + include_str!("../../../.yoi/profiles/orchestrator.lua"), + ), + ( + "reviewer.lua", + include_str!("../../../.yoi/profiles/reviewer.lua"), + ), + ( + "companion.lua", + include_str!("../../../.yoi/profiles/companion.lua"), + ), + ] { + std::fs::write(profiles_dir.join(name), content).unwrap(); + } + + struct Expected { + role: &'static str, + ticket: bool, + ticket_orchestration: bool, + pods: bool, + } + + for expected in [ + Expected { + role: "orchestrator", + ticket: true, + ticket_orchestration: true, + pods: true, + }, + Expected { + role: "coder", + ticket: false, + ticket_orchestration: false, + pods: false, + }, + Expected { + role: "intake", + ticket: true, + ticket_orchestration: false, + pods: false, + }, + Expected { + role: "reviewer", + ticket: false, + ticket_orchestration: false, + pods: false, + }, + Expected { + role: "companion", + ticket: false, + ticket_orchestration: false, + pods: false, + }, + ] { + let resolved = ProfileResolver::new() + .with_workspace_base(&workspace) + .resolve( + &ProfileSelector::path(profiles_dir.join(format!("{}.lua", expected.role))), + ProfileResolveOptions::with_pod_name(format!("{}-pod", expected.role)), + ) + .unwrap(); + let feature = &resolved.manifest.feature; + assert!( + !feature.task.enabled, + "{} profile must explicitly keep Task tools disabled", + expected.role + ); + assert_eq!( + feature.ticket.enabled, expected.ticket, + "{} ticket feature default mismatch", + expected.role + ); + assert_eq!( + feature.ticket_orchestration.enabled, expected.ticket_orchestration, + "{} ticket orchestration feature default mismatch", + expected.role + ); + assert_eq!( + feature.pods.enabled, expected.pods, + "{} Pod feature default mismatch", + expected.role + ); + } + } + #[test] fn discovery_reads_user_and_project_registry_and_project_default_wins() { let tmp = TempDir::new().unwrap();