public async Task CreateMessage_returns_MailMessage_created_by_parser()
        {
            var html     = @"Content-Type: text/html
To: [email protected]
From: [email protected]
Subject: Test Subject

<p>Hello, World!</p>";
            var email    = new Email("Test");
            var renderer = new Mock <IEmailViewRender>();

            renderer.Setup(r => r.RenderAsync(email)).Returns(Task.FromResult(html));
            var parser       = new Mock <IEmailParser>();
            var emailOptions = new DefaultEmailServiceOptions();

            emailOptions.PrepareSmtpClientAsync = () => null;
            var options = new Mock <IOptions <DefaultEmailServiceOptions> >();

            options.SetupGet(o => o.Value).Returns(emailOptions);
            var logger              = new Mock <ILogger <EmailService> >();
            var service             = new EmailService(renderer.Object, parser.Object, options.Object, logger.Object);
            var expectedMailMessage = new MimeMessage();

            parser.Setup(p => p.ParseAsync(It.IsAny <string>(), email)).Returns(Task.FromResult(expectedMailMessage));

            var actualMailMessage = await service.CreateMailMessageAsync(email);

            actualMailMessage.ShouldBeOfType <MimeMessage>();

            parser.Verify();
            renderer.Verify();
            options.Verify();
        }
        public void Dependency_injection_smtpOtions3()
        {
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddOptions();
            var viewEngine       = new Mock <IRazorViewEngine>();
            var tempDataProvider = new Mock <ITempDataProvider>();
            var logger           = new Mock <ILogger <EmailService> >();

            serviceCollection.AddSingleton(logger.Object);
            serviceCollection.AddSingleton(viewEngine.Object);
            serviceCollection.AddSingleton(tempDataProvider.Object);

            serviceCollection.Configure <DefaultEmailServiceOptions>(o =>
            {
                o.PrepareSmtpClientAsync = () => throw new FactExcetpionForSmtpCreation();
            });

            serviceCollection.AddPostal();

            var services     = serviceCollection.BuildServiceProvider();
            var emailService = services.GetRequiredService <IEmailService>();

            Assert.ThrowsAsync <FactExcetpionForSmtpCreation>(() => emailService.SendAsync(new Email("testView")));
            DefaultEmailServiceOptions emailOptionField = GetInstanceField(typeof(EmailService), emailService, "options") as DefaultEmailServiceOptions;

            Assert.Throws <FactExcetpionForSmtpCreation>(() => emailOptionField.PrepareSmtpClientAsync().Result);
        }
        public void Dependency_injection_smtpOtions1()
        {
            var configBuilder = new ConfigurationBuilder();

            configBuilder.AddInMemoryCollection(new Dictionary <string, string>()
            {
                { "Host", "abc" },
                { "Port", "12345" },
                { "FromAddress", "qwerty" },
                { "UserName", "zxcvbn" },
                { "Password", "asdfgh" }
            });
            var _configuration    = configBuilder.Build();
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddOptions();
            var viewEngine       = new Mock <IRazorViewEngine>();
            var tempDataProvider = new Mock <ITempDataProvider>();
            var logger           = new Mock <ILogger <EmailService> >();

            serviceCollection.AddSingleton(logger.Object);
            serviceCollection.AddSingleton(viewEngine.Object);
            serviceCollection.AddSingleton(tempDataProvider.Object);

            serviceCollection.Configure <DefaultEmailServiceOptions>(_configuration);
            serviceCollection.AddPostal();

            var services     = serviceCollection.BuildServiceProvider();
            var emailService = services.GetRequiredService <IEmailService>();

            var emailOption = services.GetRequiredService <IOptions <DefaultEmailServiceOptions> >().Value;

            DefaultEmailServiceOptions emailOptionField = GetInstanceField(typeof(EmailService), emailService, "options") as DefaultEmailServiceOptions;

            emailOption.Host.ShouldBe("abc");
            emailOption.Port.ShouldBe(12345);
            emailOption.UserName.ShouldBe("zxcvbn");
            emailOption.Password.ShouldBe("asdfgh");

            emailOptionField.Host.ShouldBe("abc");
            emailOptionField.Port.ShouldBe(12345);
            emailOptionField.UserName.ShouldBe("zxcvbn");
            emailOptionField.Password.ShouldBe("asdfgh");
        }
        public void Dependency_injection_smtpOtions2()
        {
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddOptions();
            var viewEngine       = new Mock <IRazorViewEngine>();
            var tempDataProvider = new Mock <ITempDataProvider>();
            var logger           = new Mock <ILogger <EmailService> >();

            serviceCollection.AddSingleton(logger.Object);
            serviceCollection.AddSingleton(viewEngine.Object);
            serviceCollection.AddSingleton(tempDataProvider.Object);

            serviceCollection.Configure <DefaultEmailServiceOptions>(o =>
            {
                o.Host     = "abc";
                o.Port     = 12345;
                o.UserName = "******";
                o.Password = "******";
                o.PrepareSmtpClientAsync = () => Task.FromResult <SmtpClient>(new FactExcetpionForSmtpClient());
            });

            serviceCollection.AddPostal();

            var services     = serviceCollection.BuildServiceProvider();
            var emailService = services.GetRequiredService <IEmailService>();

            DefaultEmailServiceOptions emailOptionField = GetInstanceField(typeof(EmailService), emailService, "options") as DefaultEmailServiceOptions;

            emailOptionField.Host.ShouldBe("abc");
            emailOptionField.Port.ShouldBe(12345);
            emailOptionField.UserName.ShouldBe("zxcvbn");
            emailOptionField.Password.ShouldBe("asdfgh");

            emailOptionField.PrepareSmtpClientAsync().Result.ShouldBeOfType <FactExcetpionForSmtpClient>();
        }
        public async Task LoadTemplates(
            string templateName,
            string culture,
            string expectedCulture,
            string defaultCulture)
        {
            var email       = "alice@localhost";
            var emailSender = new Mock <IEmailSender>();

            var model = new Dictionary <string, object>
            {
                { "Name", "Foo" }
            };

            emailSender
            .Setup(c => c.SendEmailAsync(It.IsAny <EmailMessage>()))
            .Returns(new Func <EmailMessage, Task>(async(emailMessage) =>
            {
                Assert.NotNull(emailMessage);

                Assert.Equal(email, emailMessage.EmailTo);

                string subject = $"Subject {templateName} {expectedCulture} Foo";
                Assert.Equal(subject, emailMessage.Subject);

                string html = $"HTML LayoutStart {expectedCulture} Html {templateName} {expectedCulture} Foo HTML LayoutEnd {expectedCulture}";
                Assert.Equal(html, emailMessage.Html);

                string text = $"Text LayoutStart {expectedCulture} Text {templateName} {expectedCulture} Foo Text LayoutEnd {expectedCulture}";
                Assert.Equal(text, emailMessage.Text);
            }));

            var logger = new NullLogger <DefaultEmailService>();

            var options = new DefaultEmailServiceOptions
            {
                DefaultCulture        = defaultCulture,
                TemplateDirectoryPath = "../../../Email/Templates"
            };

            var httpContextAccessorMock = new Mock <IHttpContextAccessor>();

            var emailService = new DefaultEmailService(
                options,
                logger,
                emailSender.Object,
                httpContextAccessorMock.Object);

            // Set culture
            CultureInfo originalCulture =
                Thread.CurrentThread.CurrentCulture;

            CultureInfo originalUICulture =
                Thread.CurrentThread.CurrentUICulture;

            Thread.CurrentThread.CurrentCulture =
                new CultureInfo(culture, false);

            Thread.CurrentThread.CurrentUICulture =
                new CultureInfo(culture, false);

            CultureInfo.CurrentCulture.ClearCachedData();
            CultureInfo.CurrentUICulture.ClearCachedData();

            // Send email
            await emailService.SendEmailAsync(
                templateName,
                email,
                model,
                true);

            // Reset UI Culture
            Thread.CurrentThread.CurrentCulture   = originalCulture;
            Thread.CurrentThread.CurrentUICulture = originalUICulture;
            CultureInfo.CurrentCulture.ClearCachedData();
            CultureInfo.CurrentUICulture.ClearCachedData();
        }
        //[Theory]
        //[InlineData("Template1", "en-US", "en-US", "en-US")]
        //[InlineData("Template1", "de-DE", "de-DE", "de-DE")]
        //[InlineData("Template1", "ru-RU", "en-US", "en-US")]
        public async Task LoadTemplates(
            string templateName,
            string culture,
            string expectedCulture,
            string defaultCulture)
        {
            string email = "alice@localhost";
            Mock <IEmailSender> emailSender = new Mock <IEmailSender>();

            Dictionary <string, object> model = new Dictionary <string, object>
            {
                { "Name", "Foo" }
            };

            emailSender
            .Setup(c => c.SendEmailAsync(It.IsAny <EmailMessage>()))
            .Returns(new Func <EmailMessage, Task>((emailMessage) =>
            {
                Assert.NotNull(emailMessage);

                Assert.Equal(email, emailMessage.EmailTo);

                string subject = $"Subject {templateName} {expectedCulture} Foo";
                Assert.Equal(subject, emailMessage.Subject);

                string html = $"HTML LayoutStart {expectedCulture} Html {templateName} {expectedCulture} Foo HTML LayoutEnd {expectedCulture}";
                Assert.Equal(html, emailMessage.Html);

                string text = $"Text LayoutStart {expectedCulture} Text {templateName} {expectedCulture} Foo Text LayoutEnd {expectedCulture}";
                Assert.Equal(text, emailMessage.Text);

                return(Task.FromResult(0));
            }));

            NullLogger <DefaultEmailService> logger =
                new NullLogger <DefaultEmailService>();

            DefaultEmailServiceOptions options = new DefaultEmailServiceOptions
            {
                DefaultCulture = defaultCulture
            };

            Mock <IHttpContextAccessor> httpContextAccessorMock =
                new Mock <IHttpContextAccessor>();


            Mock <IResourceStore> resourceStoreMock = new Mock <IResourceStore>();

            resourceStoreMock
            .Setup(c => c.GetEmailTemplateAsync(
                       It.Is <string>(s => s.Equals(culture)),
                       It.Is <string>(s => s.Equals(templateName))
                       ))
            .Returns(new Func <string, string, Task <Resource> >((tplCulture, tplKey) =>
            {
                return(Task.FromResult(new Resource
                {
                    Culture = tplCulture,
                    Key = tplKey,
                    Value = $"HTML LayoutStart {expectedCulture} Html {templateName} {expectedCulture} Foo HTML LayoutEnd {expectedCulture}"
                }));
            }));



            DefaultEmailService emailService = new DefaultEmailService(
                options,
                emailSender.Object,
                resourceStoreMock.Object,
                logger,
                new DefaultTokenizer());

            // Set culture
            CultureInfo originalCulture =
                Thread.CurrentThread.CurrentCulture;

            CultureInfo originalUICulture =
                Thread.CurrentThread.CurrentUICulture;

            Thread.CurrentThread.CurrentCulture =
                new CultureInfo(culture, false);

            Thread.CurrentThread.CurrentUICulture =
                new CultureInfo(culture, false);

            CultureInfo.CurrentCulture.ClearCachedData();
            CultureInfo.CurrentUICulture.ClearCachedData();

            // Send email
            await emailService.SendEmailAsync(
                templateName,
                email,
                model,
                true);

            // Reset UI Culture
            Thread.CurrentThread.CurrentCulture   = originalCulture;
            Thread.CurrentThread.CurrentUICulture = originalUICulture;
            CultureInfo.CurrentCulture.ClearCachedData();
            CultureInfo.CurrentUICulture.ClearCachedData();
        }