public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var assignRequest = (AssignRequest)request;

            var target = assignRequest.Target;
            var assignee = assignRequest.Assignee;

            if (target == null)
            {
                throw new FaultException<OrganizationServiceFault>(new OrganizationServiceFault(), "Can not assign without target");
            }

            if (assignee == null)
            {
                throw new FaultException<OrganizationServiceFault>(new OrganizationServiceFault(), "Can not assign without assignee");
            }

            var service = ctx.GetFakedOrganizationService();

            var assignment = new Entity
            {
                LogicalName = target.LogicalName,
                Id = target.Id,
                Attributes = new AttributeCollection
                {
                    { "ownerid", assignee }
                }
            };

            service.Update(assignment);

            return new AssignResponse();
        }
示例#2
0
        public void When_ordering_by_datetime_fields_expected_result_is_returned()
        {
            List<Entity> contactList = new List<Entity>();

            var now = DateTime.UtcNow;
            Entity contact1 = new Entity("contact");
            contact1.Id = Guid.NewGuid();
            contact1.Attributes["firstname"] = "Fred";
            contact1.Attributes["new_orderbyfield"] = now;

            Entity contact2 = new Entity("contact");
            contact2.Id = Guid.NewGuid();
            contact2.Attributes["firstname"] = "Jo";
            contact2.Attributes["new_orderbyfield"] = now.AddDays(1);

            contactList.Add(contact2);
            contactList.Add(contact1);

            var context = new XrmFakedContext();
            context.Initialize(contactList);
            var service = context.GetFakedOrganizationService();

            QueryExpression qry = new QueryExpression("contact");
            qry.ColumnSet = new ColumnSet(true);
            qry.AddOrder("new_orderbyfield", OrderType.Ascending);
            var results = service.RetrieveMultiple(qry);

            var firstResultValue = (DateTime)results.Entities[0]["new_orderbyfield"];

            Assert.Equal(now, firstResultValue);
        }
        public void When_set_state_request_is_called_an_entity_is_updated()
        {
            var context = new XrmFakedContext();
            context.ProxyTypesAssembly = Assembly.GetExecutingAssembly();
            var service = context.GetFakedOrganizationService();

            var c = new Contact() {
                Id = Guid.NewGuid()
            }; 
            context.Initialize(new[] { c });

            var request = new SetStateRequest
            {
                EntityMoniker = c.ToEntityReference(),
                State = new OptionSetValue(69), 
                Status = new OptionSetValue(6969),
            };

            var response = service.Execute(request);

            //Retrieve record after update
            var contact = (from con in context.CreateQuery<Contact>()
                           where con.Id == c.Id
                           select con).FirstOrDefault();

            Assert.Equal((int) contact.StateCode.Value, 69);
            Assert.Equal((int) contact.StatusCode.Value, 6969);
        }
        public void When_Executing_Assign_Request_New_Owner_Should_Be_Assigned()
        {
            var oldOwner = new EntityReference("systemuser", Guid.NewGuid());
            var newOwner = new EntityReference("systemuser", Guid.NewGuid());

            var account = new Account
            {
                Id = Guid.NewGuid(),
                OwnerId = oldOwner
            };

            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            context.Initialize(new [] { account });

            var assignRequest = new AssignRequest
            {
                Target = account.ToEntityReference(),
                Assignee = newOwner
            };
            service.Execute(assignRequest);

            Assert.Equal(newOwner, account.OwnerId);
        }
