diff --git a/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs b/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs index 7cbf1c2b..0c15d290 100644 --- a/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs +++ b/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs @@ -26,14 +26,17 @@ public sealed class ConfigurationCatalog : IAdminAssistCatalog public ConfigurationCatalog() : this(ReadEmbedded()) { } - public ConfigurationCatalog(IEnumerable documents) + // Private so Autofac cannot choose it: IEnumerable always resolves (empty), and the container prefers the widest constructor. + private ConfigurationCatalog(IEnumerable documents) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow }; options.Converters.Add(new JsonStringEnumConverter()); var packs = documents.Select(document => JsonSerializer.Deserialize(document, options) ?? throw new InvalidDataException("Empty Admin Assist catalog document.")).ToList(); - if (packs.Count == 0 || packs.Select(p => p.Version).Distinct().Count() != 1 || string.IsNullOrWhiteSpace(packs[0].Version)) + if (packs.Count == 0) + throw new InvalidDataException("No Admin Assist catalog documents were supplied."); + if (packs.Select(p => p.Version).Distinct().Count() != 1 || string.IsNullOrWhiteSpace(packs[0].Version)) throw new InvalidDataException("Admin Assist catalog versions must agree."); Version = packs[0].Version; Areas = Freeze(packs.SelectMany(p => p.Areas).OrderBy(a => a.Order).Select(a => a with { Archetypes = Freeze(a.Archetypes) })); diff --git a/Tests/Resgrid.Tests/AdminAssist/CatalogTests.cs b/Tests/Resgrid.Tests/AdminAssist/CatalogTests.cs index 39ebdadc..f2f376c7 100644 --- a/Tests/Resgrid.Tests/AdminAssist/CatalogTests.cs +++ b/Tests/Resgrid.Tests/AdminAssist/CatalogTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using System.Resources; +using Autofac; using Microsoft.AspNetCore.Mvc; using NUnit.Framework; using Resgrid.AdminAssist; @@ -189,5 +190,14 @@ public void Embedded_documentation_anchors_resolve_and_onboarding_is_searchable( using var search = new AdminAssistReferenceSearch(Catalog); Assert.That(search.Search("resume setup", "en").Any(hit => hit.Id.StartsWith("guide.")), Is.True); } + [Test] + public void Container_builds_the_catalog_from_the_embedded_documents() + { + // Autofac picks the widest public constructor it can satisfy and always satisfies IEnumerable (empty when + // nothing is registered), so a public documents constructor would be handed an empty catalog. + var builder = new ContainerBuilder(); builder.RegisterModule(); + using var container = builder.Build(Autofac.Builder.ContainerBuildOptions.IgnoreStartableComponents); + Assert.That(container.Resolve().Settings, Is.Not.Empty); + } } }