feat(admin): show deployed app version
CI and Deploy / test (pull_request) Successful in 4m48s
CI and Deploy / deploy (pull_request) Has been skipped

This commit is contained in:
cesnimda
2026-08-15 16:47:43 +02:00
parent 6b02e3f5d1
commit a6cffe0473
9 changed files with 175 additions and 22 deletions
@@ -919,6 +919,60 @@ public sealed class AuthAndSystemControllerTests
Assert.Equal("person@example.com", result.GoogleLink.Email);
}
[Fact]
public async Task Me_result_includes_configured_build_metadata()
{
var user = new ApplicationUser { Id = "admin-1", Email = "admin@example.com", UserName = "admin" };
var users = CreateUserManager();
users.Setup(x => x.GetUserAsync(It.IsAny<System.Security.Claims.ClaimsPrincipal>())).ReturnsAsync(user);
users.Setup(x => x.GetRolesAsync(user)).ReturnsAsync(new List<string> { "Admin" });
var cfg = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>
{
["App:Version"] = "2.4.1",
["App:CommitSha"] = "abc1234",
})
.Build();
var controller = new AuthController(cfg, users.Object, Mock.Of<ITokenService>(), Mock.Of<IAppEmailSender>(), Mock.Of<IGoogleTokenValidator>(), Mock.Of<IMicrosoftTokenValidator>(), NullLogger<AuthController>.Instance, Mock.Of<ITwoFactorPendingTokenService>(), TestHostFactory.CreateInMemoryDb())
{
ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }
};
var response = await controller.Me(CancellationToken.None);
var ok = Assert.IsType<OkObjectResult>(response);
var result = Assert.IsType<AuthController.MeResult>(ok.Value);
Assert.Equal("2.4.1", result.AppVersion);
Assert.Equal("abc1234", result.AppCommitSha);
}
[Fact]
public async Task Me_result_limits_build_metadata_to_admins()
{
var user = new ApplicationUser { Id = "user-1", Email = "person@example.com", UserName = "person" };
var users = CreateUserManager();
users.Setup(x => x.GetUserAsync(It.IsAny<System.Security.Claims.ClaimsPrincipal>())).ReturnsAsync(user);
users.Setup(x => x.GetRolesAsync(user)).ReturnsAsync(new List<string>());
var cfg = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>
{
["App:Version"] = "2.4.1",
["App:CommitSha"] = "abc1234",
})
.Build();
var controller = new AuthController(cfg, users.Object, Mock.Of<ITokenService>(), Mock.Of<IAppEmailSender>(), Mock.Of<IGoogleTokenValidator>(), Mock.Of<IMicrosoftTokenValidator>(), NullLogger<AuthController>.Instance, Mock.Of<ITwoFactorPendingTokenService>(), TestHostFactory.CreateInMemoryDb())
{
ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }
};
var response = await controller.Me(CancellationToken.None);
var ok = Assert.IsType<OkObjectResult>(response);
var result = Assert.IsType<AuthController.MeResult>(ok.Value);
Assert.Equal("unknown", result.AppVersion);
Assert.Null(result.AppCommitSha);
}
[Fact]
public async Task Admin_system_email_settings_falls_back_when_override_store_is_unavailable()
{