diff --git a/src/Hl7.Fhir.Base/ElementModel/ReferencedResourceCache.cs b/src/Hl7.Fhir.Base/ElementModel/ReferencedResourceCache.cs index ea215d5071..80c53ca7ac 100644 --- a/src/Hl7.Fhir.Base/ElementModel/ReferencedResourceCache.cs +++ b/src/Hl7.Fhir.Base/ElementModel/ReferencedResourceCache.cs @@ -8,25 +8,37 @@ namespace Hl7.Fhir.ElementModel; internal class ReferencedResourceCache : IEnumerable { - private Dictionary _items; + private Dictionary _items; + private List _unreferenceableItems; // some resources may not have a reference, but are included nonetheless. - public ReferencedResourceCache(IEnumerable> items) + public ReferencedResourceCache(IEnumerable> items) { - _items = new Dictionary(); + _items = new Dictionary(); + _unreferenceableItems = []; foreach (var item in items) { - _items.Add(item.Key, item.Value); + if (item.Key is not null) + _items.Add(item.Key, item.Value); + else + _unreferenceableItems.Add(item.Value); + } } - internal IEnumerable Resources => _items.Values.OfType(); + internal IEnumerable Resources => _items.Values.Concat(_unreferenceableItems); internal ScopedNode? ResolveReference(string reference) { return _items.TryGetValue(reference, out var node) ? node : null; } - public IEnumerator GetEnumerator() => _items.Select(i => new ScopedNode.BundledResource(i.Key, i.Value)).GetEnumerator(); + public IEnumerator GetEnumerator() => + _items + .Select(i => new ScopedNode.BundledResource(i.Key, i.Value)) + .Concat( + _unreferenceableItems.Select(i => new ScopedNode.BundledResource(null, i)) + ) + .GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } diff --git a/src/Hl7.Fhir.ElementModel.Shared.Tests/ScopedNodeTests.cs b/src/Hl7.Fhir.ElementModel.Shared.Tests/ScopedNodeTests.cs index d42860a80a..407a83bdd0 100644 --- a/src/Hl7.Fhir.ElementModel.Shared.Tests/ScopedNodeTests.cs +++ b/src/Hl7.Fhir.ElementModel.Shared.Tests/ScopedNodeTests.cs @@ -1,4 +1,5 @@ -using Hl7.Fhir.Model; +using FluentAssertions; +using Hl7.Fhir.Model; using Hl7.Fhir.Serialization; using Hl7.Fhir.Specification; using Hl7.Fhir.Specification.Snapshot; @@ -273,6 +274,15 @@ static bool CCDATypeNameMapper(string typeName, out string canonical) } + + [TestMethod] + public void Bundle_WithEntryWithoutFullUrl_ShouldNotThrow() + { + var bundle = new Bundle() { Type = Bundle.BundleType.Batch, Entry = [new Bundle.EntryComponent() { Resource = new Patient() }]}.ToTypedElement().ToScopedNode(); + + var enumerate = () => bundle.BundledResources(); + enumerate.Should().NotThrow().Subject.Should().ContainSingle(c => c.FullUrl == null); + } private class CCDAResourceResolver : IAsyncResourceResolver {