Skip to content

Commit

Permalink
Can enqueue email to specific queue
Browse files Browse the repository at this point in the history
  • Loading branch information
joaofx committed Nov 9, 2023
1 parent ae21f4d commit 949a459
Show file tree
Hide file tree
Showing 5 changed files with 213 additions and 30 deletions.
26 changes: 16 additions & 10 deletions src/Miru.Testing/QueueingTestFixtureExtensions.cs
Expand Up @@ -55,14 +55,16 @@ public static TJob EnqueuedFor<TJob>(this ITestFixture fixture)
return (TJob) entry.Job.Args[0];
}

public static IEnumerable<TJob> AllEnqueuedFor<TJob>(this ITestFixture fixture) where TJob : IQueueable =>
fixture.Get<JobStorage>()
.GetMonitoringApi()
.EnqueuedJobs("default", 0, 1000)
.Select(result => result.Value)
.Where(enqueueJob => enqueueJob.Job.Args[0].GetType() == typeof(TJob))
.Select(enqueueJob => (TJob) enqueueJob.Job.Args[0])
.ToList();
public static IEnumerable<TJob> AllEnqueuedFor<TJob>(
this ITestFixture fixture,
string queue = "default") where TJob : IQueueable =>
fixture.Get<JobStorage>()
.GetMonitoringApi()
.EnqueuedJobs(queue, 0, 1000)
.Select(result => result.Value)
.Where(enqueueJob => enqueueJob.Job.Args[0].GetType() == typeof(TJob))
.Select(enqueueJob => (TJob) enqueueJob.Job.Args[0])
.ToList();

public static Email EnqueuedEmail(this ITestFixture fixture)
{
Expand All @@ -74,7 +76,11 @@ public static Email EnqueuedEmail(this ITestFixture fixture)
return job.Email;
}

public static IEnumerable<Email> EnqueuedEmails(this ITestFixture fixture) =>
fixture.AllEnqueuedFor<EmailJob>().Select(x => x.Email);
public static IEnumerable<Email> EnqueuedEmails(
this ITestFixture fixture,
string queue = "default") =>
fixture
.AllEnqueuedFor<EmailJob>(queue: queue)
.Select(x => x.Email);
}
}
2 changes: 1 addition & 1 deletion src/Miru/Mailing/FluentEmailMailer.cs
Expand Up @@ -118,7 +118,7 @@ private string GetFullFile(Mailable mailable, EmailTemplate emailTemplate)

