using System.Text.Json; namespace FinalFactory.Rendezvous.Tests.Contracts; public sealed class OpenApiCompatibilityTests { private static readonly string[] ExpectedPaths = [ "/health/live", "/health/ready", "/v1/join-attempts", "/v1/join-attempts/{attemptId}/outcome", "/v1/sessions", "/v1/sessions/{listingId}", "/v1/sessions/{listingId}/join-attempts", "/v1/sessions/{listingId}/renew", ]; private static readonly string[] ExpectedListingProperties = [ "buildVersion", "capacity", "contractVersion", "displayName", "environmentId", "gameId", "listingId", "metadata", "protocolVersion", "publisherTrustMode", "regionId", "visibility", ]; [Fact] public void GeneratedOpenApiContainsTheFrozenV1Surface() { string path = Path.Combine( ContractTestFiles.Directory, "../../../../../docs/api/rendezvous-v1.json"); using JsonDocument document = JsonDocument.Parse(File.ReadAllText(Path.GetFullPath(path))); JsonElement root = document.RootElement; Assert.Equal("3.1.1", root.GetProperty("openapi").GetString()); string[] paths = root.GetProperty("paths") .EnumerateObject() .Select(static item => item.Name) .Order(StringComparer.Ordinal) .ToArray(); Assert.Equal(ExpectedPaths, paths); JsonElement schemas = root.GetProperty("components").GetProperty("schemas"); Assert.Equal("string", schemas.GetProperty("GameId").GetProperty("type").GetString()); Assert.Equal("uuid", schemas.GetProperty("SessionListingId").GetProperty("format").GetString()); string[] listingProperties = schemas.GetProperty("SessionListing") .GetProperty("properties") .EnumerateObject() .Select(static item => item.Name) .Order(StringComparer.Ordinal) .ToArray(); Assert.Equal(ExpectedListingProperties, listingProperties); Assert.DoesNotContain(listingProperties, static property => property.Contains("token", StringComparison.OrdinalIgnoreCase) || property.Contains("endpoint", StringComparison.OrdinalIgnoreCase) || property.Contains("playerId", StringComparison.OrdinalIgnoreCase)); JsonElement publisherBearer = root.GetProperty("components") .GetProperty("securitySchemes") .GetProperty("PublisherBearer"); Assert.Equal("http", publisherBearer.GetProperty("type").GetString()); Assert.Equal("bearer", publisherBearer.GetProperty("scheme").GetString()); (string Path, string Method)[] publisherOperations = [ ("/v1/sessions", "post"), ("/v1/sessions/{listingId}", "put"), ("/v1/sessions/{listingId}", "delete"), ("/v1/sessions/{listingId}/renew", "post"), ]; foreach ((string operationPath, string method) in publisherOperations) { JsonElement security = root.GetProperty("paths") .GetProperty(operationPath) .GetProperty(method) .GetProperty("security"); Assert.True(security[0].TryGetProperty("PublisherBearer", out _)); } } }