示例#5
0
        public void When_ordering_by_money_fields_descending_expected_result_is_returned()
        {
            List<Entity> contactList = new List<Entity>();

            Entity contact1 = new Entity("contact");
            contact1.Id = Guid.NewGuid();
            contact1.Attributes["firstname"] = "Fred";
            contact1.Attributes["lastname"] = "Bloggs";
            contact1.Attributes["new_somefield"] = new Money(12345); // (decimal)678910 

            Entity contact2 = new Entity("contact");
            contact2.Id = Guid.NewGuid();
            contact2.Attributes["firstname"] = "Jo";
            contact2.Attributes["lastname"] = "Bloggs";
            contact2.Attributes["new_somefield"] = new Money(678910); // (decimal)678910 


            contactList.Add(contact2);
            contactList.Add(contact1);

            var context = new XrmFakedContext();
            context.Initialize(contactList);
            var service = context.GetFakedOrganizationService();

            QueryExpression qry = new QueryExpression("contact");
            qry.ColumnSet = new ColumnSet(true);
            qry.AddOrder("new_somefield", OrderType.Descending);
            var results = service.RetrieveMultiple(qry);

            var firstResultValue = results.Entities[0]["new_somefield"] as Money;

            Assert.Equal(678910M, firstResultValue.Value);
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var associateRequest = request as AssociateRequest;
            var service = ctx.GetFakedOrganizationService();

            if (associateRequest == null)
            {
                throw new Exception("Only associate request can be processed!");
            }

            var associateRelationship = associateRequest.Relationship;
            var relationShipName = associateRelationship.SchemaName;
            var fakeRelationShip = ctx.GetRelationship(relationShipName);

            if (fakeRelationShip == null)
            {
                throw new Exception(string.Format("Relationship {0} does not exist in the metadata cache", relationShipName));
            }

            if (associateRequest.Target == null)
            {
                throw new Exception("Association without target is invalid!");
            }

            foreach (var relatedEntityReference in associateRequest.RelatedEntities)
            {
                if (fakeRelationShip.RelationshipType == XrmFakedRelationship.enmFakeRelationshipType.ManyToMany)
                {
                    var association = new Entity(fakeRelationShip.IntersectEntity)
                    {
                        Attributes = new AttributeCollection
                        {
                            { fakeRelationShip.Entity1Attribute, associateRequest.Target.Id },
                            { fakeRelationShip.Entity2Attribute, relatedEntityReference.Id }
                        }
                    };

                    service.Create(association);
                }
                else
                {
                    //One to many
                    //Get entity to update
                    var entityToUpdate = new Entity(relatedEntityReference.LogicalName)
                    {
                        Id = relatedEntityReference.Id
                    };

                    entityToUpdate[fakeRelationShip.Entity2Attribute] = associateRequest.Target;
                    service.Update(entityToUpdate);
                }

            }

            return new AssociateResponse ();
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var createRequest = (CreateRequest)request;
            
            var service = ctx.GetFakedOrganizationService();

            service.Create(createRequest.Target);

            return new CreateResponse();
        }
        public void When_calling_publish_xml_exception_is_raised_if_parameter_xml_is_blank()
        {
            var ctx = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new PublishXmlRequest()
            {
                ParameterXml = ""
            };

            Assert.Throws<Exception>(() => service.Execute(req));
        }
        public void When_calling_insert_option_set_value_without_optionsetname_exception_is_thrown()
        {
            var ctx = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new InsertOptionValueRequest()
            {
                Label = new Label("Yeah! This is a fake label!", 0)
            };

            Assert.Throws<Exception>(() => service.Execute(req));
        }
        public void When_calling_publish_xml_no_exception_is_raised()
        {
            var ctx = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new PublishXmlRequest()
            {
                ParameterXml = "<somexml></somexml>"
            };

            Assert.DoesNotThrow(() => service.Execute(req));
        }
        public static void When_retrieve_attribute_request_is_called_an_exception_is_not_thrown()
        {
            var context = new XrmFakedContext();
            
            var service = context.GetFakedOrganizationService();
            RetrieveAttributeRequest req = new RetrieveAttributeRequest()
            {
                EntityLogicalName = "account",
                LogicalName = "name"
            };

            Assert.Throws<PullRequestException>(() => service.Execute(req));
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var createRequest = (CreateRequest)request;

            var service = ctx.GetFakedOrganizationService();

            var guid = service.Create(createRequest.Target);

            return new CreateResponse()
            {
                ResponseName = "Create",
                Results = new ParameterCollection { { "id", guid } }
            };
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var deleteRequest = (DeleteRequest)request;

            var target = deleteRequest.Target;

            if (target == null)
            {
                throw new FaultException<OrganizationServiceFault>(new OrganizationServiceFault(), "Can not delete without target");
            }

            var service = ctx.GetFakedOrganizationService();
            service.Delete(target.LogicalName, target.Id);

            return new DeleteResponse();
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var disassociateRequest = request as DisassociateRequest;
            var service = ctx.GetFakedOrganizationService();

            if (disassociateRequest == null)
            {
                throw new Exception("Only disassociate request can be processed!");
            }

            var relationShipName = disassociateRequest.Relationship.SchemaName;
            var relationShip = ctx.GetRelationship(relationShipName);

            if (relationShip == null)
            {
                throw new Exception(string.Format("Relationship {0} does not exist in the metadata cache", relationShipName));
            }

            if (disassociateRequest.Target == null)
            {
                throw new Exception("Disassociation without target is invalid!");
            }

            foreach (var relatedEntity in disassociateRequest.RelatedEntities)
            {
                var query = new QueryExpression(relationShip.IntersectEntity)
                {
                    ColumnSet = new ColumnSet(true),
                    Criteria = new FilterExpression(LogicalOperator.And)
                };

                query.Criteria.AddCondition(new ConditionExpression(relationShip.Entity1Attribute,
                    ConditionOperator.Equal, disassociateRequest.Target.Id));
                query.Criteria.AddCondition(new ConditionExpression(relationShip.Entity2Attribute,
                    ConditionOperator.Equal, relatedEntity.Id));

                var results = service.RetrieveMultiple(query);

                if (results.Entities.Count == 1)
                {
                    service.Delete(relationShip.IntersectEntity, results.Entities.First().Id);
                }
            }

            return new DisassociateResponse();
        }
        public static void Should_Execute_Subsequent_Requests()
        {
            var context = new XrmFakedContext();

            var service = context.GetFakedOrganizationService();

            var account1 = new Account
            {
                Id = Guid.NewGuid(),
                Name = "Acc1"
            };

            var account2 = new Account
            {
                Id = Guid.NewGuid(),
                Name = "Acc2"
            };

            var executeMultipleRequest = new ExecuteMultipleRequest
            {
                Settings = new ExecuteMultipleSettings
                {
                    ReturnResponses = true
                },
                Requests = new OrganizationRequestCollection
                {
                    new CreateRequest
                    {
                        Target = account1
                    },

                    new CreateRequest
                    {
                        Target = account2
                    }
                }
            };

            var response = service.Execute(executeMultipleRequest) as ExecuteMultipleResponse;
            
            Assert.False(response.IsFaulted);
            Assert.NotEmpty(response.Responses);

            Assert.NotNull(service.Retrieve(Account.EntityLogicalName, account1.Id, new ColumnSet(true)));
            Assert.NotNull(service.Retrieve(Account.EntityLogicalName, account2.Id, new ColumnSet(true)));
        }
        public void When_calling_context_add_and_save_changes_entity_is_added_to_the_faked_context()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            using(var ctx = new XrmServiceContext(service))
            {
                ctx.AddObject(new Account() { Name = "Test account" });
                ctx.SaveChanges();

                var account = ctx.CreateQuery<Account>()
                            .ToList()
                            .FirstOrDefault();

                Assert.Equal("Test account", account.Name);
            }
        }
        public void When_calling_context_add_addrelated_and_save_changes_entities_are_added_to_the_faked_context()
        {
            var context = new XrmFakedContext();

            var relationship = new XrmFakedRelationship()
            {
                IntersectEntity = "accountleads",
                Entity1Attribute = "accountid",
                Entity2Attribute = "leadid",
                Entity1LogicalName = "account",
                Entity2LogicalName = "lead"
            };
            context.AddRelationship("accountleads", relationship);

            var service = context.GetFakedOrganizationService();

            using (var ctx = new XrmServiceContext(service))
            {
                var account = new Account() { Name = "Test account" };
                ctx.AddObject(account);

                var contact = new Lead() { FirstName = "Jane", LastName = "Doe" };
                ctx.AddRelatedObject(account, new Relationship("accountleads"), contact);
                var result = ctx.SaveChanges();

                var resultaccount = ctx.CreateQuery<Account>()
                                       .ToList()
                                       .FirstOrDefault();

                Assert.NotNull(resultaccount);
                Assert.Equal("Test account", resultaccount.Name);

                var reaultlead = ctx.CreateQuery<Lead>()
                                    .ToList()
                                    .FirstOrDefault();

                Assert.NotNull(reaultlead);
                Assert.Equal("Jane", reaultlead.FirstName);
                Assert.Equal("Doe", reaultlead.LastName);

                var relationshipRecords = ctx.CreateQuery("accountleads")
                                             .ToList();
                Assert.NotEmpty(relationshipRecords);
            }
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var executeTransactionRequest = (ExecuteTransactionRequest)request;
            var response = new ExecuteTransactionResponse { ["Responses"] = new OrganizationResponseCollection() };

            var service = ctx.GetFakedOrganizationService();

            foreach (var r in executeTransactionRequest.Requests)
            {
                var result = service.Execute(r);

                if (executeTransactionRequest.ReturnResponses.HasValue && executeTransactionRequest.ReturnResponses.Value)
                {
                    response.Responses.Add(result);        
                }
            }
            return response;
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var req = request as SetStateRequest;

            //We are going to translate a SetStateRequest into an update message basically

            var entityName = req.EntityMoniker.LogicalName;
            var guid = req.EntityMoniker.Id;

            var entityToUpdate = new Entity(entityName) { Id = guid };
            entityToUpdate["statecode"] = req.State;
            entityToUpdate["statuscode"] = req.Status;

            var fakedService = ctx.GetFakedOrganizationService();
            fakedService.Update(entityToUpdate);

            return new SetStateResponse();
        }
        public void Should_set_a_statecode_by_default_when_an_entity_record_is_added_to_the_context()
        {
            var context = new XrmFakedContext();
            context.ProxyTypesAssembly = Assembly.GetExecutingAssembly();
            var service = context.GetFakedOrganizationService();

            var c = new Contact()
            {
                Id = Guid.NewGuid()
            };
            context.Initialize(new[] { c });

            //Retrieve record after update
            var contact = (from con in context.CreateQuery<Contact>()
                           where con.Id == c.Id
                           select con).FirstOrDefault();

            Assert.Equal((int)contact.StateCode.Value, 0); //Active
        }
        public void Should_Execute_Mock_For_OrganizationRequests()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            var e = new Entity("Contact") { Id = Guid.NewGuid() };
            context.Initialize(new[] { e });
            context.AddExecutionMock<RetrieveEntityRequest>(RetrieveEntityMock);

            var inputs = new ParameterCollection
            {
                {"Target", e }
            };

            context.ExecutePluginWith<CustomMockPlugin>(inputs, new ParameterCollection(), new EntityImageCollection(), new EntityImageCollection());

            Assert.Equal("Successful", (string)e["response"]);
            Assert.DoesNotThrow(() => context.RemoveExecutionMock<RetrieveEntityRequest>());
        }
        public void When_executing_fetchxml_right_result_is_returned()
        {
            //This will test a query expression is generated and executed

            var ctx = new XrmFakedContext();
            ctx.Initialize(new List<Entity>()
            {
                new Contact() {Id = Guid.NewGuid(), FirstName = "Leo Messi", Telephone1 = "123" }, //should be returned
                new Contact() {Id = Guid.NewGuid(), FirstName = "Leo Messi", Telephone1 = "234" }, //should be returned
                new Contact() {Id = Guid.NewGuid(), FirstName = "Leo", Telephone1 = "789" }, //shouldnt
                new Contact() {Id = Guid.NewGuid(), FirstName = "Andrés", Telephone1 = "123" }, //shouldnt
            });

            var fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                              <entity name='contact'>
                                    <attribute name='fullname' />
                                    <attribute name='telephone1' />
                                    <attribute name='contactid' />
                                        <filter type='and'>
                                            <condition attribute='firstname' operator='like' value='%Leo%' />
                                                <filter type='or'>
                                                    <condition attribute='telephone1' operator='eq' value='123' />
                                                    <condition attribute='telephone1' operator='eq' value='234' />
                                                </filter>
                                        </filter>
                                  </entity>
                            </fetch>";

            var retrieveMultiple = new RetrieveMultipleRequest()
            {
                Query = new FetchExpression(fetchXml)
            };

            var service = ctx.GetFakedOrganizationService();
            var response = service.Execute(retrieveMultiple) as RetrieveMultipleResponse;

            Assert.Equal(2, response.EntityCollection.Entities.Count);

            //Executing the same via ExecuteMultiple returns also the same
            var response2 = service.RetrieveMultiple(retrieveMultiple.Query);
            Assert.Equal(2, response2.Entities.Count);
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var associateRequest = request as AssociateRequest;
            var service = ctx.GetFakedOrganizationService();

            if (associateRequest == null)
            {
                throw new Exception("Only associate request can be processed!");
            }

            var relationShipName = associateRequest.Relationship.SchemaName;
            var relationShip = ctx.GetRelationship(relationShipName);

            if (relationShip == null)
            {
                throw new Exception(string.Format("Relationship {0} does not exist in the metadata cache", relationShipName));
            }

            if (associateRequest.Target == null)
            {
                throw new Exception("Association without target is invalid!");
            }

            foreach (var relatedEntity in associateRequest.RelatedEntities)
            {
                var association = new Entity(relationShip.IntersectEntity)
                {
                    Attributes = new AttributeCollection
                        {
                            { relationShip.Entity1Attribute, associateRequest.Target.Id },
                            { relationShip.Entity2Attribute, relatedEntity.Id }
                        }
                };

                service.Create(association);


            }

            return new AssociateResponse ();
        }
        public void When_calling_insert_option_set_value_for_global_optionset_optionmetadata_contains_it()
        {
            var ctx = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new InsertOptionValueRequest()
            {
                OptionSetName = "GlobalOptionSet",
                Label = new Label("Yeah! This is a fake label!", 0)
            };

            Assert.DoesNotThrow(() => service.Execute(req));

            
            //Check the optionsetmetadata was updated
            Assert.True(ctx.OptionSetValuesMetadata.ContainsKey("GlobalOptionSet"));

            var option = ctx.OptionSetValuesMetadata["GlobalOptionSet"].Options.FirstOrDefault();
            Assert.NotEqual(null, option);
            Assert.Equal("Yeah! This is a fake label!", option.Label.LocalizedLabels[0].Label);
        }