private void Enqueue(Email fluentMail)
{
_jobs.Enqueue(new EmailJob(fluentMail));
_jobs.Enqueue(new EmailJob(fluentMail), queue: _options.QueueName);

_logger.LogDebug(
$"Enqueued email '{fluentMail.Subject}' to {fluentMail.ToAddresses.Select(m => m.EmailAddress).Join(",")}");
Expand Down
38 changes: 21 additions & 17 deletions src/Miru/Mailing/MailingOptions.cs
@@ -1,25 +1,29 @@
using System;
using FluentEmail.Core.Models;

namespace Miru.Mailing
namespace Miru.Mailing;

public class MailingOptions
{
public class MailingOptions
{
private Action<Email> _defaultEmailAction;
private Action<Email> _defaultEmailAction;

public string AppUrl { get; set; }
public SmtpOptions Smtp { get; set; } = new SmtpOptions();
public string TemplatePath { get; set; }
public string AppUrl { get; set; }
public SmtpOptions Smtp { get; set; } = new();
public string TemplatePath { get; set; }
public string QueueName { get; set; }

public void EmailDefaults(Action<Email> defaultMail)
{
_defaultEmailAction = defaultMail;
}

public void EmailDefaults(Action<Email> defaultMail)
{
_defaultEmailAction = defaultMail;
}
public EmailData SetDefaultEmail(Email email)
{
_defaultEmailAction?.Invoke(email);
return email;
}

public EmailData SetDefaultEmail(Email email)
{
_defaultEmailAction?.Invoke(email);
return email;
}
public void EnqueueIn(string queueName)
{
QueueName = queueName;
}
}
174 changes: 174 additions & 0 deletions tests/Miru.Tests/Mailing/MailingLaterTest.cs
@@ -0,0 +1,174 @@
using System;
using Hangfire.MemoryStorage;
using MediatR;
using Microsoft.Extensions.DependencyInjection;
using Miru.Foundation.Logging;
using Miru.Hosting;
using Miru.Mailing;
using Miru.Storages;
using Miru.Urls;

namespace Miru.Tests.Mailing;

public class MailingLater
{
private readonly MiruTestWebHost _host;

private readonly IMailer _mailer;
private readonly MemorySender _emailsSent;
private readonly IServiceProvider _sp;
private readonly ITestFixture _;

public MailingLater()
{
_host = new MiruTestWebHost(MiruHost.CreateMiruHost(), services =>
{
services
.AddAppTestStorage()
.AddMiruMvc()
.AddMiruUrls()
.AddLogging()
.AddSerilogConfig()
.AddSingleton<IUrlMaps, StubUrlMaps>()
.AddMailing(options =>
{
options.EnqueueIn("email");
options.EmailDefaults(email =>
{
email.From("mailing@test.com", "Mailing Test");
email.ReplyTo("noreply@test.com");
});
options.AppUrl = "http://www.contoso.com";
options.TemplatePath = new SolutionFinder().FromCurrentDir().Solution.AppTestsDir;
})
.AddMiruCoreTesting()
.AddSenderMemory()
.AddSingleton<MiruSolution, MiruTestSolution>()
.AddQueuing(x => x.Configuration.UseMemoryStorage())
.AddMediatR(typeof(MailingTest).Assembly);
});

_sp = _host.Services;

_mailer = _sp.GetService<IMailer>();

_emailsSent = _sp.GetService<MemorySender>();

_ = _sp.GetService<ITestFixture>();
}

[SetUp]
public void Setup()
{
_emailsSent.Clear();
}

[Test]
[Ignore("FIX")]
public void Should_enqueue_email_with_attachment()
{
}

[Test]
public async Task Should_enqueue_to_configured_queue_name()
{
// act
await _mailer.SendLaterAsync(new ConfirmMail(new User()));

// assert
var enqueuedEmails = _.EnqueuedEmails(queue: "email");

enqueuedEmails.ShouldCount(1);
enqueuedEmails.First().FromAddress.EmailAddress.ShouldBe("mailing@test.com");
enqueuedEmails.First().ReplyToAddresses[0].EmailAddress.ShouldBe("noreply@test.com");
}

public class ConfirmMail : Mailable
{
private readonly User _user;

public ConfirmMail(User user)
{
_user = user;
}

public override void Build(Email mail)
{
mail.To(_user.Email)
.Subject($"Welcome {_user.Name}")
.Body($@"
Hi {_user.Name},
Confirm your email clicking on the link below:
");
}
}

public class EmptyMail : Mailable
{
public override void Build(Email mail)
{
}
}

public class LackToMail : Mailable
{
public override void Build(Email mail)
{
}
}

public class LackFromMail : Mailable
{
public override void Build(Email mail)
{
mail.From(string.Empty);
}
}

public class WelcomeMail : Mailable
{
private readonly User _user;

public WelcomeMail(User user)
{
_user = user;
}

public override void Build(Email mail)
{
mail.To(_user.Email)
.Subject($"Welcome {_user.Name}")
.Template("_Welcome", _user);
}
}

public class EmailWithAttachment : Mailable
{
private readonly User _user;
private readonly IStorage _storage;

public EmailWithAttachment(User user, IStorage storage)
{
_user = user;
_storage = storage;
}

public override async Task BuildAsync(Email mail)
{
mail.To(_user.Email)
.Subject($"Welcome {_user.Name}")
.Body("Check your attachment")
.Attach("attachment.txt", await _storage.GetAsync("attachment.txt"));
}
}

public class User
{
public string Email { get; set; }
public string Name { get; set; }
}
}
3 changes: 1 addition & 2 deletions tests/Miru.Tests/Mailing/MailingTest.cs
Expand Up @@ -6,7 +6,6 @@
using Miru.Foundation.Logging;
using Miru.Hosting;
using Miru.Mailing;
using Miru.Queuing;
using Miru.Storages;
using Miru.Urls;

Expand Down Expand Up @@ -140,7 +139,7 @@ public async Task Email_with_attachment()
// lastEmail.Subject.ShouldBe("Abbey Road");
// lastEmail.Body.ShouldContain("Lets go?");
// }

[Test]
public async Task When_sending_email_should_throw_exception_if_email_from_is_not_set()
{
Expand Down

0 comments on commit 949a459

Please sign in to comment.