private ExecuteMultipleResponseItemCollection GetFakeOrgServiceResponse(Guid id, DateTime modifiedOnDate, ICrmMetaDataProvider crmMetaDataProvider)
        {
            // This is a fake ExecuteMultipleResponse that will be returned to our sut at test time.
            var responses = new ExecuteMultipleResponseItemCollection();

            // fake response for insert.
            ExecuteMultipleResponseItem createResponse = GetCreateResponseItem(0, id);

            responses.Add(createResponse);

            // fake response for second insert.
            ExecuteMultipleResponseItem createResponseWithOutput = GetCreateResponseItem(1, null);

            responses.Add(createResponseWithOutput);

            // fake response for update.
            ExecuteMultipleResponseItem updateResponseItem = GetUpdateResponseItem(2);

            responses.Add(updateResponseItem);

            ExecuteMultipleResponseItem updateResponseItemWithOutput = GetUpdateResponseItem(3);

            responses.Add(updateResponseItemWithOutput);

            // This is a fake RetrieveResponse that will be returned to our sut at test time.
            var updatedContactEntity = new Entity("contact");

            updatedContactEntity.Id            = id;
            updatedContactEntity["contactid"]  = id;
            updatedContactEntity["modifiedon"] = modifiedOnDate;

            ExecuteMultipleResponseItem retrieveResponseItemForUpdateOutput = GetRetrieveResponseItem(4, updatedContactEntity);

            responses.Add(retrieveResponseItemForUpdateOutput);

            ExecuteMultipleResponseItem deleteResponseItem = GetDeleteResponseItem(5);

            responses.Add(deleteResponseItem);

            var entityDataGenerator = new EntityDataGenerator(crmMetaDataProvider);
            var entities            = entityDataGenerator.GenerateFakeEntities("contact", 10);
            EntityCollection            fakeEntityResults            = new EntityCollection(entities);
            ExecuteMultipleResponseItem retrieveMultipleResponseItem = GetRetrieveMultipleResponseItem(6, fakeEntityResults);

            responses.Add(retrieveMultipleResponseItem);

            return(responses);
        }
Esempio n. 2
0
        private List <BulkResponseItem> ReadExecuteMultipleResponse(ExecuteMultipleResponse executeMultipleResponse, Dictionary <string, OrganizationRequest> requests)
        {
            List <string> requestIds = requests.Keys.ToList();

            List <BulkResponseItem> responses = new List <BulkResponseItem>();

            if (executeMultipleResponse != null && executeMultipleResponse.Responses != null && executeMultipleResponse.Responses.Count > 0)
            {
                ExecuteMultipleResponseItemCollection responseItems = executeMultipleResponse.Responses;

                foreach (ExecuteMultipleResponseItem responseItem in responseItems)
                {
                    string requestKey = requestIds[responseItem.RequestIndex];

                    OrganizationRequest orgRequest = requests[requestKey];


                    BulkResponseItem bulkResponseItem = new BulkResponseItem();
                    bulkResponseItem.BulkRequestId = requestKey;
                    bulkResponseItem.Action        = GetActionName(orgRequest);

                    if (responseItem.Fault != null)
                    {
                        string message = GetFaultedMessage(responseItem);
                        bulkResponseItem.Error = message;
                    }
                    else
                    {
                        OrganizationResponse response = responseItem.Response;
                        Guid recordId = Guid.Empty;
                        if (response is CreateResponse)
                        {
                            bulkResponseItem.CreatedRecordId = ((CreateResponse)response).id;
                        }
                        else if (response is RetrieveMultipleResponse)
                        {
                            RetrieveMultipleResponse retrieveMultipleResponse = (RetrieveMultipleResponse)response;
                            bulkResponseItem.Results = (retrieveMultipleResponse != null) ? retrieveMultipleResponse.EntityCollection : null;
                        }

                        bulkResponseItem.Success = true;
                    }

                    responses.Add(bulkResponseItem);
                }
            }
            return(responses);
        }
        public void ActivateAll_SetActiveStateForAllSlas_Called()
        {
            var allSlas = new List <Entity>
            {
                new Entity("sla", Guid.NewGuid()),
                new Entity("sla", Guid.NewGuid()),
                new Entity("sla", Guid.NewGuid()),
            };

            this.crmServiceAdapterMock
            .Setup(x => x.RetrieveMultipleByAttribute("sla", "statecode", It.Is <object[]>(value => (int)value[0] == 0), null))
            .Returns(() =>
            {
                var entityCollection = new EntityCollection
                {
                    EntityName = "sla",
                };
                entityCollection.Entities.AddRange(allSlas);
                return(entityCollection);
            });

            this.crmServiceAdapterMock
            .Setup(x => x.UpdateStateAndStatusForEntityInBatch(
                       It.Is <EntityCollection>(collection => allSlas.All(sla => collection.Entities.Contains(sla))),
                       It.IsAny <int>(),
                       It.IsAny <int>()))
            .Returns((EntityCollection records, int statecode, int statuscode) =>
            {
                var responseItemCollection = new ExecuteMultipleResponseItemCollection
                {
                    new ExecuteMultipleResponseItem {
                    },
                    new ExecuteMultipleResponseItem {
                    },
                };

                var response = new ExecuteMultipleResponse();
                response.Results.Add("Responses", responseItemCollection);
                return(response);
            })
            .Verifiable();

            this.slaActivatorService.ActivateAll();

            this.crmServiceAdapterMock.Verify();
        }
