Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions src/Digitall.Testing/Extensions/FakedDataverseBuilderExtensions.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -33,6 +38,30 @@ public static FakedDataverseBuilder AddOrganizationRequests(this FakedDataverseB
return builder;
}

public static FakedDataverseBuilder AddEntityMetadata(this FakedDataverseBuilder builder, IEnumerable<EntityMetadata> 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<RelationshipMetadataBase> relationships)
{
builder.OrganizationService.AddRelationships(relationships);
return builder;
}

public static FakedDataverseBuilder AddRelationships(this FakedDataverseBuilder builder, params RelationshipMetadataBase[] relationships)
{
builder.OrganizationService.AddRelationships(relationships);
return builder;
}

/// <summary>
/// Retrieves the underlying FakedDataverse service from the FakedDataverseBuilder at call time.
/// </summary>
Expand All @@ -45,4 +74,33 @@ public static FakedDataverseBuilder GetFakedDataverse(this FakedDataverseBuilder
service = builder.OrganizationService;
return builder;
}

/// <summary>
/// Loads EntityMetadata from XML files or directory.
/// </summary>
/// <param name="builder">builder instance</param>
/// <param name="path">The path to load from. Can be a file path to the XML file or path to the directory containing the XML files.</param>
/// <returns>builder instance</returns>
/// <exception cref="InvalidOperationException">path parameter is not a valid path</exception>
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;
}
}
49 changes: 49 additions & 0 deletions src/Digitall.Testing/FakedDataverse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,55 @@
}
}

public void AddMetadata(EntityMetadata entityMetadata)
{
EntityMetadata.Add(entityMetadata.LogicalName, entityMetadata);

var relationships = new List<RelationshipMetadataBase>();
relationships.AddRange(entityMetadata.ManyToManyRelationships);
relationships.AddRange(entityMetadata.OneToManyRelationships);
relationships.AddRange(entityMetadata.ManyToOneRelationships);

AddRelationships(relationships);
}

public void AddMetadata(IEnumerable<EntityMetadata> 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<RelationshipMetadataBase> 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;
Expand Down Expand Up @@ -96,7 +145,7 @@
if (typeParameter.GetCustomAttributes(typeof(EntityLogicalNameAttribute), true).Length > 0)
{
logicalName =
(typeParameter.GetCustomAttributes(typeof(EntityLogicalNameAttribute), true)[0] as EntityLogicalNameAttribute).LogicalName;

Check warning on line 148 in src/Digitall.Testing/FakedDataverse.cs

View workflow job for this annotation

GitHub Actions / Build

Dereference of a possibly null reference.

Check warning on line 148 in src/Digitall.Testing/FakedDataverse.cs

View workflow job for this annotation

GitHub Actions / Build & Test (ubuntu-22.04)

Dereference of a possibly null reference.
}

if (string.IsNullOrWhiteSpace(logicalName))
Expand Down Expand Up @@ -162,7 +211,7 @@
return Relationships[relationshipSchemaName];
}

return null;

Check warning on line 214 in src/Digitall.Testing/FakedDataverse.cs

View workflow job for this annotation

GitHub Actions / Build

Possible null reference return.

Check warning on line 214 in src/Digitall.Testing/FakedDataverse.cs

View workflow job for this annotation

GitHub Actions / Build & Test (ubuntu-22.04)

Possible null reference return.
}

// <summary>
Expand Down Expand Up @@ -190,7 +239,7 @@
}
}

EntityType = null;

Check warning on line 242 in src/Digitall.Testing/FakedDataverse.cs

View workflow job for this annotation

GitHub Actions / Build

Cannot convert null literal to non-nullable reference type.
return false;
}

Expand Down
Loading