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