示例#25
0
        public void It_Should_Recognize_Not_Matching_Strings()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "string", "cba" }
                }
            };

            var formula = "If ( IsEqual ( Value ( \"string\" ), \"abc\" ), \"true\", \"false\" )";
            var result  = new XTLInterpreter(formula, email, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("false"));
        }
        public void It_Should_Execute_Lambdas_On_Map()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            var formula = "Join(\" \", Map([\"Lord\", \"of\", \"the\", \"Rings\"], (e) => Substring(e, 0, 1)))";
            var result  = new XTLInterpreter(formula, email, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("L o t R"));
        }
        public void It_Should_Union_Arrays()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            var formula = "Join(\" \", Union ([\"Lord\"], [\"of\", \"the\"], [\"Rings\"]))";
            var result  = new XTLInterpreter(formula, email, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("Lord of the Rings"));
        }
示例#28
0
        public void When_Creating_Using_Organization_Context_Without_Saving_Changes_Record_Should_Not_Be_Created()
        {
            var context = new XrmFakedContext();

            context.ProxyTypesAssembly = Assembly.GetAssembly(typeof(Account));

            var account = new Account()
            {
                Id = Guid.NewGuid(), Name = "Super Great Customer", AccountNumber = "69"
            };

            var service = context.GetFakedOrganizationService();

            using (var ctx = new OrganizationServiceContext(service))
            {
                ctx.AddObject(account);

                var retrievedAccount = ctx.CreateQuery <Account>().SingleOrDefault(acc => acc.Id == account.Id);
                Assert.Null(retrievedAccount);
            }
        }
        public void It_Should_Return_Correct_Index()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "firstname", "Frodo Beutlin" }
                }
            };

            var formula = "IndexOf ( Value ( \"firstname\" ), \"Beutlin\")";
            var result  = new XTLInterpreter(formula, contact, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("6"));
        }
        public void It_Should_Apply_Paging_Info()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            var query = service.Query("account")
                        .With.PagingInfo(p => p
                                         .PageNumber(2)
                                         .PageSize(100)
                                         .PagingCookie("asdf")
                                         .ReturnTotalRecordCount()
                                         )
                        .Expression;

            Assert.That(query.PageInfo, Is.Not.Null);

            Assert.That(query.PageInfo.PageNumber, Is.EqualTo(2));
            Assert.That(query.PageInfo.Count, Is.EqualTo(100));
            Assert.That(query.PageInfo.PagingCookie, Is.EqualTo("asdf"));
            Assert.That(query.PageInfo.ReturnTotalRecordCount, Is.True);
        }
        public void Should_Not_Send_Update_If_No_Changes_Made()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = Guid.NewGuid()
            };

            context.Initialize(new[] { contact });

            using (var updateContext = new UpdateContext <Entity>(contact))
            {
                var updateSent = updateContext.Update(service);

                Assert.False(updateSent);
                A.CallTo(() => service.Update(A <Entity> ._)).MustNotHaveHappened();
            }
        }
        public void It_Should_Apply_Regex()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "firstname", "Frodo" }
                }
            };

            var formula = "Replace ( Value ( \"firstname\" ), \"o\", \"a\" )";
            var result  = new XTLInterpreter(formula, contact, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("Frada"));
        }
        public void It_Should_Get_LogicalName_From_Entity()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = new Guid("a99b0170-d463-4f70-8db9-e2d8ee348f5f"),
                Attributes  = new AttributeCollection
                {
                    { "name", "newName" }
                }
            };

            var formula = "RecordLogicalName (PrimaryRecord())";
            var result  = new XTLInterpreter(formula, contact, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("contact"));
        }
        public void When_calling_insert_option_set_value_without_entityname_or_attributename_exception_is_thrown()
        {
            var ctx = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new InsertOptionValueRequest()
            {
                EntityLogicalName = "Not empty",
                Label = new Label("Yeah! This is a fake label!", 0)
            };

            Assert.Throws<Exception>(() => service.Execute(req));

            req = new InsertOptionValueRequest()
            {
                AttributeLogicalName = "Not empty",
                Label = new Label("Yeah! This is a fake label!", 0)
            };

            Assert.Throws<Exception>(() => service.Execute(req));
        }
