namespace Ludarium.E2E; public sealed class AdminTokenPolicyTests { [Theory] [InlineData(null, false)] [InlineData("", false)] [InlineData("change-me-to-a-longer-placeholder-token", false)] [InlineData("0123456789abcdef0123456789abcdef", true)] public void ProductionTokenConfigurationMustBeLongAndNonPlaceholder(string? token, bool expected) { Assert.Equal(expected, AdminTokenPolicy.IsAcceptableConfiguration(token)); } [Theory] [InlineData("Bearer release-candidate-secret")] [InlineData("bearer release-candidate-secret")] public void ExactBearerTokenIsAccepted(string header) { Assert.True(AdminTokenPolicy.Authorizes(header, "release-candidate-secret")); } [Theory] [InlineData(null)] [InlineData("")] [InlineData("release-candidate-secret")] [InlineData("Basic release-candidate-secret")] [InlineData("Bearer release-candidate-secret ")] [InlineData("Bearer release-candidate-secreu")] [InlineData("Bearer release-candidate-secret, Bearer second")] public void MissingMalformedAndDifferentTokensAreRejected(string? header) { Assert.False(AdminTokenPolicy.Authorizes(header, "release-candidate-secret")); } [Theory] [InlineData("/api/v1/play-sessions/00000000-0000-0000-0000-000000000001/content")] [InlineData("/api/v1/play-sessions/00000000-0000-0000-0000-000000000001/firmware")] [InlineData("/api/v1/play-sessions/00000000-0000-0000-0000-000000000001/cheats")] [InlineData("/api/v1/play-sessions/00000000-0000-0000-0000-000000000001/data/Save")] public void SessionTokenReadRoutesBypassOnlyTheGlobalAdminToken(string path) { Assert.True(AdminTokenPolicy.IsScopedPlayerRead(path)); } [Theory] [InlineData("/api/v1/play-sessions/00000000-0000-0000-0000-000000000001")] [InlineData("/api/v1/play-sessions/00000000-0000-0000-0000-000000000001/cheats/extra")] [InlineData("/api/v1/games/00000000-0000-0000-0000-000000000001/play-sessions")] public void OtherPlayerRoutesStillRequireTheAdminToken(string path) { Assert.False(AdminTokenPolicy.IsScopedPlayerRead(path)); } }