Пример #1
0
        public async Task TrySendEmailAsync_ShouldUseBaseTemplate_IfInvalidCultureProvided()
        {
            // arrange
            var args = new EmailMessageParams
            {
                Culture       = "zu-ZA",
                ApplicationId = _fixture.ApplicationId,
                TemplateId    = _fixture.TemplateId,
                To            = new List <string> {
                    "*****@*****.**"
                },
                Data = new Dictionary <string, object> {
                    { "Name", "Someone" }
                }
            };

            var template = await _fixture.Database.FindTemplateAsync(_fixture.TemplateId);

            var expected = await MustacheTemplateTransformer.Instance.TransformTemplateAsync(
                new EmailTemplate(
                    template.SubjectTemplate,
                    template.BodyTemplate),
                args.Data,
                args.GetCulture());

            // act
            var success = await _target.TrySendEmailAsync(args);

            // assert
            _transport.Verify(m => m.SendAsync(It.Is <SenderParams>(p =>
                                                                    p.Subject == expected.Subject && p.Body == expected.Body)));
        }
        public async Task <IActionResult> Test(
            TestTemplateViewModel model,
            [FromServices] IEmailQueueBlobStore blobStore,
            [FromServices] IEmailQueueSender emailSender,
            CancellationToken cancellationToken)
        {
            if (ModelState.IsValid)
            {
                var token = EmailQueueToken.Create(model.ApplicationId);
                var param = new EmailMessageParams
                {
                    ApplicationId = model.ApplicationId,
                    TemplateId    = model.TemplateId,
                    To            = new List <string> {
                        model.EmailAddress
                    },
                    Culture = model.Language,
                    Data    = JObject.Parse(model.SampleData).ToObject <Dictionary <string, object> >()
                };

                await blobStore.AddAsync(token, param, cancellationToken);

                await emailSender.SendAsync(token, cancellationToken);

                Response.StatusCode = (int)HttpStatusCode.Accepted;
                return(RedirectToAction(nameof(Details), new { id = model.TemplateId }));
            }

            // TODO: reload translations
            return(View(model));
        }
Пример #3
0
        public async Task TrySendEmailAsync_ShouldUseSubjectAndBody_IfNoTemplateIdProvided()
        {
            // arrange
            var args = new EmailMessageParams
            {
                ApplicationId = _fixture.ApplicationId,
                To            = new List <string> {
                    "*****@*****.**"
                },
                Data = new Dictionary <string, object> {
                    { "Name", "Someone" }
                },
                Subject     = "Hi {{Name}}",
                BodyEncoded = EmailMessageParams.EncodeBody("Hi {{Name}}")
            };

            var template = await _fixture.Database.FindTemplateAsync(_fixture.TemplateId);

            var expected = await MustacheTemplateTransformer.Instance.TransformTemplateAsync(
                new EmailTemplate(
                    args.Subject,
                    args.GetBody()),
                args.Data,
                args.GetCulture());

            // act
            var success = await _target.TrySendEmailAsync(args);

            // assert
            _transport.Verify(m => m.SendAsync(It.Is <SenderParams>(p =>
                                                                    p.Subject == expected.Subject && p.Body == expected.Body)));
        }
Пример #4
0
        public async Task SendMailAsync(EmailMessageParams param)
        {
            EmailTemplate messageTemplate;

            if (string.IsNullOrEmpty(param.TemplateName))
            {
                messageTemplate = EmailTemplate.Default;
            }
            else
            {
                messageTemplate = await _templateRepository.FindByNameAsync(param.TemplateName);
            }
            await _emailSender.SendMailAsync(messageTemplate.CreateMessage(param));
        }
Пример #5
0
        public async Task AddAsync(EmailQueueToken token, EmailMessageParams message, CancellationToken cancellationToken)
        {
            _logger.LogTrace("Adding new blob to store for token {0}", token);

            if (!_initialized)
            {
                await InitializeAsync(cancellationToken);
            }

            var serialized = EmailMessageParams.ToJson(message);
            var blobName   = GetBlobName(token);
            var blob       = _container.Value.GetBlockBlobReference(blobName);
            await blob.UploadTextAsync(serialized, Encoding.UTF8, null, null, null, cancellationToken);
        }
        private EmailMessageParams BuildMessage(PostEmailRequest args)
        {
            const string EmptyData = "{}";

            return(new EmailMessageParams
            {
                To = args.To,
                CC = args.CC,
                Bcc = args.Bcc,
                LogLevel = args.LogLevel,
                TemplateId = args.Template,
                Subject = args.Subject,
                BodyEncoded = EmailMessageParams.EncodeBody(args.Body),
                Data = JObject.Parse(args.Data ?? EmptyData).ToObject <Dictionary <string, object> >()
            });
        }
        public void ToJson_ShouldDeserializeDataObject()
        {
            // arrange
            var data = new Dictionary <string, object> {
                { "Name", "Keith" }
            };
            var target = new EmailMessageParams {
                Data = data
            };

            // act
            var serialized   = EmailMessageParams.ToJson(target);
            var deserialized = EmailMessageParams.FromJson(serialized);

            // assert
            Assert.Equal(data, deserialized.Data);
        }
        public void ToJson_ShouldSerializeDataAsObject()
        {
            // arrange
            var data = new Dictionary <string, object> {
                { "Name", "Keith" }
            };
            var expected = JsonConvert.SerializeObject(data, Formatting.None);
            var target   = new EmailMessageParams {
                Data = data
            };

            // act
            var actual = EmailMessageParams.ToJson(target, Formatting.None);

            // assert
            Assert.Contains(expected, actual);
        }