示例#35
0
        public void When_Creating_Using_Organization_Context_Record_Should_Be_Created()
        {
            var context = new XrmFakedContext();

            context.ProxyTypesAssembly = Assembly.GetAssembly(typeof(Account));

            var account = new Account()
            {
                Id = Guid.NewGuid(), Name = "Super Great Customer", AccountNumber = "69"
            };

            var service = context.GetFakedOrganizationService();

            using (var ctx = new OrganizationServiceContext(service))
            {
                ctx.AddObject(account);
                ctx.SaveChanges();
            }

            Assert.NotNull(service.Retrieve(Account.EntityLogicalName, account.Id, new ColumnSet(true)));
        }
        public void It_Should_Take_Everything_From_Start_Without_Length()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "firstname", "Frodo" }
                }
            };

            var formula = "Substring ( Value ( \"firstname\" ), 1 )";
            var result  = new XTLInterpreter(formula, contact, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("rodo"));
        }
        public void Should_set_a_statecode_by_default_when_an_entity_record_is_added_to_the_context()
        {
            var context = new XrmFakedContext();

            context.ProxyTypesAssembly = Assembly.GetExecutingAssembly();
            var service = context.GetFakedOrganizationService();

            var c = new Contact()
            {
                Id = Guid.NewGuid()
            };

            context.Initialize(new[] { c });

            //Retrieve record after update
            var contact = (from con in context.CreateQuery <Contact>()
                           where con.Id == c.Id
                           select con).FirstOrDefault();

            Assert.Equal((int)contact.StateCode.Value, 0); //Active
        }