Esempio n. 4
0
        public void ExecuteMultiple_Errors_LogErrors()
        {
            this.crmServiceAdapterMock
            .Setup(x => x.ExecuteMultiple(It.IsAny <List <OrganizationRequest> >(), It.IsAny <bool>(), It.IsAny <bool>()))
            .Returns(() =>
            {
                var responseItemCollection = new ExecuteMultipleResponseItemCollection
                {
                    new ExecuteMultipleResponseItem
                    {
                        Fault = new OrganizationServiceFault
                        {
                            Message = "Test fault response",
                        },
                    },
                    new ExecuteMultipleResponseItem {
                    },
                };

                var response = new ExecuteMultipleResponse();
                response.Results.Add("Responses", responseItemCollection);
                response.Results.Add("IsFaulted", true);
                return(response);
            });

            List <TableConfig> tableConfigs = new List <TableConfig>();

            ColumnConfig[] tableColumns = new ColumnConfig[]
            {
                GetAutonumberColumnConfig("test_autonumberone", 1000),
                GetAutonumberColumnConfig("test_autonumbertwo", 2000),
            };

            tableConfigs.Add(GetTableConfig("test_table", tableColumns));

            // Act
            this.tableColumnProcessingService.ProcessTables(tableConfigs);

            // Assert
            this.loggerMock.VerifyLog(x => x.LogError("Error processing requests for table columns"));
            this.loggerMock.VerifyLog(x => x.LogError("Test fault response"));
        }
Esempio n. 5
0
        private Mock <IExecuteMultipleResponseAdapter> GetExecuteMultipleResponseAdapter(IEnumerable <Guid> recordIds)
        {
            var executeMultipleResponseAdapter = new Mock <IExecuteMultipleResponseAdapter>();
            var responseCollection             = new ExecuteMultipleResponseItemCollection();

            responseCollection.AddRange(recordIds.Select(r => new ExecuteMultipleResponseItem()
            {
                Fault    = null,
                Response = new DeleteResponse()
                {
                    ResponseName = "delete",
                    Results      = new ParameterCollection {
                        { "id", r }
                    }
                }
            }));
            executeMultipleResponseAdapter
            .Setup(e => e.Responses)
            .Returns(responseCollection);
            return(executeMultipleResponseAdapter);
        }
