diff --git a/src/Digitall.Testing/Extensions/FakedDataverseBuilderExtensions.cs b/src/Digitall.Testing/Extensions/FakedDataverseBuilderExtensions.cs index 5a8a69e..7f371cf 100644 --- a/src/Digitall.Testing/Extensions/FakedDataverseBuilderExtensions.cs +++ b/src/Digitall.Testing/Extensions/FakedDataverseBuilderExtensions.cs @@ -1,9 +1,14 @@ // Copyright (c) DIGITALL Nature. All rights reserved // DIGITALL Nature licenses this file to you under the Microsoft Public License. +using System; using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; using Digitall.Testing.OrganizationRequests; using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Metadata; namespace Digitall.Testing.Extensions; @@ -33,6 +38,30 @@ public static FakedDataverseBuilder AddOrganizationRequests(this FakedDataverseB return builder; } + public static FakedDataverseBuilder AddEntityMetadata(this FakedDataverseBuilder builder, IEnumerable metadata) + { + builder.OrganizationService.AddMetadata(metadata); + return builder; + } + + public static FakedDataverseBuilder AddEntityMetadata(this FakedDataverseBuilder builder, params EntityMetadata[] metadata) + { + builder.OrganizationService.AddMetadata(metadata); + return builder; + } + + public static FakedDataverseBuilder AddRelationships(this FakedDataverseBuilder builder, IEnumerable relationships) + { + builder.OrganizationService.AddRelationships(relationships); + return builder; + } + + public static FakedDataverseBuilder AddRelationships(this FakedDataverseBuilder builder, params RelationshipMetadataBase[] relationships) + { + builder.OrganizationService.AddRelationships(relationships); + return builder; + } + /// /// Retrieves the underlying FakedDataverse service from the FakedDataverseBuilder at call time. /// @@ -45,4 +74,33 @@ public static FakedDataverseBuilder GetFakedDataverse(this FakedDataverseBuilder service = builder.OrganizationService; return builder; } + + /// + /// Loads EntityMetadata from XML files or directory. + /// + /// builder instance + /// The path to load from. Can be a file path to the XML file or path to the directory containing the XML files. + /// builder instance + /// path parameter is not a valid path + public static FakedDataverseBuilder LoadMetadata(this FakedDataverseBuilder builder, string path) + { + var serializer = new DataContractSerializer(typeof(EntityMetadata)); + + if (File.Exists(path)) + { + var metadata = (EntityMetadata)serializer.ReadObject(File.OpenRead(path)); + builder.OrganizationService.AddMetadata(metadata); + } + else if (Directory.Exists(path)) + { + var metadata = Directory.GetFiles(path, "*.xml").Select(file => (EntityMetadata)serializer.ReadObject(File.OpenRead(file))); + builder.OrganizationService.AddMetadata(metadata); + } + else + { + throw new InvalidOperationException($"'{path}' is not a valid path."); + } + + return builder; + } } diff --git a/src/Digitall.Testing/FakedDataverse.cs b/src/Digitall.Testing/FakedDataverse.cs index 6ba800a..a4818d1 100644 --- a/src/Digitall.Testing/FakedDataverse.cs +++ b/src/Digitall.Testing/FakedDataverse.cs @@ -66,6 +66,55 @@ public void AddRequests(params IOrganizationRequestFake[] requests) } } + public void AddMetadata(EntityMetadata entityMetadata) + { + EntityMetadata.Add(entityMetadata.LogicalName, entityMetadata); + + var relationships = new List(); + relationships.AddRange(entityMetadata.ManyToManyRelationships); + relationships.AddRange(entityMetadata.OneToManyRelationships); + relationships.AddRange(entityMetadata.ManyToOneRelationships); + + AddRelationships(relationships); + } + + public void AddMetadata(IEnumerable entityMetadata) + { + foreach (var metadata in entityMetadata) + { + AddMetadata(metadata); + } + } + + public void AddMetadata(params EntityMetadata[] entityMetadata) + { + foreach (var metadata in entityMetadata) + { + AddMetadata(metadata); + } + } + + public void AddRelationship(RelationshipMetadataBase relationship) + { + Relationships[relationship.SchemaName] = relationship; + } + + public void AddRelationships(IEnumerable relationships) + { + foreach (var relationship in relationships) + { + AddRelationship(relationship); + } + } + + public void AddRelationships(params RelationshipMetadataBase[] relationships) + { + foreach (var relationship in relationships) + { + AddRelationship(relationship); + } + } + public void AddDefaultRequests() { Assembly a = typeof(IOrganizationRequestFake).Assembly;