public void DefaultValueTemplateParseTest()
        {
            var customerId = Guid.NewGuid();

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new [] { _contactMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.IsAny <RetrieveEntityRequest>()))
            .Returns(_contactMetadata.AsResponse());

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity>
            {
                new Entity("contact", customerId)
            }));

            var template = "Hi, ${Customer.contact.fullname!Noname}";
            var parser   = new FreeMarkerParser(service.Object, template);
            var result   = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Hi, Noname", result);

            result = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = null
            });

            Assert.AreEqual("Hi, Noname", result);
        }
        public void DirectiveNewLineTemplateParseTest()
        {
            var customerId = Guid.NewGuid();

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new[] { _contactMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.IsAny <RetrieveEntityRequest>()))
            .Returns(_contactMetadata.AsResponse());

            var contact = new Entity("contact", customerId)
            {
                ["fullname"] = "Brunhilde Semel",
                ["gender"]   = new OptionSetValue(1)
            };

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity> {
                contact
            }));

            var template = @"<#if
Customer.contact.gender = = Female>Mrs</#if> ${Customer.contact.Full 
Name}";
            var parser   = new FreeMarkerParser(service.Object, template);
            var result   = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Mrs Brunhilde Semel", result);
        }
        public void NowFunctionTest()
        {
            var customerId = Guid.NewGuid();

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new[] { _contactMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.IsAny <RetrieveEntityRequest>()))
            .Returns(_contactMetadata.AsResponse());

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity>
            {
                new Entity("contact", customerId)
            }));

            var template = "Recieve it at ${.now?t} Return at ${.now?d!Whenever}";
            var parser   = new FreeMarkerParser(service.Object, template);
            var result   = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual($"Recieve it at {DateTime.UtcNow.ToLocalTime():t} Return at {DateTime.UtcNow.ToLocalTime():d}", result);
        }
        public void HrefFormatValueTemplateParseTest()
        {
            var customerId = Guid.NewGuid();

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new[] { _contactMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.IsAny <RetrieveEntityRequest>()))
            .Returns(_contactMetadata.AsResponse());

            var contact = new Entity("contact", customerId)
            {
                ["fullname"] = "Brunhilde Semel"
            };

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity> {
                contact
            }));

            var template = "Follow the link <a href='https://mysite.com?user=${Customer.contact.fullname?href}'>${Customer.contact.fullname}</a>";
            var parser   = new FreeMarkerParser(service.Object, template);
            var result   = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Follow the link <a href='https://mysite.com?user=Brunhilde%20Semel'>Brunhilde Semel</a>", result);
        }
        public void FormatValueTemplateParseTest()
        {
            var customerId = Guid.NewGuid();

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new [] { _contactMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.IsAny <RetrieveEntityRequest>()))
            .Returns(_contactMetadata.AsResponse());

            var startDate = new DateTime(2019, 05, 20, 20, 30, 00, DateTimeKind.Utc);

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity>
            {
                new Entity("contact", customerId)
                {
                    ["startdate"] = startDate
                }
            }));

            var template = "Recieve it at ${Customer.contact.startdate?t} Return at ${Customer.contact.enddate?t!Whenever}";
            var parser   = new FreeMarkerParser(service.Object, template);
            var result   = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual($"Recieve it at {startDate.ToLocalTime().ToString("t")} Return at Whenever", result);
        }
        public void Execute(IServiceProvider serviceProvider)
        {
            var pluginExecutionContext = serviceProvider.GetService <IPluginExecutionContext>();

            var tracingService = serviceProvider.GetService <ITracingService>();
            var serviceFactory = serviceProvider.GetService <IOrganizationServiceFactory>();
            var sms            = GetTarget(pluginExecutionContext);


            var service           = serviceFactory.CreateOrganizationService(pluginExecutionContext.UserId);
            var templateReference = sms.GetAttributeValue <EntityReference>("zed_templateid");
            var template          = service.Retrieve("zed_messagetemplate", templateReference.Id, new ColumnSet("zed_template"));
            var parser            = new FreeMarkerParser(service, template.GetAttributeValue <string>("zed_template"));
            var toUpdate          = new Entity(sms.LogicalName, sms.Id)
            {
                ["description"] = parser.Produce(new Dictionary <string, EntityReference>
                {
                    ["Recipient"] = sms.GetAttributeValue <EntityCollection>("to")?.Entities?
                                    .FirstOrDefault()?.GetAttributeValue <EntityReference>("partyid"),
                    ["Context"] = sms.ToEntityReference()
                })
            };

            service.Update(toUpdate);
        }
        public void ListParseTest()
        {
            var customerId = Guid.NewGuid();

            var nameField = new AttributeMetadata();

            nameField.SetName("name");
            nameField.AddLocalizationText("Name");

            var subMetadata = new[] { nameField }.Compile("sub");

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new[] { _contactMetadata, subMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.Is <RetrieveEntityRequest>(r => r.LogicalName == _contactMetadata.LogicalName)))
            .Returns(_contactMetadata.AsResponse());
            service.Setup(s => s.Execute(It.Is <RetrieveEntityRequest>(r => r.LogicalName == subMetadata.LogicalName)))
            .Returns(subMetadata.AsResponse());

            var contact = new Entity("contact", customerId)
            {
                ["fullname"] = "Brunhilde Semel",
                ["gender"]   = new OptionSetValue(1)
            };

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity> {
                contact
            }));

            var template = @"${Customer.contact.Full Name}<#list Customer.items as item><p>${item.sub.name}</p></#list>";
            var parser   = new FreeMarkerParser(service.Object, template);

            parser.OnEntityRetrieved += (s, e) => e.Entity["items"] = new[]
            {
                new Entity("sub")
                {
                    ["name"] = "a"
                },
                new Entity("sub")
                {
                    ["name"] = "b"
                },
                new Entity("sub")
                {
                    ["name"] = "c"
                }
            };

            var result = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Brunhilde Semel<p>a</p><p>b</p><p>c</p>", result);
        }
        public void IfEncodedTemplateParseTest()
        {
            var customerId = Guid.NewGuid();

            var service = new Mock <IOrganizationService>();

            service.Setup(s => s.Execute(It.IsAny <RetrieveAllEntitiesRequest>()))
            .Returns(new [] { _contactMetadata }.AsResponse());
            service.Setup(s => s.Execute(It.IsAny <RetrieveEntityRequest>()))
            .Returns(_contactMetadata.AsResponse());

            var contact = new Entity("contact", customerId)
            {
                ["fullname"] = "Brunhilde Semel",
                ["gender"]   = new OptionSetValue(1)
            };

            service.Setup(s => s.RetrieveMultiple(It.Is <QueryExpression>(e
                                                                          => e.Criteria.Conditions.Any(c => c.AttributeName == "contactid" && c.Values.Contains(customerId)))))
            .Returns(new EntityCollection(new List <Entity> {
                contact
            }));

            var template = "&lt;#if Customer.contact.gender == Female&gt;Mrs<#elseif Customer.contact.gender == Male&gt;Mr&lt;#elseif Customer.contact.gender == Div>Msr&lt;#else&gt;Dear&lt;/#if&gt;>, ${Customer.contact.fullname}";
            var parser   = new FreeMarkerParser(service.Object, template, Configurations.Default);
            var result   = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Mrs>, Brunhilde Semel", result);
            contact["gender"] = new OptionSetValue(0);
            result            = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Mr>, Brunhilde Semel", result);

            contact["gender"] = new OptionSetValue(2);
            result            = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Msr>, Brunhilde Semel", result);

            contact["gender"] = null;
            result            = parser.Produce(new Dictionary <string, EntityReference>
            {
                ["Customer"] = new EntityReference("contact", customerId)
            });

            Assert.AreEqual("Dear>, Brunhilde Semel", result);
        }