Files
Omika/tests/Omika.Tests/Mobile/Local/ThemeServiceTests.cs
T
2026-10-23 18:46:50 +02:00

159 lines
4.9 KiB
C#

using Omika.App.Local.Models;
using Omika.App.Local.Repositories;
using Omika.App.Services;
namespace Omika.Tests.Mobile.Local;
/// <summary>
/// Tests du service de thème : mode clair/sombre/système, couleur principale,
/// persistance locale et restauration au démarrage.
/// </summary>
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<ArgumentException>(() => _themeService.SetPrimaryColorAsync("pas-une-couleur"));
}
}