示例#38
0
        public void When_calling_insert_option_set_value_without_entityname_or_attributename_exception_is_thrown()
        {
            var ctx     = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new InsertOptionValueRequest()
            {
                EntityLogicalName = "Not empty",
                Label             = new Label("Yeah! This is a fake label!", 0)
            };

            Assert.Throws <Exception>(() => service.Execute(req));

            req = new InsertOptionValueRequest()
            {
                AttributeLogicalName = "Not empty",
                Label = new Label("Yeah! This is a fake label!", 0)
            };

            Assert.Throws <Exception>(() => service.Execute(req));
        }
示例#39
0
        public void When_executing_a_query_expression_attributes_returned_are_case_sensitive()
        {
            //So Where clauses shouldn't affect the Select clause
            var context = new XrmFakedContext();

            var service = context.GetFakedOrganizationService();

            service.Create(new Contact {
                FirstName = "JimmY"
            });

            var qe = new QueryExpression("contact");

            qe.Criteria.AddCondition("firstname", ConditionOperator.EndsWith, "y");
            qe.ColumnSet = new ColumnSet(true);

            var entities = service.RetrieveMultiple(qe).Entities;

            Assert.Equal(1, entities.Count);
            Assert.Equal("JimmY", entities[0]["firstname"]);
        }
        public void Strings_Should_Also_Be_Possible_With_Single_Quotes()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            var formula = "Concat(Value ('subject'), '\"', Value(\"subject\"), \"'\")";
            var result  = new XTLInterpreter(formula, email, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("TestSubject\"TestSubject'"));
        }
