159 lines
4.9 KiB
C#
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"));
|
|
}
|
|
|
|
}
|