using Elsa.Api.Client.Resources.ExternalAuthentication.Descriptors.Models;
using Elsa.Permissions;
namespace Elsa.ExternalAuthentication.IntegrationTests.Compatibility;
///
/// Pins the permission descriptor the API serves to the one its client deserializes.
///
///
/// The endpoint used to serve a descriptor private to the External Authentication module, keyed by a single
/// permission string. Moving it onto the core catalog changed the shape to a resource plus the verbs that
/// resource accepts, and the client model kept the old one — so it still deserialized, still compiled, and
/// handed callers blank identifiers with no way to reach the verbs. Nothing failed; the data just went
/// missing. Comparing the two property sets is what turns that back into a test failure.
///
public class PermissionDescriptorContractTests
{
[Fact]
public void ClientModelCarriesEveryFieldTheCatalogServes()
{
var served = typeof(PermissionDescriptor).GetProperties().Select(x => x.Name).ToHashSet(StringComparer.Ordinal);
var deserialized = typeof(ExternalAuthenticationPermissionDescriptor).GetProperties().Select(x => x.Name).ToHashSet(StringComparer.Ordinal);
// NonCoreVerbs is derived from SupportedVerbs on the server, so a client that has the verbs can
// compute it and does not need it sent.
served.Remove(nameof(PermissionDescriptor.NonCoreVerbs));
var missing = served.Except(deserialized).OrderBy(x => x, StringComparer.Ordinal).ToArray();
var unknown = deserialized.Except(served).OrderBy(x => x, StringComparer.Ordinal).ToArray();
Assert.True(missing.Length == 0, $"The client model would silently drop: {string.Join(", ", missing)}.");
Assert.True(unknown.Length == 0, $"The client model expects fields the catalog does not serve, which will deserialize empty: {string.Join(", ", unknown)}.");
}
}