示例#41
0
        public void When_calling_insert_option_set_value_for_global_optionset_optionmetadata_contains_it()
        {
            var ctx     = new XrmFakedContext();
            var service = ctx.GetFakedOrganizationService();

            var req = new InsertOptionValueRequest()
            {
                OptionSetName = "GlobalOptionSet",
                Label         = new Label("Yeah! This is a fake label!", 0)
            };

            service.Execute(req);

            //Check the optionsetmetadata was updated
            Assert.True(ctx.OptionSetValuesMetadata.ContainsKey("GlobalOptionSet"));

            var option = ctx.OptionSetValuesMetadata["GlobalOptionSet"].Options.FirstOrDefault();

            Assert.NotEqual(null, option);
            Assert.Equal("Yeah! This is a fake label!", option.Label.LocalizedLabels[0].Label);
        }
示例#42
0
        public static void Should_Throw_When_Relationship_Not_Set_In_Metadata()
        {
            var fakedContext = new XrmFakedContext();
            var fakedService = fakedContext.GetFakedOrganizationService();

            A.CallTo(() => fakedService.Retrieve(A <string> .Ignored, A <Guid> .Ignored, A <ColumnSet> .Ignored))
            .Returns <Entity>(new Entity());

            var request = new RetrieveRequest
            {
                Target = new EntityReference(Account.EntityLogicalName, Guid.NewGuid()),
                RelatedEntitiesQuery = new RelationshipQueryCollection
                {
                    { new Relationship("any"), new QueryExpression() }
                }
            };

            var exception = Assert.Throws <Exception>(() => fakedService.Execute(request));

            Assert.Equal("Relationship \"any\" does not exist in the metadata cache.", exception.Message);
        }
示例#43
0
        public void It_Should_Concatenate_Array_Values_For_String_Representation()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            string result = null;

            Assert.That(() => result = new XTLInterpreter("Array(\"This\", null, \"is\", \"a\", \"test\")", email, null, service, tracing).Produce(), Throws.Nothing);
            Assert.That(result, Is.EqualTo("This, , is, a, test"));
        }
示例#44
0
        public void It_Should_Format_Money()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "revenue", new Money(123456789.2m) }
                }
            };

            var formula = "Format ( Value(\"revenue\"),  { format: \"{0:0,0.0}\" } )";
            var result  = new XTLInterpreter(formula, contact, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("123,456,789.2"));
        }
示例#45
0
        public void It_Should_Ignore_Whitespace()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "account",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "name", "TestSubject" }
                }
            };

            var formula = "\nValue\n(\n\"name\"\n)\n";
            var result  = new XTLInterpreter(formula, email, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("TestSubject"));
        }
示例#46
0
        public void It_Should_Recognize_Not_Matching_OptionSet_Values()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var contact = new Entity
            {
                LogicalName = "contact",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "gendercode", new OptionSetValue(1) }
                }
            };

            var formula = "If ( IsEqual ( Value ( \"gendercode\" ), 2 ), \"true\", \"false\" )";
            var result  = new XTLInterpreter(formula, contact, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("false"));
        }
示例#47
0
        public void When_delete_is_invoked_with_an_existing_entity_that_entity_is_delete_from_the_context()
        {
            var context = new XrmFakedContext();

            //Initialize the context with a single entity
            var guid = Guid.NewGuid();
            var data = new List <Entity>()
            {
                new Entity("account")
                {
                    Id = guid
                }
            }.AsQueryable();

            context.Initialize(data);

            var service = context.GetFakedOrganizationService();

            service.Delete("account", guid);
            Assert.True(context.Data["account"].Count == 0);
        }
示例#48
0
        public void It_Should_Join_Values_And_Remove_Empty_Entries_With_Native_Array()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            string result = null;

            Assert.That(() => result = new XTLInterpreter(@"Join ( "","", [ Value(""subject""), Value(""none""), Value(""subject"") ], true)", email, null, service, tracing).Produce(), Throws.Nothing);
            Assert.That(result, Is.EqualTo("TestSubject,TestSubject"));
        }
示例#49
0
        public void It_Should_Not_Fail_On_Null_Valued_Formula()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            string result = null;

            Assert.That(() => result = new XTLInterpreter(null, email, null, service, tracing).Produce(), Throws.Nothing);
            Assert.That(result, Is.EqualTo(string.Empty));
        }
示例#50
0
        public static void Should_Throw_When_Related_Record_Query_Not_Set_For_Relationship()
        {
            var fakedContext = new XrmFakedContext();
            var fakedService = fakedContext.GetFakedOrganizationService();

            A.CallTo(() => fakedService.Retrieve(A <string> .Ignored, A <Guid> .Ignored, A <ColumnSet> .Ignored))
            .Returns <Entity>(new Entity());

            var request = new RetrieveRequest
            {
                Target = new EntityReference(Account.EntityLogicalName, Guid.NewGuid()),
                RelatedEntitiesQuery = new RelationshipQueryCollection
                {
                    { new Relationship("any"), null }
                }
            };

            var exception = Assert.Throws <ArgumentNullException>(() => fakedService.Execute(request));

            Assert.Equal("relateEntitiesQuery.Value", exception.ParamName);
        }
示例#51
0
        public void It_Should_Concatenate_Strings()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();
            var tracing = context.GetFakeTracingService();

            var email = new Entity
            {
                LogicalName = "email",
                Id          = Guid.NewGuid(),
                Attributes  = new AttributeCollection
                {
                    { "subject", "TestSubject" }
                }
            };

            var formula = "Concat(Value (\"subject\"), \" \", Value (\"subject\"))";
            var result  = new XTLInterpreter(formula, email, null, service, tracing).Produce();

            Assert.That(result, Is.EqualTo("TestSubject TestSubject"));
        }