Esempio n. 6
0
        public void Log_AutonumbersProcessed_AutonumberSeedRequestAdded()
        {
            // Arrage
            this.crmServiceAdapterMock
            .Setup(x => x.ExecuteMultiple(It.IsAny <List <OrganizationRequest> >(), It.IsAny <bool>(), It.IsAny <bool>()))
            .Returns(() =>
            {
                var responseItemCollection = new ExecuteMultipleResponseItemCollection
                {
                    new ExecuteMultipleResponseItem {
                    },
                    new ExecuteMultipleResponseItem {
                    },
                };

                var response = new ExecuteMultipleResponse();
                response.Results.Add("Responses", responseItemCollection);
                return(response);
            });

            List <TableConfig> tableConfigs = new List <TableConfig>();

            ColumnConfig[] tableColumns = new ColumnConfig[]
            {
                GetAutonumberColumnConfig("test_autonumberone", 1000),
                GetAutonumberColumnConfig("test_autonumbertwo", 2000),
            };

            tableConfigs.Add(GetTableConfig("test_table", tableColumns));

            // Act
            this.tableColumnProcessingService.ProcessTables(tableConfigs);

            // Assert
            this.loggerMock.VerifyLog(x => x.LogInformation("Adding auto-number seed request. Entity Name: test_table. Auto-number Attribute: test_autonumberone. Value: 1000"));
            this.loggerMock.VerifyLog(x => x.LogInformation("Adding auto-number seed request. Entity Name: test_table. Auto-number Attribute: test_autonumbertwo. Value: 2000"));
            this.crmServiceAdapterMock.Verify(svc => svc.ExecuteMultiple(It.IsAny <List <OrganizationRequest> >(), It.IsAny <bool>(), It.IsAny <bool>()));
        }
