using System.Reflection;
using MaBibli.Api.Endpoints;
using MaBibli.Shared.Dtos;
namespace MaBibli.Tests;
///
/// La version affichée par « À propos » est ce qu'on demandera à quelqu'un dont l'application se
/// comporte mal : elle doit être exacte ou absente, jamais approximative.
///
public class VersionApplicationTests
{
[Fact]
public void Version_et_horodatage_injectes_donnent_une_version_publiee()
{
var version = VersionApplication.Depuis("0.4.0", "2026-08-21T10:30:00Z");
Assert.True(version.Publiee);
Assert.Equal("0.4.0", version.Numero);
Assert.Equal(
new DateTimeOffset(2026, 8, 21, 10, 30, 0, TimeSpan.Zero),
version.DateBuild!.Value.ToUniversalTime());
}
///
/// ⚠️ Le cas qui justifie tout le mécanisme : sans injection, le SDK .NET pose « 1.0.0 »
/// dans l'assembly. Ce numéro se lirait comme une vraie version alors qu'il ne désigne rien.
///
[Fact]
public void Sans_horodatage_le_numero_du_SDK_nest_PAS_annonce()
{
var version = VersionApplication.Depuis("1.0.0", null);
Assert.False(version.Publiee);
Assert.Null(version.Numero);
Assert.Null(version.DateBuild);
}
[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData("pas une date")]
public void Un_horodatage_illisible_vaut_absence(string horodatage) =>
Assert.False(VersionApplication.Depuis("0.4.0", horodatage).Publiee);
/// Un horodatage sans version n'est pas une version : on n'invente pas le numéro.
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Sans_numero_rien_nest_annonce(string? numero) =>
Assert.False(VersionApplication.Depuis(numero, "2026-08-21T10:30:00Z").Publiee);
///
/// Le SDK ajoute parfois « +empreinte » à l'InformationalVersion (SourceRevisionId) : seule
/// la partie qui précède le « + » est un numéro de version lisible par un humain.
///
[Fact]
public void L_empreinte_de_commit_est_retiree() =>
Assert.Equal(
"0.4.0",
VersionApplication.Depuis("0.4.0+9a3f21c", "2026-08-21T10:30:00Z").Numero);
/// Une date locale injectée est ramenée en UTC, comme toutes les dates du projet.
[Fact]
public void L_horodatage_est_ramene_en_UTC() =>
Assert.Equal(
new DateTimeOffset(2026, 8, 21, 8, 30, 0, TimeSpan.Zero),
VersionApplication.Depuis("0.4.0", "2026-08-21T10:30:00+02:00")!.DateBuild!.Value.ToUniversalTime());
///
/// La lecture des attributs est branchée sur le bon assembly. Les tests ne sont pas compilés
/// par la chaîne de publication : elle doit donc rendre « version de développement », ce qui
/// est exactement le comportement attendu d'un binaire compilé à la main.
///
[Fact]
public void La_lecture_de_lassembly_ne_leve_rien_et_ne_publie_rien()
{
var version = VersionEndpoints.Lire(typeof(VersionEndpoints).Assembly);
Assert.False(version.Publiee);
}
/// Une métadonnée bien nommée est bien lue, quel que soit l'assembly qui la porte.
[Fact]
public void La_metadonnee_MaBibliDateBuild_est_celle_qui_est_lue()
{
var assembly = typeof(VersionApplicationTests).Assembly;
// Aucun assembly de test ne la porte : la lecture doit rendre null, pas la première
// métadonnée venue (elles sont nombreuses, posées par le SDK).
Assert.Null(assembly.GetCustomAttributes()
.FirstOrDefault(a => a.Key == "MaBibliDateBuild"));
}
}