public static FakeOrganzationService ExpectRetrieveMultipleOfApprovalRequest(
            this FakeOrganzationService service, ExpectRetrieveMultipleOfApprovalRequestResult expectedResult)
        {
            return(service.ExpectRetrieveMultiple(
                       query =>
            {
                var queryExpression = query as QueryExpression;
                Assert.IsNotNull(
                    queryExpression,
                    "Retrieve Multiple expected Query Expression and received something else.");


                switch (expectedResult)
                {
                case ExpectRetrieveMultipleOfApprovalRequestResult.NullResult:
                    return null;

                case ExpectRetrieveMultipleOfApprovalRequestResult.OneChild:
                    var result = new EntityCollection();
                    result.Entities.Add(new Entity(queryExpression.EntityName)
                    {
                        Id = Guid.NewGuid()
                    });
                    return result;

                case ExpectRetrieveMultipleOfApprovalRequestResult.NoChild:
                    return new EntityCollection();
                }

                return null;
            }));
        }
        public void TestIncorrectCallSequences()
        {
            // Arrange emulator
            var service = new FakeOrganzationService();

            service.ExpectCreate((entity) =>
            {
                return(Guid.NewGuid());
            }).ExpectUpdate((entity) =>
            {
            });

            // Act
            IOrganizationService svc = service;
            var account = new Entity("account");

            account.Id = svc.Create(account);
            try
            {
                svc.Retrieve(account.LogicalName, account.Id, new ColumnSet("name"));
                Assert.Fail("Should fail");
            }
            catch (Exception ex)
            {
                Assert.AreEqual("Fake Organization Service expected 'Update' but 'Retrieve' was called", ex.Message);
            }

            // Assert
            service.AssertExpectedCalls();
        }
        public void TestSingleCallSequence()
        {
            // Arrange emulator
            var    service        = new FakeOrganzationService();
            Entity createdAccount = null;

            service.ExpectCreate((entity) =>
            {
                createdAccount = entity;
                return(Guid.NewGuid());
            }).ExpectUpdate((entity) =>
            {
                // Check the ID is the same
                Assert.AreEqual(createdAccount.Id, entity.Id, "Account ids must match on update");
            }).ExpectRetrieve((entityName, id, columnSet) => {
                return(createdAccount);
            }).ExpectRetrieveMultiple((query) =>
            {
                // Check the fetch query
                FetchExpression fetch = query as FetchExpression;
                Assert.IsTrue(fetch.Query.Contains("<condition attribute='name' operator='eq' value='test' />"));
                return(new EntityCollection());
            }).ExpectDelete((entityName, id) => {
                Assert.AreEqual(createdAccount.Id, id, "Account ids must match on delete");
            });

            // Act
            IOrganizationService svc = service;
            var account = new Entity("account");

            account.Id = svc.Create(account);
            svc.Update(account);
            svc.Retrieve(account.LogicalName, account.Id, new ColumnSet(true));
            svc.RetrieveMultiple(new FetchExpression(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                                        <entity name='account'>
                                                        <attribute name='name' />
                                                        <attribute name='primarycontactid' />
                                                        <attribute name='telephone1' />
                                                        <attribute name='accountid' />
                                                        <order attribute='name' descending='false' />
                                                        <filter type='and'>
                                                            <condition attribute='name' operator='eq' value='test' />
                                                        </filter>
                                                        </entity>
                                                    </fetch>"));

            svc.Delete(account.LogicalName, account.Id);

            // Assert
            service.AssertExpectedCalls();
        }
        public void TestIncorrectCallCount()
        {
            // Arrange emulator
            var service = new FakeOrganzationService();

            service.ExpectCreate((entity) =>
            {
                return(Guid.NewGuid());
            }).ExpectUpdate((entity) =>
            {
            });

            // Act
            IOrganizationService svc = service;
            var account = new Entity("account");

            svc.Create(account);

            // Assert
            Assert.IsFalse(service.ExpectedCalls(), "Incorrect call count should cause assert to fail");
        }
        public static FakeOrganzationService ExpectActionTakenUpdate(
            this FakeOrganzationService service,
            EntityReference targetApprovalRequest,
            Entity target)
        {
            return(service.ExpectUpdate(
                       (updateEntity) =>
            {
                Assert.AreEqual(
                    targetApprovalRequest,
                    updateEntity.ToEntityReference(),
                    "It is not updating the correct approval request record or the entity type is incorrect.");

                Assert.AreEqual(
                    target.ToEntityReference(),
                    updateEntity.GetAttributeValue <EntityReference>("fdbzap_ar_actiontaken"),
                    "Action Taken does not reference the action ran.");

                Assert.AreEqual(
                    4,
                    updateEntity.GetAttributeValue <OptionSetValue>("statuscode").Value,
                    "Statuscode should be 4, action taken.");
            }));
        }