Esempio n. 7
0
        public void ExecuteMultiple_Requests_IsCalled()
        {
            // Arrange
            this.crmServiceAdapterMock
            .Setup(x => x.ExecuteMultiple(It.IsAny <List <OrganizationRequest> >(), It.IsAny <bool>(), It.IsAny <bool>()))
            .Returns(() =>
            {
                var responseItemCollection = new ExecuteMultipleResponseItemCollection
                {
                    new ExecuteMultipleResponseItem {
                    },
                    new ExecuteMultipleResponseItem {
                    },
                };

                var response = new ExecuteMultipleResponse();
                response.Results.Add("Responses", responseItemCollection);
                return(response);
            });

            List <TableConfig> tableConfigs = new List <TableConfig>();

            ColumnConfig[] tableColumns = new ColumnConfig[]
            {
                GetAutonumberColumnConfig("test_autonumberone", 1000),
                GetAutonumberColumnConfig("test_autonumbertwo", 2000),
            };

            tableConfigs.Add(GetTableConfig("test_table", tableColumns));

            // Act
            this.tableColumnProcessingService.ProcessTables(tableConfigs);

            // Assert
            this.loggerMock.VerifyLog(x => x.LogInformation("Executing requests for table columns."));
            this.crmServiceAdapterMock.Verify();
        }
        internal override OrganizationResponse Execute(OrganizationRequest orgRequest, EntityReference userRef)
        {
            var request   = MakeRequest <ExecuteMultipleRequest>(orgRequest);
            var toReturn  = new ExecuteMultipleResponse();
            var responses = new ExecuteMultipleResponseItemCollection();

            for (var i = 0; i < request.Requests.Count; i++)
            {
                var resp = new ExecuteMultipleResponseItem {
                    RequestIndex = i
                };
                var r = request.Requests[i];
                try {
                    var orgResp = core.Execute(r, userRef);
                    if (request.Settings.ReturnResponses)
                    {
                        resp.Response = orgResp;
                        responses.Add(resp);
                    }
                } catch (Exception e) {
                    resp.Fault = new OrganizationServiceFault {
                        Message   = e.Message,
                        Timestamp = DateTime.Now
                    };
                    responses.Add(resp);
                    if (!request.Settings.ContinueOnError)
                    {
                        toReturn.Results["Responses"] = responses;
                        toReturn.Results["IsFaulted"] = true;
                        return(toReturn);
                    }
                }
            }
            toReturn.Results["Responses"] = responses;
            toReturn.Results["IsFaulted"] = responses.Any(x => x.Fault != null);
            return(toReturn);
        }
        private DetectionResults GetUsageFetchAggregate(EntityMetadata emd, Settings settings, BackgroundWorker worker = null)
        {
            var result = new DetectionResults();

            List <AttributeMetadata> attributes = new List <AttributeMetadata>();

            var emRequest = new ExecuteMultipleRequest
            {
                Settings = new ExecuteMultipleSettings
                {
                    ContinueOnError = true,
                    ReturnResponses = true
                },
                Requests = new OrganizationRequestCollection()
            };

            var fetchXmlAttrPart = $"<attribute name=\"{emd.PrimaryIdAttribute}\" aggregate=\"count\" alias=\"count\"/>";

            emRequest.Requests.Add(new RetrieveMultipleRequest
            {
                Query = new FetchExpression(string.Format(FetchXml, emd.LogicalName, fetchXmlAttrPart, "", settings.RecordsReturnedPerTrip))
            });

            var allResult = new ExecuteMultipleResponseItemCollection();

            foreach (var attribute in MetadataHelper.FilterAttributes(emd.Attributes).OrderBy(a => a.LogicalName))
            {
                if (settings.FilterAttributes &&
                    settings.Filters.ContainsKey(emd.LogicalName))
                {
                    EntityFilterSetting fs = settings.Filters[emd.LogicalName];
                    if (fs.Attributes.Count > 0 &&
                        !fs.Attributes.Contains(attribute.LogicalName))
                    {
                        continue;
                    }
                    if (fs.ShowOnlyCustom && !attribute.IsCustomAttribute.Value)
                    {
                        continue;
                    }
                    if (fs.ShowOnlyStandard && attribute.IsCustomAttribute.Value)
                    {
                        continue;
                    }
                }

                attributes.Add(attribute);

                var fetchXmlConditionNotNullPart = $"<condition attribute=\"{attribute.LogicalName}\" operator=\"not-null\"/>";
                emRequest.Requests.Add(new RetrieveMultipleRequest
                {
                    Query =
                        new FetchExpression(string.Format(FetchXml, emd.LogicalName, fetchXmlAttrPart,
                                                          fetchXmlConditionNotNullPart, settings.RecordsReturnedPerTrip))
                });

                if (emRequest.Requests.Count == settings.AttributesReturnedPerTrip)
                {
                    var tempResults = (ExecuteMultipleResponse)service.Execute(emRequest);
                    allResult.AddRange(tempResults.Responses);

                    emRequest = new ExecuteMultipleRequest
                    {
                        Settings = new ExecuteMultipleSettings
                        {
                            ContinueOnError = true,
                            ReturnResponses = true
                        },
                        Requests = new OrganizationRequestCollection()
                    };
                }
            }

            var results = (ExecuteMultipleResponse)service.Execute(emRequest);

            allResult.AddRange(results.Responses);

            var allResponse = (RetrieveMultipleResponse)allResult[0].Response;

            if (allResult[0].Fault != null)
            {
                result.IsAggregateQueryRecordLimitReached = allResult[0].Fault.ErrorCode == -2147164125;
                result.Fault = allResult[0].Fault;
                return(result);
            }

            var allCount = allResponse != null
                ? allResponse.EntityCollection.Entities.First().GetAttributeValue <AliasedValue>("count")
                : null;

            var allCountValue = allCount != null ? (int)allCount.Value : 0;

            result.Total  = allCountValue;
            result.Entity = emd.LogicalName;

            foreach (var attribute in attributes)
            {
                var index         = attributes.IndexOf(attribute);
                var resultNotNull = allResult[index + 1];

                if (resultNotNull.Fault != null)
                {
                    result.Fault = resultNotNull.Fault;
                    return(result);
                }

                var notNullValueAliased =
                    ((RetrieveMultipleResponse)resultNotNull.Response).EntityCollection.Entities.First()
                    .GetAttributeValue <AliasedValue>("count");

                var notNullValue = (int?)notNullValueAliased?.Value ?? 0;

                result.Results.Add(new DetectionResult
                {
                    Attribute  = attribute,
                    NotNull    = notNullValue,
                    Percentage = allCountValue != 0 ? (double)notNullValue * 100 / allCountValue : 0
                });
            }

            return(result);
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var executeMultipleRequest = (ExecuteMultipleRequest)request;

            if (executeMultipleRequest.Settings == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "You need to pass a value for 'Settings' in execute multiple request");
            }

            if (executeMultipleRequest.Requests == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "You need to pass a value for 'Requests' in execute multiple request");
            }

            var service = ctx.GetFakedOrganizationService();

            var response = new ExecuteMultipleResponse();

            response.Results["Responses"] = new ExecuteMultipleResponseItemCollection();

            for (var i = 0; i < executeMultipleRequest.Requests.Count; i++)
            {
                var executeRequest = executeMultipleRequest.Requests[i];

                try
                {
                    service.Execute(executeRequest);

                    if (executeMultipleRequest.Settings.ReturnResponses)
                    {
                        response.Responses.Add(new ExecuteMultipleResponseItem
                        {
                            RequestIndex = i
                        });
                    }
                }
                catch (Exception ex)
                {
                    if (!response.IsFaulted)
                    {
                        response.Results["IsFaulted"] = true;
                    }

                    response.Responses.Add(new ExecuteMultipleResponseItem
                    {
                        Fault = new OrganizationServiceFault {
                            Message = ex.Message
                        },
                        RequestIndex = i
                    });

                    if (!executeMultipleRequest.Settings.ContinueOnError)
                    {
                        break;
                    }
                }
            }

            // Implement response behaviour as in https://msdn.microsoft.com/en-us/library/jj863631.aspx
            if (executeMultipleRequest.Settings.ReturnResponses)
            {
                response.Results["response.Responses"] = response.Responses;
            }
            else if (response.Responses.Any(resp => resp.Fault != null))
            {
                var failures = new ExecuteMultipleResponseItemCollection();

                failures.AddRange(response.Responses.Where(resp => resp.Fault != null));

                response.Results["response.Responses"] = failures;
            }

            return(response);
        }