示例#52
0
        public void When_executing_fetchxml_with_count_attribute_requesting_less_than_0_rows_throws_an_error()
        {
            //This will test a count attribute can not be less than 0

            var ctx = new XrmFakedContext();

            //Act
            var fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' count='-1'>
                              <entity name='contact'>
                                    <attribute name='fullname' />
                                  </entity>
                            </fetch>";

            var service = ctx.GetFakedOrganizationService();

            Exception exception = Assert.Throws <Exception>(() => service.Execute(new ExecuteFetchRequest {
                FetchXml = fetchXml
            }));

            Assert.Equal("Expected value between 0 and 5000 inclusive.", exception.Message);
        }
示例#53
0
        public static void Should_Retrieve_A_Correct_Entity()
        {
            var account1 = new Account
            {
                AccountId = Guid.NewGuid(),
                Name      = "Account 1"
            };

            var account2 = new Account
            {
                AccountId = Guid.NewGuid(),
                Name      = "Account 2"
            };

            var account3 = new Account
            {
                AccountId = Guid.NewGuid(),
                Name      = "Account 3"
            };

            var fakedContext = new XrmFakedContext();
            var fakedService = fakedContext.GetFakedOrganizationService();

            fakedContext.Initialize(new[] { account1, account2, account3 });

            var request = new RetrieveRequest
            {
                ColumnSet = new ColumnSet("name"),
                Target    = account2.ToEntityReference(),
            };

            var result = (RetrieveResponse)fakedService.Execute(request);

            Assert.NotNull(result.Entity);

            var resultAccount = result.Entity.ToEntity <Account>();

            Assert.Equal(account2.Id, resultAccount.Id);
            Assert.Equal(account2.Name, resultAccount.Name);
        }
        public void It_Should_Check_Execution_Criteria_On_Custom_Action()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            var template = "Hello ${{Value(\\\"subject\\\")}}";

            var email = new Entity
            {
                Id          = Guid.NewGuid(),
                LogicalName = "email",
                Attributes  =
                {
                    { "subject", "Demo" }
                }
            };

            context.Initialize(email);

            var inputParameters = new ParameterCollection
            {
                { "jsonInput", "{" +
                  "\"triggerUpdate\": true," +
                  "\"executionCriteria\": \"IsNull(Value(\\\"subject\\\"))\"," +
                  "\"targetField\": \"description\"," +
                  $"\"template\": \"{template}\"," +
                  $"\"target\": {{\"Id\": \"{email.Id}\", \"LogicalName\": \"{email.LogicalName}\"}}" +
                  "}" }
            };

            var pluginContext = context.GetDefaultPluginContext();

            pluginContext.InputParameters  = inputParameters;
            pluginContext.OutputParameters = new ParameterCollection();

            context.ExecutePluginWith <XTLProcessor>(pluginContext);

            email = service.Retrieve(email.LogicalName, email.Id, new ColumnSet(true));
            A.CallTo(() => service.Update(A <Entity> ._)).MustHaveHappened(Repeated.Never);
        }
