diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/AssignRequestFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/AssignRequestFake.cs index aa19527..e6681cc 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/AssignRequestFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/AssignRequestFake.cs @@ -9,9 +9,9 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class AssignRequestFake : OrganizationRequestFake { - public override AssignResponse Execute(AssignRequest organizationRequest, FakeOrganizationService state) + public override AssignResponse Execute(AssignRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - ArgumentNullException.ThrowIfNull(state); + ArgumentNullException.ThrowIfNull(fakeOrganizationService); ArgumentNullException.ThrowIfNull(organizationRequest); @@ -46,7 +46,7 @@ public override AssignResponse Execute(AssignRequest organizationRequest, FakeOr } }; - state.Update(assignment); + fakeOrganizationService.Update(assignment); return new AssignResponse(); } diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/AssociateFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/AssociateFake.cs index 39f1966..e6dfd85 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/AssociateFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/AssociateFake.cs @@ -10,14 +10,14 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class AssociateFake : OrganizationRequestFake { - public override AssociateResponse Execute(AssociateRequest organizationRequest, FakeOrganizationService state) + public override AssociateResponse Execute(AssociateRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { var entityName = organizationRequest.Target.LogicalName; var entityId = organizationRequest.Target.Id; var relationship = organizationRequest.Relationship; var relatedEntities = organizationRequest.RelatedEntities; - var relationshipMetadata = state.GetRelationship(relationship.SchemaName); + var relationshipMetadata = fakeOrganizationService.GetRelationship(relationship.SchemaName); if (relationshipMetadata == null) { @@ -37,14 +37,14 @@ public override AssociateResponse Execute(AssociateRequest organizationRequest, var toEntityName = isFrom1To2 ? manyToManyRelationshipMetadata.Entity2LogicalName : manyToManyRelationshipMetadata.Entity1LogicalName; //Check records exist - var targetExists = state.CreateQuery(fromEntityName).FirstOrDefault(e => e.Id == entityId) != null; + var targetExists = fakeOrganizationService.CreateQuery(fromEntityName).FirstOrDefault(e => e.Id == entityId) != null; if (!targetExists) { ErrorFactory.ThrowFault(ErrorCodes.ObjectDoesNotExist, $"{fromEntityName} with Id {entityId} does not exist"); } - var relatedExists = state.CreateQuery(toEntityName).FirstOrDefault(e => e.Id == relatedEntityReference.Id) != null; + var relatedExists = fakeOrganizationService.CreateQuery(toEntityName).FirstOrDefault(e => e.Id == relatedEntityReference.Id) != null; if (!relatedExists) { @@ -59,7 +59,7 @@ public override AssociateResponse Execute(AssociateRequest organizationRequest, } }; - state.Create(association); + fakeOrganizationService.Create(association); break; } case OneToManyRelationshipMetadata oneToManyRelationshipMetadata: @@ -70,7 +70,7 @@ public override AssociateResponse Execute(AssociateRequest organizationRequest, Id = relatedEntityReference.Id, [oneToManyRelationshipMetadata.ReferencingAttribute] = new EntityReference(entityName, entityId) }; - state.Update(entityToUpdate); + fakeOrganizationService.Update(entityToUpdate); break; } default: diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/BulkDeleteFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/BulkDeleteFake.cs index 59b854e..d8ebd2b 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/BulkDeleteFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/BulkDeleteFake.cs @@ -10,7 +10,7 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class BulkDeleteFake : OrganizationRequestFake { - public override BulkDeleteResponse Execute(BulkDeleteRequest organizationRequest, FakeOrganizationService state) + public override BulkDeleteResponse Execute(BulkDeleteRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { if (string.IsNullOrEmpty(organizationRequest.JobName)) { @@ -39,7 +39,7 @@ public override BulkDeleteResponse Execute(BulkDeleteRequest organizationRequest Attributes = { ["name"] = organizationRequest.JobName, - ["ownerid"] = new EntityReference("systemuser", state.Options.UserId), + ["ownerid"] = new EntityReference("systemuser", fakeOrganizationService.Options.UserId), ["operationtype"] = new OptionSetValue(13), // 13 = BulkDelete } }; @@ -54,21 +54,21 @@ public override BulkDeleteResponse Execute(BulkDeleteRequest organizationRequest asyncOpertation["recurrencestarttime"] = organizationRequest.StartDateTime; } - state.Create(asyncOpertation); + fakeOrganizationService.Create(asyncOpertation); // delete all records from all queries foreach (QueryExpression queryExpression in organizationRequest.QuerySet ?? []) { - EntityCollection recordsToDelete = state.RetrieveMultiple(queryExpression); + EntityCollection recordsToDelete = fakeOrganizationService.RetrieveMultiple(queryExpression); foreach (Entity record in recordsToDelete.Entities) { - state.Delete(record.LogicalName, record.Id); + fakeOrganizationService.Delete(record.LogicalName, record.Id); } } // set ayncoperation to completed asyncOpertation["statecode"] = new OptionSetValue(3); - state.Update(asyncOpertation); + fakeOrganizationService.Update(asyncOpertation); // return result return new BulkDeleteResponse { ResponseName = "BulkDeleteResponse", ["JobId"] = jobId}; diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/CreateFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/CreateFake.cs index 4818c29..e9e0169 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/CreateFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/CreateFake.cs @@ -8,15 +8,15 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class CreateFake : OrganizationRequestFake { - public override CreateResponse Execute(CreateRequest organizationRequest, FakeOrganizationService state) + public override CreateResponse Execute(CreateRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { var target = organizationRequest.Target; - var guid = state.CreateCore(target); + var guid = fakeOrganizationService.CreateCore(target); // Deep insert: create sub-entities from RelatedEntities if (target.RelatedEntities.Count > 0) { - DeepInsertProcessor.Process(target.LogicalName, guid, target.RelatedEntities, state); + DeepInsertProcessor.Process(target.LogicalName, guid, target.RelatedEntities, fakeOrganizationService); } return new CreateResponse diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/DeleteFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/DeleteFake.cs index ac78720..10f5e77 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/DeleteFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/DeleteFake.cs @@ -7,9 +7,9 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class DeleteFake : OrganizationRequestFake { - public override DeleteResponse Execute(DeleteRequest organizationRequest, FakeOrganizationService state) + public override DeleteResponse Execute(DeleteRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - state.DeleteCore(organizationRequest.Target.LogicalName, organizationRequest.Target.Id); + fakeOrganizationService.DeleteCore(organizationRequest.Target.LogicalName, organizationRequest.Target.Id); return new DeleteResponse(); } diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/DisassociateFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/DisassociateFake.cs index e9d1558..311a5c9 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/DisassociateFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/DisassociateFake.cs @@ -10,14 +10,14 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class DisassociateFake : OrganizationRequestFake { - public override DisassociateResponse Execute(DisassociateRequest organizationRequest, FakeOrganizationService state) + public override DisassociateResponse Execute(DisassociateRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { var entityName = organizationRequest.Target.LogicalName; var entityId = organizationRequest.Target.Id; var relationship = organizationRequest.Relationship; var relatedEntities = organizationRequest.RelatedEntities; - var relationshipMetadata = state.GetRelationship(relationship.SchemaName); + var relationshipMetadata = fakeOrganizationService.GetRelationship(relationship.SchemaName); if (relationshipMetadata == null) { @@ -37,11 +37,11 @@ public override DisassociateResponse Execute(DisassociateRequest organizationReq query.Criteria.AddCondition(new ConditionExpression(fromAttribute, ConditionOperator.Equal, entityId)); query.Criteria.AddCondition(new ConditionExpression(toAttribute, ConditionOperator.Equal, relatedEntity.Id)); - var results = state.RetrieveMultiple(query); + var results = fakeOrganizationService.RetrieveMultiple(query); if (results.Entities.Count == 1) { - state.Delete(manyToManyRelationshipMetadata.IntersectEntityName, results.Entities.First().Id); + fakeOrganizationService.Delete(manyToManyRelationshipMetadata.IntersectEntityName, results.Entities.First().Id); } } else diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/ExecuteTransactionFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/ExecuteTransactionFake.cs index 18def84..7ceaff3 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/ExecuteTransactionFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/ExecuteTransactionFake.cs @@ -8,13 +8,13 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class ExecuteTransactionFake : OrganizationRequestFake { - public override ExecuteTransactionResponse Execute(ExecuteTransactionRequest organizationRequest, FakeOrganizationService state) + public override ExecuteTransactionResponse Execute(ExecuteTransactionRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { var response = new ExecuteTransactionResponse { ["Responses"] = new OrganizationResponseCollection() }; foreach (var r in organizationRequest.Requests) { - var result = state.Execute(r); + var result = fakeOrganizationService.Execute(r); if (organizationRequest.ReturnResponses.HasValue && organizationRequest.ReturnResponses.Value) { diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/FetchXmlToQueryExpressionFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/FetchXmlToQueryExpressionFake.cs index 122a21d..78342cb 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/FetchXmlToQueryExpressionFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/FetchXmlToQueryExpressionFake.cs @@ -9,7 +9,7 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class FetchXmlToQueryExpressionFake : OrganizationRequestFake { - public override FetchXmlToQueryExpressionResponse Execute(FetchXmlToQueryExpressionRequest organizationRequest, FakeOrganizationService state) + public override FetchXmlToQueryExpressionResponse Execute(FetchXmlToQueryExpressionRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { ArgumentNullException.ThrowIfNull(organizationRequest); @@ -28,7 +28,7 @@ public override FetchXmlToQueryExpressionResponse Execute(FetchXmlToQueryExpress throw new ArgumentException("FetchXml is not valid XML.", nameof(organizationRequest), ex); } - var processor = new QueryProcessor(state); + var processor = new QueryProcessor(fakeOrganizationService); var query = processor.ConvertXmlDocumentToQueryExpression(xmlDocument); return new FetchXmlToQueryExpressionResponse diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/IOrganizationRequestFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/IOrganizationRequestFake.cs index e9df8db..1c2ac01 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/IOrganizationRequestFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/IOrganizationRequestFake.cs @@ -8,5 +8,5 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public interface IOrganizationRequestFake { Type ForType { get; } - OrganizationResponse Execute(OrganizationRequest organizationRequest, FakeOrganizationService state); + OrganizationResponse Execute(OrganizationRequest organizationRequest, FakeOrganizationService fakeOrganizationService); } diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/OrganizationRequestFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/OrganizationRequestFake.cs index a7150cc..4861a9c 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/OrganizationRequestFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/OrganizationRequestFake.cs @@ -9,10 +9,10 @@ public abstract class OrganizationRequestFake : IOrganizati { public Type ForType => typeof(TRequest); - public OrganizationResponse Execute(OrganizationRequest organizationRequest, FakeOrganizationService state) + public OrganizationResponse Execute(OrganizationRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - return organizationRequest is TRequest request ? Execute(request, state) : throw new InvalidCastException($"Cannot cast {organizationRequest.GetType()} to {typeof(TRequest)}"); + return organizationRequest is TRequest request ? Execute(request, fakeOrganizationService) : throw new InvalidCastException($"Cannot cast {organizationRequest.GetType()} to {typeof(TRequest)}"); } - public abstract TResponse Execute(TRequest organizationRequest, FakeOrganizationService state); + public abstract TResponse Execute(TRequest organizationRequest, FakeOrganizationService fakeOrganizationService); } diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/QueryExpressionToFetchXmlFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/QueryExpressionToFetchXmlFake.cs index 3839453..23ed457 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/QueryExpressionToFetchXmlFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/QueryExpressionToFetchXmlFake.cs @@ -11,7 +11,7 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class QueryExpressionToFetchXmlFake : OrganizationRequestFake { - public override QueryExpressionToFetchXmlResponse Execute(QueryExpressionToFetchXmlRequest organizationRequest, FakeOrganizationService state) + public override QueryExpressionToFetchXmlResponse Execute(QueryExpressionToFetchXmlRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { ArgumentNullException.ThrowIfNull(organizationRequest); diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAllEntitiesFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAllEntitiesFake.cs index 676fbec..2d6d5c3 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAllEntitiesFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAllEntitiesFake.cs @@ -7,9 +7,9 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class RetrieveAllEntitiesFake : OrganizationRequestFake { - public override RetrieveAllEntitiesResponse Execute(RetrieveAllEntitiesRequest organizationRequest, FakeOrganizationService state) + public override RetrieveAllEntitiesResponse Execute(RetrieveAllEntitiesRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - var knownMetadata = state.State.EntityMetadata.Values.ToArray(); + var knownMetadata = fakeOrganizationService.State.EntityMetadata.Values.ToArray(); return new RetrieveAllEntitiesResponse { Results = diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAttributeFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAttributeFake.cs new file mode 100644 index 0000000..013eecc --- /dev/null +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveAttributeFake.cs @@ -0,0 +1,23 @@ +// Copyright (c) DIGITALL Nature. All rights reserved +// DIGITALL Nature licenses this file to you under the Microsoft Public License. + +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Messages; + +namespace Digitall.Dataverse.Testing.OrganizationRequests; + +public class RetrieveAttributeFake : OrganizationRequestFake +{ + public override RetrieveAttributeResponse Execute(RetrieveAttributeRequest organizationRequest, FakeOrganizationService fakeOrganizationService) + { + ArgumentNullException.ThrowIfNull(organizationRequest); + + var entityMetadata = fakeOrganizationService.State.EntityMetadata[organizationRequest.EntityLogicalName]; + var attributeMetadata = entityMetadata.Attributes.First(a => a.LogicalName == organizationRequest.LogicalName); + + var results = new ParameterCollection { { nameof(RetrieveAttributeResponse.AttributeMetadata), attributeMetadata } }; + + var response = new RetrieveAttributeResponse { Results = results }; + return response; + } +} diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveEntityFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveEntityFake.cs index 5aa0010..793287f 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveEntityFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveEntityFake.cs @@ -14,15 +14,9 @@ public override RetrieveEntityResponse Execute(RetrieveEntityRequest organizatio var entityMetadata = fakeOrganizationService.State.EntityMetadata[organizationRequest.LogicalName]; - var results = new ParameterCollection { - { nameof (RetrieveEntityResponse.EntityMetadata), entityMetadata } - }; + var results = new ParameterCollection { { nameof(RetrieveEntityResponse.EntityMetadata), entityMetadata } }; - var response = new RetrieveEntityResponse - { - Results = results - }; + var response = new RetrieveEntityResponse { Results = results }; return response; } } - diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveFake.cs index 7374e47..877784c 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveFake.cs @@ -11,24 +11,24 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class RetrieveFake : OrganizationRequestFake { - public override RetrieveResponse Execute(RetrieveRequest organizationRequest, FakeOrganizationService state) + public override RetrieveResponse Execute(RetrieveRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - ArgumentNullException.ThrowIfNull(state); + ArgumentNullException.ThrowIfNull(fakeOrganizationService); ArgumentNullException.ThrowIfNull(organizationRequest); Entity record; if (organizationRequest.Target.Id == Guid.Empty && organizationRequest.Target.KeyAttributes.Count > 0) { - record = state.RetrieveWithAlternateKey(organizationRequest.Target.LogicalName, organizationRequest.Target.KeyAttributes, organizationRequest.ColumnSet); + record = fakeOrganizationService.RetrieveWithAlternateKey(organizationRequest.Target.LogicalName, organizationRequest.Target.KeyAttributes, organizationRequest.ColumnSet); } else { - record = state.RetrieveCore(organizationRequest.Target.LogicalName, organizationRequest.Target.Id, organizationRequest.ColumnSet); + record = fakeOrganizationService.RetrieveCore(organizationRequest.Target.LogicalName, organizationRequest.Target.Id, organizationRequest.ColumnSet); } if (organizationRequest.RelatedEntitiesQuery?.Count > 0) { - PopulateRelatedEntities(organizationRequest, record, state); + PopulateRelatedEntities(organizationRequest, record, fakeOrganizationService); } return new RetrieveResponse diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveMultipleFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveMultipleFake.cs index 6d97764..6ed9f8f 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveMultipleFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/RetrieveMultipleFake.cs @@ -14,12 +14,12 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class RetrieveMultipleFake : OrganizationRequestFake { - public override RetrieveMultipleResponse Execute(RetrieveMultipleRequest organizationRequest, FakeOrganizationService state) + public override RetrieveMultipleResponse Execute(RetrieveMultipleRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { ArgumentNullException.ThrowIfNull(organizationRequest); // Create a new QueryProcessor with the given state - var queryProcessor = new QueryProcessor(state); + var queryProcessor = new QueryProcessor(fakeOrganizationService); // Initialize variables QueryExpression queryExpression; @@ -111,7 +111,7 @@ public override RetrieveMultipleResponse Execute(RetrieveMultipleRequest organiz } // Handle paging - var maxRetrieveCount = state.Options.MaxRetrieveCount; + var maxRetrieveCount = fakeOrganizationService.Options.MaxRetrieveCount; var pageSize = maxRetrieveCount; var pageInfo = queryExpression.PageInfo; var pageNumber = 1; @@ -143,10 +143,10 @@ public override RetrieveMultipleResponse Execute(RetrieveMultipleRequest organiz var recordsToReturn = startPosition + numberToGet > internalResult.Count ? [] : internalResult.GetRange(startPosition, numberToGet); - recordsToReturn.ForEach(e => PatchDateFormat(e, state)); + recordsToReturn.ForEach(e => PatchDateFormat(e, fakeOrganizationService)); recordsToReturn.ForEach(FillFormattedValues); - recordsToReturn = recordsToReturn.Select(state.ConvertToProxyType).ToList(); + recordsToReturn = recordsToReturn.Select(fakeOrganizationService.ConvertToProxyType).ToList(); var response = new RetrieveMultipleResponse { diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/SetStateFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/SetStateFake.cs index c9837d1..ab95147 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/SetStateFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/SetStateFake.cs @@ -9,16 +9,16 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class SetStateFake : OrganizationRequestFake { - public override SetStateResponse Execute(SetStateRequest organizationRequest, FakeOrganizationService state) + public override SetStateResponse Execute(SetStateRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - ArgumentNullException.ThrowIfNull(state); + ArgumentNullException.ThrowIfNull(fakeOrganizationService); ArgumentNullException.ThrowIfNull(organizationRequest); var entityName = organizationRequest.EntityMoniker.LogicalName; var entityId = organizationRequest.EntityMoniker.Id; var statusCode = organizationRequest.Status.Value == -1 - ? state.State.GetDefaultStatusCode(entityName, organizationRequest.State.Value) + ? fakeOrganizationService.State.GetDefaultStatusCode(entityName, organizationRequest.State.Value) : organizationRequest.Status; var entityToUpdate = new Entity(entityName) @@ -28,7 +28,7 @@ public override SetStateResponse Execute(SetStateRequest organizationRequest, Fa ["statuscode"] = statusCode }; - state.Update(entityToUpdate); + fakeOrganizationService.Update(entityToUpdate); return new SetStateResponse(); } diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/UpdateFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/UpdateFake.cs index 0bf4403..9cf14dc 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/UpdateFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/UpdateFake.cs @@ -7,9 +7,9 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class UpdateFake : OrganizationRequestFake { - public override UpdateResponse Execute(UpdateRequest organizationRequest, FakeOrganizationService state) + public override UpdateResponse Execute(UpdateRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - state.UpdateCore(organizationRequest.Target); + fakeOrganizationService.UpdateCore(organizationRequest.Target); return new UpdateResponse(); } diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/UpsertFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/UpsertFake.cs index edea39e..e0c7c4d 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/UpsertFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/UpsertFake.cs @@ -8,9 +8,9 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class UpsertFake : OrganizationRequestFake { - public override UpsertResponse Execute(UpsertRequest organizationRequest, FakeOrganizationService state) + public override UpsertResponse Execute(UpsertRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - ArgumentNullException.ThrowIfNull(state); + ArgumentNullException.ThrowIfNull(fakeOrganizationService); ArgumentNullException.ThrowIfNull(organizationRequest); var target = organizationRequest.Target; @@ -18,22 +18,22 @@ public override UpsertResponse Execute(UpsertRequest organizationRequest, FakeOr var entityId = target.Id; bool recordCreated; - if (state.EntityExists(entityLogicalName, entityId)) + if (fakeOrganizationService.EntityExists(entityLogicalName, entityId)) { recordCreated = false; - state.Update(target); + fakeOrganizationService.Update(target); // Deep insert: sub-entities are always created even when the parent is updated if (target.RelatedEntities.Count > 0) { - DeepInsertProcessor.Process(entityLogicalName, entityId, target.RelatedEntities, state); + DeepInsertProcessor.Process(entityLogicalName, entityId, target.RelatedEntities, fakeOrganizationService); } } else { recordCreated = true; // state.Create routes through CreateFake which handles deep insert - entityId = state.Create(target); + entityId = fakeOrganizationService.Create(target); } var result = new UpsertResponse(); diff --git a/src/Digitall.Dataverse.Testing/OrganizationRequests/WhoAmIFake.cs b/src/Digitall.Dataverse.Testing/OrganizationRequests/WhoAmIFake.cs index c60fb9f..6587bad 100644 --- a/src/Digitall.Dataverse.Testing/OrganizationRequests/WhoAmIFake.cs +++ b/src/Digitall.Dataverse.Testing/OrganizationRequests/WhoAmIFake.cs @@ -8,20 +8,20 @@ namespace Digitall.Dataverse.Testing.OrganizationRequests; public class WhoAmIFake : OrganizationRequestFake { - public override WhoAmIResponse Execute(WhoAmIRequest organizationRequest, FakeOrganizationService state) + public override WhoAmIResponse Execute(WhoAmIRequest organizationRequest, FakeOrganizationService fakeOrganizationService) { - var userId = state.Options.UserId; + var userId = fakeOrganizationService.Options.UserId; var results = new ParameterCollection { { "UserId", userId } }; - var user = state.CreateQuery("systemuser").SingleOrDefault(u => u.Id == userId); + var user = fakeOrganizationService.CreateQuery("systemuser").SingleOrDefault(u => u.Id == userId); if (user != null) { - var buId = GetBusinessUnitId(user) ?? state.Options.BusinessUnitId; + var buId = GetBusinessUnitId(user) ?? fakeOrganizationService.Options.BusinessUnitId; results.Add("BusinessUnitId", buId); - var orgId = GetOrganizationId(state, user, buId); + var orgId = GetOrganizationId(fakeOrganizationService, user, buId); results.Add("OrganizationId", orgId); } diff --git a/src/Digitall.Dataverse.Testing/SpyOrganizationRequestFake.cs b/src/Digitall.Dataverse.Testing/SpyOrganizationRequestFake.cs index 33e533d..b36e1a9 100644 --- a/src/Digitall.Dataverse.Testing/SpyOrganizationRequestFake.cs +++ b/src/Digitall.Dataverse.Testing/SpyOrganizationRequestFake.cs @@ -17,9 +17,9 @@ public sealed class SpyOrganizationRequestFake(FuncAll requests captured by Execute calls. public List ReceivedRequests { get; } = []; - public override TRes Execute(TReq request, FakeOrganizationService organizationService) + public override TRes Execute(TReq request, FakeOrganizationService fakeOrganizationService) { ReceivedRequests.Add(request); - return handler?.Invoke(request, organizationService) ?? new TRes(); + return handler?.Invoke(request, fakeOrganizationService) ?? new TRes(); } } diff --git a/tests/Digitall.Dataverse.Testing.Tests/OrganizationRequests/RetrieveAttributeFakeTests.cs b/tests/Digitall.Dataverse.Testing.Tests/OrganizationRequests/RetrieveAttributeFakeTests.cs new file mode 100644 index 0000000..2a36290 --- /dev/null +++ b/tests/Digitall.Dataverse.Testing.Tests/OrganizationRequests/RetrieveAttributeFakeTests.cs @@ -0,0 +1,104 @@ +// Copyright (c) DIGITALL Nature. All rights reserved +// DIGITALL Nature licenses this file to you under the Microsoft Public License. + +using Digitall.Dataverse.Testing.OrganizationRequests; +using Microsoft.Xrm.Sdk.Messages; +using Microsoft.Xrm.Sdk.Metadata; + +namespace Digitall.Dataverse.Testing.Tests.OrganizationRequests; + +public class RetrieveAttributeFakeTests +{ + private FakeOrganizationService _sut = null!; + + [Before(Test)] + public async Task Setup() + { + _sut = new FakeOrganizationService(); + _sut.AddRequest(new RetrieveAttributeFake()); + await Task.CompletedTask; + } + + private static EntityMetadata CreateMetadataWithAttribute(string entityLogicalName, AttributeMetadata attribute) + { + var metadata = new EntityMetadata { LogicalName = entityLogicalName }; + + // Use reflection to set Attributes since it has no public setter + var attributesProperty = typeof(EntityMetadata).GetProperty(nameof(EntityMetadata.Attributes)); + attributesProperty!.SetValue(metadata, new[] { attribute }); + + return metadata; + } + + [Test] + public async Task Execute_RegisteredAttribute_ReturnsAttributeMetadata() + { + var nameAttribute = new StringAttributeMetadata("name") { LogicalName = "name" }; + _sut.AddMetadata(CreateMetadataWithAttribute("account", nameAttribute)); + + var response = (RetrieveAttributeResponse)_sut.Execute(new RetrieveAttributeRequest + { + EntityLogicalName = "account", + LogicalName = "name" + }); + + await Assert.That(response.AttributeMetadata).IsNotNull(); + await Assert.That(response.AttributeMetadata.LogicalName).IsEqualTo("name"); + } + + [Test] + public async Task Execute_NonRegisteredEntity_ThrowsException() + { + var nameAttribute = new StringAttributeMetadata("name") { LogicalName = "name" }; + _sut.AddMetadata(CreateMetadataWithAttribute("account", nameAttribute)); + + void Action() => _sut.Execute(new RetrieveAttributeRequest + { + EntityLogicalName = "contact", + LogicalName = "name" + }); + + Assert.Throws(Action); + await Task.CompletedTask; + } + + [Test] + public async Task Execute_NonRegisteredAttribute_ThrowsException() + { + var nameAttribute = new StringAttributeMetadata("name") { LogicalName = "name" }; + _sut.AddMetadata(CreateMetadataWithAttribute("account", nameAttribute)); + + void Action() => _sut.Execute(new RetrieveAttributeRequest + { + EntityLogicalName = "account", + LogicalName = "missing" + }); + + Assert.Throws(Action); + await Task.CompletedTask; + } + + [Test] + public async Task Execute_NullRequest_ThrowsArgumentNull() + { + void Action() => _sut.Execute(null!); + + Assert.Throws(Action); + await Task.CompletedTask; + } + + [Test] + public async Task Execute_ReturnsCorrectResponseType() + { + var nameAttribute = new StringAttributeMetadata("name") { LogicalName = "name" }; + _sut.AddMetadata(CreateMetadataWithAttribute("account", nameAttribute)); + + var response = _sut.Execute(new RetrieveAttributeRequest + { + EntityLogicalName = "account", + LogicalName = "name" + }); + + await Assert.That(response).IsTypeOf(); + } +}