Esempio n. 11
0
        protected virtual OrganizationResponse ExecuteOrganisationRequest()
        {
            var dbCommand = DbCommand;
            var orgService = dbCommand.CrmDbConnection.OrganizationService;

            // Execute the request and obtain the result.
            OrganizationResponse response = null;

            // If this operation is part of a batch of operations, then the request,
            // is executed allready at the batch level.
            if (this.BatchOperation == null)
            {
                // otherwise, execute the individual request for this operation.
                response = orgService.Execute(Request);
            }
            else
            {
                // grab the response for this operation from the batch responses.
                var multiPart = this as IMultipartOperation;
                if (multiPart != null && multiPart.HasMultipleRequests)
                {
                    // rebuild an ExecuteMultipleResponse to contain just the responses for this multipart operation.
                    var responses = new ExecuteMultipleResponseItemCollection();
                    ExecuteMultipleResponse multipleResponse = new ExecuteMultipleResponse
                {
                    Results = new ParameterCollection
                    {
                        { "Responses", responses },
                        { "IsFaulted", this.BatchOperation.BatchResponse.IsFaulted}
                    }
                };

                    for (int i = 0; i < multiPart.RequestCount; i++)
                    {
                        int reqIndex = this.BatchRequestIndex + i;
                        var resp = this.BatchOperation.BatchResponse.Responses[reqIndex];
                        responses.Add(resp);
                    }

                    return multipleResponse;
                }

                return this.BatchOperation.BatchResponse.Responses[this.BatchRequestIndex].Response;
            }

            // Allow poeople to get access to the response directly via an output paramater.
            AssignResponseParameter(dbCommand, response);
            return response;
        }
