Files
mabibli/MaBibli.Tests/VersionApplicationTests.cs
T
Mathieu LimonierandClaude Opus 5 6a6d745af4 MaBibli 1.0.0
Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts,
scan de code-barres, consultation hors-ligne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:36:16 +02:00

96 lines
3.7 KiB
C#

using System.Reflection;
using MaBibli.Api.Endpoints;
using MaBibli.Shared.Dtos;
namespace MaBibli.Tests;
/// <summary>
/// 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.
/// </summary>
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());
}
/// <summary>
/// ⚠️ 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.
/// </summary>
[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);
/// <summary>Un horodatage sans version n'est pas une version : on n'invente pas le numéro.</summary>
[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);
/// <summary>
/// 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.
/// </summary>
[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);
/// <summary>Une date locale injectée est ramenée en UTC, comme toutes les dates du projet.</summary>
[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());
/// <summary>
/// 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.
/// </summary>
[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);
}
/// <summary>Une métadonnée bien nommée est bien lue, quel que soit l'assembly qui la porte.</summary>
[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<AssemblyMetadataAttribute>()
.FirstOrDefault(a => a.Key == "MaBibliDateBuild"));
}
}