示例#55
0
        public void Shouldnt_store_references_to_variables_but_actual_clones()
        {
            var context = new XrmFakedContext();
            var service = context.GetFakedOrganizationService();

            //create an account and then retrieve it with no changes
            Entity newAccount = new Entity("account");

            newAccount["name"] = "New Account";

            newAccount.Id = service.Create(newAccount);

            Entity retrievedAccount = service.Retrieve("account", newAccount.Id, new Microsoft.Xrm.Sdk.Query.ColumnSet(true));

            Assert.True(retrievedAccount.Attributes.Contains("name"));

            //do the same as above, but this time clear the attributes - see that when retrieved, the retrieved entity does not contain the name attribute
            Entity newAccount1 = new Entity("account");

            newAccount1["name"] = "New Account1";

            newAccount1.Id = service.Create(newAccount1);
            newAccount1.Attributes.Clear();

            Entity retrievedAccount1 = service.Retrieve("account", newAccount1.Id, new Microsoft.Xrm.Sdk.Query.ColumnSet(true));

            Assert.True(retrievedAccount1.Attributes.Contains("name"));

            //third time around, change the name to something new, the retrieved entity should not reflect this change
            Entity newAccount2 = new Entity("account");

            newAccount2["name"] = "New Account2";

            newAccount2.Id      = service.Create(newAccount2);
            newAccount2["name"] = "Changed name";

            Entity retrievedAccount2 = service.Retrieve("account", newAccount2.Id, new Microsoft.Xrm.Sdk.Query.ColumnSet(true));

            Assert.True(retrievedAccount2["name"].ToString() == "New Account2", $"'{retrievedAccount2["name"]}' was not the expected result");
        }
        public void Should_not_override_a_statecode_already_initialized()
        {
            var context = new XrmFakedContext();
            context.ProxyTypesAssembly = Assembly.GetExecutingAssembly();
            var service = context.GetFakedOrganizationService();

            var c = new Contact()
            {
                Id = Guid.NewGuid(),
            };

            c["statecode"] = new OptionSetValue(69); //As the StateCode is read only in the early bound entity, this is the only way of updating it
             
            context.Initialize(new[] { c });

            //Retrieve record after update
            var contact = (from con in context.CreateQuery<Contact>()
                           where con.Id == c.Id
                           select con).FirstOrDefault();

            Assert.Equal((int)contact.StateCode.Value, 69); //Set
        }
        public void When_querying_the_same_entity_records_with_joins_no_collection_modified_exception_is_thrown()
        {
            var fakedContext = new XrmFakedContext { };
            var service = fakedContext.GetFakedOrganizationService();

            var entityAccount = new Account { Id = Guid.NewGuid(), Name = "My First Faked Account yeah!", LogicalName = "account" };
            var entityContact = new Contact { Id = Guid.NewGuid(), ParentCustomerId = entityAccount.ToEntityReference() };

            var entityBusinessUnit = new BusinessUnit { Name = "TestBU", BusinessUnitId = Guid.NewGuid() };

            var initiatingUser = new SystemUser
            {
                Id = Guid.NewGuid(),
                FirstName = "TestUser",
                DomainName = "TestDomain",
                BusinessUnitId = entityBusinessUnit.ToEntityReference()
            };

            fakedContext.Initialize(new List<Entity>() {
               entityBusinessUnit,entityAccount,entityContact,initiatingUser
            });


            var fetchXml = @"
                    <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                      <entity name='systemuser'>
                        <attribute name='fullname' />
                         <attribute name='systemuserid' />
                         <attribute name='businessunitid' />
                         <filter type='and'>
                          <condition attribute='systemuserid' operator='eq' uitype='systemuser' value='#userId#' />
                         </filter>
                            <link-entity name='businessunit' from='businessunitid' to='businessunitid' alias='bu' intersect='true' >
                                <attribute name='name' />
                            </link-entity>
                      </entity>
                    </fetch>
                ";

            var UserRequest = new RetrieveMultipleRequest { Query = new FetchExpression(fetchXml.Replace("#userId#", initiatingUser.Id.ToString())) };
            var response = ((RetrieveMultipleResponse)service.Execute(UserRequest));

            var entities = response.EntityCollection.Entities;
            Assert.True(entities.Count == 1);
            Assert.True(entities[0].Attributes.ContainsKey("bu.name"));
            Assert.IsType<AliasedValue>(entities[0]["bu.name"]);
            Assert.Equal("TestBU", (entities[0]["bu.name"] as AliasedValue).Value.ToString());
        }
        public void When_filtering_by_a_money_attribute_and_using_proxy_types_right_result_is_returned()
        {
            var context = new XrmFakedContext();
            context.ProxyTypesAssembly = Assembly.GetAssembly(typeof(Account));

            var contactId1 = Guid.NewGuid();
            var contactId2 = Guid.NewGuid();

            var account1 = new Account();
            account1.Id = Guid.NewGuid();
            account1.MarketCap = new Money(123.45m);

            var account2 = new Account();
            account2.Id = Guid.NewGuid();
            account2.MarketCap = new Money(223.45m);

            context.Initialize(new List<Entity> { account1, account2 });

            var fetchXml =
                 "<fetch>" +
                 "  <entity name='account'>" +
                 "     <attribute name='name'/>" +
                 "     <filter type='and'>" +
                 "         <condition attribute='marketcap' operator='eq' value='123.45' />" +
                 "     </filter>" +
                 "  </entity>" +
                 "</fetch>";
            var rows = context.GetFakedOrganizationService().RetrieveMultiple(new FetchExpression(fetchXml));
            Assert.Equal(rows.Entities.Count, 1);
        }
        public void When_filtering_by_an_enum_attribute_and_using_proxy_types_right_result_is_returned()
        {
            var fakedContext = new XrmFakedContext { };

            var entityAccount = new Account { Id = Guid.NewGuid(), Name = "Test Account", LogicalName = "account" };
            var entityContact = new Contact { Id = Guid.NewGuid(), ParentCustomerId = entityAccount.ToEntityReference(), EMailAddress1 = "*****@*****.**" };

            var entityCase = new Incident
            {
                Id = Guid.NewGuid(),
                PrimaryContactId = entityContact.ToEntityReference(),
                CustomerId = entityAccount.ToEntityReference(),
                Title = "Unit Test Case"
            };

            entityCase["statecode"] = new OptionSetValue((int) IncidentState.Active);

            fakedContext.Initialize(new List<Entity>() {
               entityAccount,entityContact, entityCase
            });


            var fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' >
              <entity name='incident' >
                <attribute name='incidentid' />
                <attribute name='statecode' /> 
                <order attribute='createdon' descending='true' /> 
                 <filter type='and' > 
                  <condition attribute='statecode' operator='neq' value='2' /> 
                </filter>
              </entity>
            </fetch>";

            var rows = fakedContext.GetFakedOrganizationService().RetrieveMultiple(new FetchExpression(fetchXml));
            Assert.Equal(rows.Entities.Count, 1);

        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var updateRequest = (UpdateRequest) request;

            var target = (Entity)request.Parameters["Target"];

            var service = ctx.GetFakedOrganizationService();
            service.Update(target);

            return new UpdateResponse();
        }