Пример #9
0
        public async Task ProcessMessage_Should_CompleteMessage_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _receiver.Verify(t => t.CompleteAsync(message, token), Times.Once());
        }
Пример #10
0
        public async Task ProcessMessage_ShouldNot_SendEmail_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _transport.Verify(t => t.SendAsync(It.IsAny <SenderParams>()), Times.Never());
        }
Пример #11
0
        public async Task TrySendEmailAsync_ThrowsInvalidOperation_IfApplicationNotFound()
        {
            // arrange
            var args = new EmailMessageParams
            {
                ApplicationId = Guid.NewGuid(),
                TemplateId    = _fixture.TemplateId,
                To            = new List <string> {
                    "*****@*****.**"
                },
                Data = new Dictionary <string, object> {
                    { "Name", "Someone" }
                }
            };

            // act/assert
            await Assert.ThrowsAsync <InvalidOperationException>(() => _target.TrySendEmailAsync(args));
        }
Пример #12
0
        public async Task TrySendEmailAsync_ShouldSendToAllRecipients()
        {
            // arrange
            var args = new EmailMessageParams
            {
                ApplicationId = _fixture.ApplicationId,
                TemplateId    = _fixture.TemplateId,
                To            = new List <string> {
                    "*****@*****.**", "*****@*****.**"
                },
                CC = new List <string> {
                    "*****@*****.**", "*****@*****.**"
                },
                Bcc = new List <string> {
                    "*****@*****.**", "*****@*****.**"
                },
                Data = new Dictionary <string, object> {
                    { "Name", "Someone" }
                }
            };

            List <string> to  = null;
            List <string> cc  = null;
            List <string> bcc = null;

            _transport
            .Setup(m => m.SendAsync(It.IsAny <SenderParams>()))
            .ReturnsAsync(true)
            .Callback <SenderParams>(p =>
            {
                to  = new List <string>(p.To);
                cc  = new List <string>(p.CC);
                bcc = new List <string>(p.Bcc);
            });

            // act
            var success = await _target.TrySendEmailAsync(args);

            // assert
            Assert.Equal(args.To, to);
            Assert.Equal(args.CC, cc);
            Assert.Equal(args.Bcc, bcc);
        }
Пример #13
0
        public async Task <EmailMessageParams> GetAsync(EmailQueueToken token, CancellationToken cancellationToken)
        {
            _logger.LogTrace("Getting blob from store for token {0}", token);

            if (!_initialized)
            {
                await InitializeAsync(cancellationToken);
            }

            var blobName = GetBlobName(token);
            var blob     = _container.Value.GetBlockBlobReference(blobName);

            if (await blob.ExistsAsync())
            {
                var json = await blob.DownloadTextAsync(Encoding.UTF8, null, null, null, cancellationToken);

                return(EmailMessageParams.FromJson(json));
            }

            return(null);
        }
Пример #14
0
        public async Task TrySendEmailAsync_ShouldReturnTrue_IfSuccess()
        {
            // arrange
            var args = new EmailMessageParams
            {
                ApplicationId = _fixture.ApplicationId,
                TemplateId    = _fixture.TemplateId,
                To            = new List <string> {
                    "*****@*****.**"
                },
                Data = new Dictionary <string, object> {
                    { "Name", "Someone" }
                }
            };

            // act
            var outcome = await _target.TrySendEmailAsync(args);

            // assert
            Assert.NotNull(outcome);
        }
Пример #15
0
        public async Task ProcessMessage_ShouldNot_LogMessageSent_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _logWriter.Verify(t => t.TryLogSentMessageAsync(
                                  It.IsAny <EmailQueueToken>(),
                                  It.IsAny <SentEmailInfo>(),
                                  token),
                              Times.Never());
        }
Пример #16
0
        public async Task TrySendEmailAsync_ShouldUseRawSubjectAndBody_IfNoTemplateIdAndNoDataProvided()
        {
            // arrange
            var args = new EmailMessageParams
            {
                ApplicationId = _fixture.ApplicationId,
                To            = new List <string> {
                    "*****@*****.**"
                },
                Subject     = "Hi Bob",
                BodyEncoded = EmailMessageParams.EncodeBody("Hi Bob")
            };

            var template = await _fixture.Database.FindTemplateAsync(_fixture.TemplateId);

            var expected = new EmailTemplate(args.Subject, args.Subject);

            // act
            var success = await _target.TrySendEmailAsync(args);

            // assert
            _transport.Verify(m => m.SendAsync(It.Is <SenderParams>(p =>
                                                                    p.Subject == expected.Subject && p.Body == expected.Body)));
        }
        public void ToJson_ShouldSerializeComplexDataAsObject()
        {
            // arrange
            var data = new Dictionary <string, object>
            {
                { "Name", "Keith" },
                { "Roles", new string[] { "Developer", "Manager" } },
                { "Computer", new
                  {
                      Make  = "Microsoft",
                      Model = "Surface Book"
                  } }
            };
            var expected = JsonConvert.SerializeObject(data, Formatting.None);
            var target   = new EmailMessageParams {
                Data = data
            };

            // act
            var actual = EmailMessageParams.ToJson(target, Formatting.None);

            // assert
            Assert.Contains(expected, actual);
        }
 public Task AddAsync(EmailQueueToken token, EmailMessageParams message, CancellationToken cancellationToken)
 {
     cancellationToken.ThrowIfCancellationRequested();
     Blobs[token] = message;
     return(Task.FromResult(0));
 }