fix(frontend,application,backend,web-server,infrastructure): le set de couleurs projet s'applique à tous les projets — #316 (QA verte)
Cause: update_project_settings remplaçait tout ProjectSettings avec la seule couleur fournie — champ absent et null indistinguables — et des réponses de chargement/sauvegarde obsolètes d'un projet précédent pouvaient réafficher/écraser la couleur lors d'un changement de projet rapide, d'où l'impression que la couleur ne prenait pas sur tous les projets. - DTO tri-état (absent = inchangé, null = défaut produit) avec Deserialize manuel et use case de mise à jour partielle du champ theme_color; commandes Tauri et web-server alignées sur le même contrat. - Garde-fous de course frontend: séquences load/save + révision thème par projet (pub/sub onProjectThemeChanged) dans ProjectSettingsPanel, garde de révision de focus dans ViewWindow. - Tests: infrastructure settings, contrats web-server (inchangé/reset), ProjectSettingsPanel, ViewWindow, projects. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -62,9 +62,46 @@ async fn project_settings_missing_then_valid_round_trip() {
|
||||
};
|
||||
store.save(&tmp.root(), &settings).await.unwrap();
|
||||
assert_eq!(store.load(&tmp.root()).await.unwrap(), settings);
|
||||
assert_eq!(
|
||||
std::fs::read_to_string(tmp.0.join(".ideai/project-settings.json")).unwrap(),
|
||||
"{\n \"themeColor\": \"#12AbEF\"\n}\n"
|
||||
);
|
||||
assert!(!tmp.0.join(".ideai/CONTEXT.md").exists());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn project_settings_are_isolated_and_missing_defaults_are_not_persisted() {
|
||||
let first = TempDir::new();
|
||||
let second = TempDir::new();
|
||||
let store = FsProjectSettingsStore::new(fs());
|
||||
|
||||
store
|
||||
.save(
|
||||
&first.root(),
|
||||
&ProjectSettings {
|
||||
theme_color: Some(ThemeColor::new("#AA3366").unwrap()),
|
||||
},
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(
|
||||
store.load(&second.root()).await.unwrap(),
|
||||
ProjectSettings::default()
|
||||
);
|
||||
assert!(!second.0.join(".ideai/project-settings.json").exists());
|
||||
assert_eq!(
|
||||
store
|
||||
.load(&first.root())
|
||||
.await
|
||||
.unwrap()
|
||||
.theme_color
|
||||
.as_ref()
|
||||
.map(ThemeColor::as_str),
|
||||
Some("#AA3366")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn theme_color_validation_is_strict() {
|
||||
assert!(ThemeColor::new("#112233").is_ok());
|
||||
|
||||
Reference in New Issue
Block a user