Esempio n. 12
0
        public void BatchTest()
        {
            Mock <IOrganizationService> orgSvc = null;
            Mock <MoqHttpMessagehander> fakHttpMethodHander = null;
            ServiceClient cli = null;

            testSupport.SetupMockAndSupport(out orgSvc, out fakHttpMethodHander, out cli);


            CreateResponse createResponse = new CreateResponse();

            createResponse.Results = new ParameterCollection();
            createResponse.Results.Add("annotationid", testSupport._DefaultId);

            ExecuteMultipleResponseItem responseItem = new ExecuteMultipleResponseItem();

            responseItem.Response     = createResponse;
            responseItem.RequestIndex = 0;

            ExecuteMultipleResponseItemCollection responseItems = new ExecuteMultipleResponseItemCollection();

            responseItems.Add(responseItem);

            ExecuteMultipleResponse executeMultipleResponse = new ExecuteMultipleResponse();

            executeMultipleResponse.Results = new ParameterCollection();
            executeMultipleResponse.Results.Add("Responses", responseItems);

            orgSvc.Setup(req1 => req1.Execute(It.IsAny <ExecuteMultipleRequest>())).Returns(executeMultipleResponse);


            // Setup a batch
            string BatchRequestName = "TestBatch";
            Guid   batchid          = cli.CreateBatchOperationRequest(BatchRequestName);

            // use create operation to setup request
            Dictionary <string, DataverseDataTypeWrapper> newFields = new Dictionary <string, DataverseDataTypeWrapper>();

            newFields.Add("name", new DataverseDataTypeWrapper("CrudTestAccount", DataverseFieldType.String));
            newFields.Add("accountnumber", new DataverseDataTypeWrapper("12345", DataverseFieldType.String));
            newFields.Add("telephone1", new DataverseDataTypeWrapper("555-555-5555", DataverseFieldType.String));
            newFields.Add("donotpostalmail", new DataverseDataTypeWrapper(true, DataverseFieldType.Boolean));

            // issue request as a batch:
            Guid result = cli.CreateAnnotation("account", testSupport._DefaultId, newFields, batchid);

            Assert.Equal <Guid>(Guid.Empty, result);

            OrganizationRequest req = cli.GetBatchRequestAtPosition(batchid, 0);

            // Executes the batch request.
            cli.ExecuteBatch(batchid);

            // Request Batch by name
            Guid OperationId = cli.GetBatchOperationIdRequestByName(BatchRequestName);

            // Request batch back
            RequestBatch reqBatch = cli.GetBatchById(batchid);

            Assert.NotNull(reqBatch);
            Assert.Equal(BatchRequestName, reqBatch.BatchName);
            Assert.True(reqBatch.BatchItems.Count == 1);

            // Release batch request
            cli.ReleaseBatchInfoById(batchid);
        }
        public void Should_Be_Able_To_Execute_A_Batch_Of_Statements_And_Get_Multiple_Results_Stress()
        {
            // Arrange
            using (var sandbox = ConnectionTestsSandbox.Create())
            {
                var dbConnection = sandbox.Container.Resolve <CrmDbConnection>();

                Guid   id        = Guid.Parse("9bf20a16-6034-48e2-80b4-8349bb80c3e2");
                string insertSql = string.Format("INSERT INTO contact (contactid, firstname, lastname) VALUES ('{0}','billy','bob');", id);
                string insertSqlWithOutputClause = "INSERT INTO contact (firstname, lastname) OUTPUT INSERTED.contactid VALUES ('bat','man');";
                string updateSql = string.Format("UPDATE contact SET firstname = 'john', lastname = 'doe' WHERE contactid = '{0}';", id);
                string updateSqlWithOutputClause = string.Format("UPDATE contact SET firstname = 'johny', lastname = 'doe' OUTPUT INSERTED.modifiedon WHERE contactid = '{0}';", id);
                string deleteSql = string.Format("DELETE FROM contact WHERE contactid = '{0}';", id);
                string selectSql = "SELECT TOP 10 firstname, lastname FROM contact ORDER BY lastname ASC;";

                var sql = insertSql + insertSqlWithOutputClause + updateSql + updateSqlWithOutputClause + deleteSql + selectSql;

                var provider = new SqlGenerationCrmOperationProvider(new DynamicsAttributeTypeProvider());

                // prepare a fake org service response
                DateTime expectedOutputModifiedOnDate = DateTime.UtcNow;
                ExecuteMultipleResponseItemCollection fakeOrgServiceResponses = GetFakeOrgServiceResponse(id, expectedOutputModifiedOnDate, sandbox.FakeMetadataProvider);
                var executeMultipleResponse = new ExecuteMultipleResponse
                {
                    Results = new ParameterCollection
                    {
                        { "Responses", fakeOrgServiceResponses },
                        { "IsFaulted", false }
                    }
                };

                // Setup fake org service to return fake response.
                sandbox.FakeOrgService.Stub(f => f.Execute(Arg <OrganizationRequest> .Matches(new OrganizationRequestMessageConstraint <ExecuteMultipleRequest>())))
                .WhenCalled(x =>
                {
                    var request = ((ExecuteMultipleRequest)x.Arguments[0]);
                }).Return(executeMultipleResponse);

                /// Execute a batch command multiple times..
                dbConnection.Open();
                for (int i = 0; i < 30; i++)
                {
                    var batchCommand = new CrmDbCommand(dbConnection);
                    batchCommand.CommandText = sql;
                    batchCommand.CommandType = System.Data.CommandType.Text;
                    var orgCommand = provider.GetOperation(batchCommand, System.Data.CommandBehavior.Default);


                    // Act
                    var sut           = CrmOperationExecutor.Instance;
                    var commandResult = sut.ExecuteOperation(orgCommand);

                    // SHould have more results.
                    Assert.That(commandResult.HasMoreResults);

                    // First result for insert.
                    Assert.That(commandResult.ResultSet != null);

                    // Should have one row containing inserted record id.
                    var reader = commandResult.GetReader();
                    Assert.That(reader.HasRows);
                    Assert.That(reader.FieldCount == 1);

                    while (reader.Read())
                    {
                        // Assert.That(reader.GetDateTime(0), NUnit.Framework.Is.EqualTo(createdOnDate));
                        Assert.That(reader.GetGuid(0), NUnit.Framework.Is.EqualTo(id));
                    }


                    // Move to second result for insert plus output.
                    reader.NextResult();
                    Assert.That(commandResult.ResultSet != null);

                    // Should have one row containing inserted record id.
                    Assert.That(reader.HasRows);
                    Assert.That(reader.FieldCount == 1);

                    while (reader.Read())
                    {
                        // Assert.That(reader.GetDateTime(0), NUnit.Framework.Is.EqualTo(createdOnDate));
                        Assert.That(reader.GetGuid(0), NUnit.Framework.Is.Not.Null);
                    }

                    // Move to third result for update.
                    reader.NextResult();
                    Assert.That(commandResult.ResultSet != null);

                    // Move to fourth result for update plus output.
                    reader.NextResult();
                    Assert.That(commandResult.ResultSet != null);

                    // Should have one row containing output clause values.
                    Assert.That(reader.HasRows);
                    Assert.That(reader.FieldCount == 1);

                    while (reader.Read())
                    {
                        Assert.That(reader.GetDateTime(0), NUnit.Framework.Is.EqualTo(expectedOutputModifiedOnDate));
                        //Assert.That(reader.GetGuid(0), NUnit.Framework.Is.EqualTo(id));
                    }

                    // Move to fifth result for delete.
                    reader.NextResult();
                    Assert.That(commandResult.ResultSet != null);

                    // no result set..

                    // Move to sixth result for retrieve multiple.
                    reader.NextResult();
                    Assert.That(commandResult.ResultSet != null);
                    Assert.That(commandResult.ResultSet.ResultCount() == 10);
                    Assert.That(commandResult.ResultSet.HasColumnMetadata());

                    Assert.That(reader.HasRows);
                    Assert.That(reader.FieldCount == 2);
                    int recordCount = 0;
                    while (reader.Read())
                    {
                        recordCount++;
                        Assert.That(reader.GetString(0), NUnit.Framework.Is.Not.Null);
                        //  Assert.That(reader.GetGuid(0), NUnit.Framework.Is.EqualTo(id));
                    }

                    Assert.That(recordCount == 10);
                }
            }
        }
        public void Should_Be_Able_To_Execute_An_Update_With_Output_Clause_And_Get_Back_Values()
        {
            // Arrange
            using (var sandbox = ConnectionTestsSandbox.Create())
            {
                var dbConnection = sandbox.Container.Resolve <CrmDbConnection>();

                var command = new CrmDbCommand(dbConnection);
                command.CommandText = "UPDATE contact SET firstname = 'JO', lastname = 'SCHMO' OUTPUT INSERTED.modifiedon, INSERTED.contactid WHERE contactid = '9bf20a16-6034-48e2-80b4-8349bb80c3e2'";
                command.CommandType = System.Data.CommandType.Text;

                var provider   = new SqlGenerationCrmOperationProvider(new DynamicsAttributeTypeProvider());
                var orgCommand = provider.GetOperation(command, System.Data.CommandBehavior.Default);

                // This is a fake CreateResponse that will be returned to our sut at test time.
                Guid expectedId     = Guid.Parse("9bf20a16-6034-48e2-80b4-8349bb80c3e2");
                var  createResponse = new UpdateResponse
                {
                    Results = new ParameterCollection()
                };

                // This is a fake RetrieveResponse that will be returned to our sut at test time.
                var resultEntity = new Entity("contact");
                resultEntity.Id           = expectedId;
                resultEntity["contactid"] = expectedId;
                var modifiedOnDate = DateTime.UtcNow;
                resultEntity["modifiedon"] = modifiedOnDate;
                var retrieveResponse = new RetrieveResponse
                {
                    Results = new ParameterCollection
                    {
                        { "Entity", resultEntity }
                    }
                };

                // This is a fake ExecuteMultipleResponse that will be returned to our sut at test time.
                var responses          = new ExecuteMultipleResponseItemCollection();
                var updateResponseItem = new ExecuteMultipleResponseItem();
                updateResponseItem.RequestIndex = 0;
                updateResponseItem.Response     = createResponse;
                responses.Add(updateResponseItem);

                var retrieveResponseItem = new ExecuteMultipleResponseItem();
                retrieveResponseItem.RequestIndex = 1;
                retrieveResponseItem.Response     = retrieveResponse;
                responses.Add(retrieveResponseItem);

                var executeMultipleResponse = new ExecuteMultipleResponse
                {
                    Results = new ParameterCollection
                    {
                        { "Responses", responses },
                        { "IsFaulted", false }
                    }
                };

                // Setup fake org service to return fake response.
                sandbox.FakeOrgService.Stub(f => f.Execute(Arg <OrganizationRequest> .Matches(new OrganizationRequestMessageConstraint <ExecuteMultipleRequest>())))
                .WhenCalled(x =>
                {
                    var request = ((ExecuteMultipleRequest)x.Arguments[0]);
                }).Return(executeMultipleResponse);

                // Act

                var sut = CrmOperationExecutor.Instance;
                dbConnection.Open();

                var commandResult = sut.ExecuteOperation(orgCommand);
                var results       = commandResult.ResultSet;

                //var results = sut.ExecuteCommand(orgCommand, System.Data.CommandBehavior.Default);

                // Assert

                // Should have 1 result, with the 2 output fields - createdon, and contactid
                Assert.That(results.ResultCount() == 1);
                Assert.That(results.HasColumnMetadata());

                var reader = commandResult.GetReader();
                Assert.That(reader.HasRows);
                Assert.That(reader.FieldCount == 2);

                while (reader.Read())
                {
                    Assert.That(reader.GetDateTime(0), NUnit.Framework.Is.EqualTo(modifiedOnDate));
                    Assert.That(reader.GetGuid(1), NUnit.Framework.Is.EqualTo(expectedId));
                }
            }
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var executeMultipleRequest = (ExecuteMultipleRequest)request;

            if (executeMultipleRequest.Settings == null)
            {
                throw new FaultException<OrganizationServiceFault>(new OrganizationServiceFault(), "You need to pass a value for 'Settings' in execute multiple request");
            }

            if (executeMultipleRequest.Requests == null)
            {
                throw new FaultException<OrganizationServiceFault>(new OrganizationServiceFault(), "You need to pass a value for 'Requests' in execute multiple request");
            }

            var service = ctx.GetFakedOrganizationService();

            var response = new ExecuteMultipleResponse();
            response.Results["Responses"] = new ExecuteMultipleResponseItemCollection();

            for (var i = 0; i < executeMultipleRequest.Requests.Count; i++)
            {
                var executeRequest = executeMultipleRequest.Requests[i];

                try
                {
                    service.Execute(executeRequest);

                    if (executeMultipleRequest.Settings.ReturnResponses)
                    {
                        response.Responses.Add(new ExecuteMultipleResponseItem
                        {
                            RequestIndex = i
                        });
                    }
                }
                catch (Exception ex)
                {
                    if (!response.IsFaulted)
                    {
                        response.Results["IsFaulted"] = true;
                    }

                    response.Responses.Add(new ExecuteMultipleResponseItem
                    {
                        Fault = new OrganizationServiceFault { Message = ex.Message },
                        RequestIndex = i
                    });

                    if (!executeMultipleRequest.Settings.ContinueOnError)
                    {
                        break;
                    }
                }
            }

            // Implement response behaviour as in https://msdn.microsoft.com/en-us/library/jj863631.aspx
            if (executeMultipleRequest.Settings.ReturnResponses)
            {
                response.Results["response.Responses"] = response.Responses;
            }
            else if (response.Responses.Any(resp => resp.Fault != null))
            {
                var failures = new ExecuteMultipleResponseItemCollection();

                failures.AddRange(response.Responses.Where(resp => resp.Fault != null));

                response.Results["response.Responses"] = failures;
            }

            return response;
        }