[Fact]//(Skip = "Test to see if mail is inboxed")]
        public async Task EmailSenderShouldSendWithTemplate()
        {
            var factory = new SendGridMailFactory(new OptionsWrapper <MailOptions>(new MailOptions()
            {
                FromAddress     = "*****@*****.**",
                FromDisplayName = "Test",
                Templates       = new List <TemplateItem>()
                {
                    new TemplateItem()
                    {
                        Id   = "7cc262f1-48eb-4948-a22c-16cb844d4540",
                        Type = NotificationType.ResetPassword
                    }
                }
            }));
            var sender = new SimpleSendGridEmailSender(new OptionsWrapper <MailOptions>(new MailOptions()
            {
                ApiKey          = "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",
                FromAddress     = "*****@*****.**",
                FromDisplayName = "Integration Test"
            }), factory);

            var message = NotificationRequestModel.Email("*****@*****.**", "subject", "message");

            message.AddToken("-name-", "John Doe");
            message.AddToken("-city-", "Denver");
            message.AddToken("subject", "SendGrid Subject");

            await sender.SendEmailAsync(message, NotificationType.ResetPassword);
        }
        public void EmailSenderShouldFailWithInvalidApiKey()
        {
            var factory = Substitute.For <ISendGridMalFactory>();
            var sender  = new SimpleSendGridEmailSender(new OptionsWrapper <MailOptions>(new MailOptions()
            {
                ApiKey          = "xxx",
                FromAddress     = "*****@*****.**",
                FromDisplayName = "Integration Test"
            }), factory);

            factory.CreateMessage(Arg.Any <NotificationType>(), Arg.Any <NotificationRequestModel>()).Returns(c =>
            {
                var mailMessage = new SendGridMessage();
                mailMessage.AddTo("*****@*****.**");
                mailMessage.From        = new EmailAddress("*****@*****.**", "Integration Test");
                mailMessage.Subject     = "Test Subject";
                mailMessage.HtmlContent = "Test Body";
                return(mailMessage);
            });

            Func <Task> act = async() =>
            {
                await sender.SendEmailAsync(NotificationRequestModel.Email("*****@*****.**", "test subject", "test body"));
            };

            act.Should().Throw <InvalidOperationException>();
        }
        public void EmailSenderShouldThrowWhenOptionsNotConfigured()
        {
            Func <Task> act = async() =>
            {
                var sender = new SimpleSendGridEmailSender(new OptionsWrapper <MailOptions>(new MailOptions()), Substitute.For <ISendGridMalFactory>());
                await sender.SendEmailAsync(NotificationRequestModel.Email("*****@*****.**", "test subject", "test body"));
            };

            act.Should().Throw <ArgumentException>();
        }
        [Fact]//(Skip = "Test to see if mail is inboxed")]
        public async Task EmailSenderShouldSendNotificationWithSendGrid()
        {
            var factory = Substitute.For <ISendGridMalFactory>();
            var sender  = new SimpleSendGridEmailSender(new OptionsWrapper <MailOptions>(new MailOptions()
            {
                ApiKey          = "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",
                FromAddress     = "*****@*****.**",
                FromDisplayName = "Integration Test"
            }), factory);

            factory.CreateMessage(Arg.Any <NotificationType>(), Arg.Any <NotificationRequestModel>()).Returns(c =>
            {
                var mailMessage = new SendGridMessage();
                mailMessage.AddTo("*****@*****.**");
                mailMessage.From        = new EmailAddress("*****@*****.**", "Integration Test");
                mailMessage.Subject     = "Test Without Template";
                mailMessage.HtmlContent = "Test Body";
                return(mailMessage);
            });
            await sender.SendEmailAsync(NotificationRequestModel.Email("*****@*****.**", "test subject", "test body"));
        }