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")); } }