using FinalFactory.Rendezvous.Contracts; using FinalFactory.Rendezvous.Server.Provisioning; namespace FinalFactory.Rendezvous.Tests.Provisioning; public sealed class GamePolicyTests { [Fact] public void RegistryFailsClosedForUnknownAndDisabledScopes() { GamePolicyRegistry registry = GamePolicyRegistry.Create( [ ProvisioningTestData.CreatePolicy(), ProvisioningTestData.CreatePolicy("unscouted", "staging", enabled: false), ]); Assert.True(registry.TryGet( new GameId("space-game"), new EnvironmentId("production"), out _)); Assert.False(registry.TryGet( new GameId("space-game"), new EnvironmentId("staging"), out _)); Assert.False(registry.TryGet( new GameId("unscouted"), new EnvironmentId("staging"), out _)); } [Fact] public void PerGamePolicyConstrainsProtocolMetadataQuotasAndFeatures() { GamePolicyRegistry registry = GamePolicyRegistry.Create( [ProvisioningTestData.CreatePolicy()]); Assert.True(registry.TryGet( new GameId("space-game"), new EnvironmentId("production"), out GamePolicy? policy)); Assert.NotNull(policy); Assert.True(policy.AllowsProtocol(7)); Assert.False(policy.AllowsProtocol(8)); Assert.True(policy.AllowsRegion(new RegionId("eu-central"))); Assert.False(policy.AllowsRegion(new RegionId("us-east"))); Assert.True(policy.AllowsVisibility(ListingVisibility.Public)); Assert.True(policy.AllowsPublisherTrust(PublisherTrustMode.PlayerGrant)); Assert.Equal(FallbackPolicyMode.DedicatedEndpointAllowed, policy.FallbackPolicy); Assert.Equal(10, policy.MaxListingsPerPrincipal); Assert.Equal(1, policy.MaxAnonymousListingsPerAddress); Assert.Equal(100, policy.MaxActiveJoinAttempts); Assert.True(policy.AllowsMetadata(new Dictionary { ["mode"] = "co-op", ["map"] = "europa", })); Assert.False(policy.AllowsMetadata(new Dictionary { ["map"] = "europa", })); Assert.False(policy.AllowsMetadata(new Dictionary { ["mode"] = "co-op", ["unknown"] = "value", })); } [Fact] public void InvalidOrDuplicatePolicyConfigurationFailsAtStartup() { GamePolicyOptions invalid = ProvisioningTestData.CreatePolicy(); invalid.ProtocolVersions = []; Assert.Throws(() => GamePolicyRegistry.Create([invalid])); Assert.Throws(() => GamePolicyRegistry.Create( [ ProvisioningTestData.CreatePolicy(), ProvisioningTestData.CreatePolicy(), ])); } }