using Omika.App.Local.Models; using Omika.App.Local.Repositories; using Omika.App.Services; namespace Omika.Tests.Mobile.Local; /// /// Tests du service de thème : mode clair/sombre/système, couleur principale, /// persistance locale et restauration au démarrage. /// public class ThemeServiceTests : LocalTestBase { private readonly UiPreferencesRepository _preferencesRepository; private readonly ThemeService _themeService; public ThemeServiceTests() { _preferencesRepository = new UiPreferencesRepository(Database); _themeService = new ThemeService(_preferencesRepository); } [Fact] public async Task Defaut_System_et_CouleurParDefaut() { // Act await _themeService.InitializeAsync(); // Assert Assert.Equal(ThemeMode.System, _themeService.CurrentMode); Assert.Equal(ThemeService.DefaultPrimaryColor, _themeService.PrimaryColor); } [Fact] public async Task PassageDark_Persiste() { // Arrange await _themeService.InitializeAsync(); // Act await _themeService.SetThemeModeAsync(ThemeMode.Dark); // Assert : le mode courant est Dark. Assert.Equal(ThemeMode.Dark, _themeService.CurrentMode); // Assert : la préférence est persistée. UiPreferences saved = await _preferencesRepository.GetAsync(); Assert.Equal("Dark", saved.ThemeMode); } [Fact] public async Task Persistance_RestaurationAuDemarrage() { // Arrange : définir Dark + une couleur, puis recréer le service. await _themeService.InitializeAsync(); await _themeService.SetThemeModeAsync(ThemeMode.Dark); await _themeService.SetPrimaryColorAsync("#2563eb"); var freshService = new ThemeService(_preferencesRepository); // Act await freshService.InitializeAsync(); // Assert : les préférences sont restaurées. Assert.Equal(ThemeMode.Dark, freshService.CurrentMode); Assert.Equal("#2563eb", freshService.PrimaryColor); } [Fact] public async Task CouleurPrincipale_ChangeEtPersiste() { // Arrange await _themeService.InitializeAsync(); // Act await _themeService.SetPrimaryColorAsync("#0d9488"); // Assert Assert.Equal("#0d9488", _themeService.PrimaryColor); UiPreferences saved = await _preferencesRepository.GetAsync(); Assert.Equal("#0d9488", saved.PrimaryColor); } [Fact] public async Task CouleurPrincipale_Restauree() { // Arrange await _themeService.InitializeAsync(); await _themeService.SetPrimaryColorAsync("#7c3aed"); var freshService = new ThemeService(_preferencesRepository); // Act await freshService.InitializeAsync(); // Assert Assert.Equal("#7c3aed", freshService.PrimaryColor); } [Fact] public async Task ConfigInvalide_FallbackSur() { // Arrange : enregistrer une valeur invalide directement dans le repository. await _preferencesRepository.SaveAsync(new UiPreferences { ThemeMode = "Neon", PrimaryColor = "pas-une-couleur" }); // Act await _themeService.InitializeAsync(); // Assert : fallback sûr vers System + couleur par défaut. Assert.Equal(ThemeMode.System, _themeService.CurrentMode); Assert.Equal(ThemeService.DefaultPrimaryColor, _themeService.PrimaryColor); } [Fact] public void ParseThemeMode_ValeursConnues() { Assert.Equal(ThemeMode.Light, ThemeService.ParseThemeMode("Light")); Assert.Equal(ThemeMode.Dark, ThemeService.ParseThemeMode("Dark")); Assert.Equal(ThemeMode.System, ThemeService.ParseThemeMode("System")); } [Fact] public void ParseThemeMode_ValeurInconnue_FallbackSystem() { Assert.Equal(ThemeMode.System, ThemeService.ParseThemeMode("Inconnu")); Assert.Equal(ThemeMode.System, ThemeService.ParseThemeMode(null)); Assert.Equal(ThemeMode.System, ThemeService.ParseThemeMode("")); } [Fact] public void IsValidHexColor_Valide() { Assert.True(ThemeService.IsValidHexColor("#4f46e5")); Assert.True(ThemeService.IsValidHexColor("#4F46E5")); Assert.True(ThemeService.IsValidHexColor("#4f46e5ff")); } [Fact] public void IsValidHexColor_Invalide() { Assert.False(ThemeService.IsValidHexColor(null)); Assert.False(ThemeService.IsValidHexColor("")); Assert.False(ThemeService.IsValidHexColor("#12345")); Assert.False(ThemeService.IsValidHexColor("#gggggg")); Assert.False(ThemeService.IsValidHexColor("rouge")); } [Fact] public async Task SetPrimaryColor_Invalide_LeveException() { // Act / Assert await Assert.ThrowsAsync(() => _themeService.SetPrimaryColorAsync("pas-une-couleur")); } }