using MailKit.Security;
using MimeKit;
using Yavsc.Interfaces;
namespace Yavsc.Org.Tests.Fakes
{
///
/// In-memory test double for . Records
/// every call for assertion and short-circuits the SMTP
/// roundtrip.
///
public sealed class RecordingSmtpClient : ISmtpClient
{
public List Calls { get; } = new();
public int Timeout { get; set; }
public string? LastConnectedHost { get; private set; }
public int LastConnectedPort { get; private set; }
public SecureSocketOptions LastConnectedOptions { get; private set; }
public string? LastAuthenticatedUser { get; private set; }
public MimeMessage? LastSentMessage { get; private set; }
public bool WasDisconnected { get; private set; }
public bool Disposed { get; private set; }
public void Connect(string host, int port, SecureSocketOptions options)
{
LastConnectedHost = host;
LastConnectedPort = port;
LastConnectedOptions = options;
Calls.Add(new RecordingSmtpCall(RecordingSmtpCallKind.Connect, host, port, options));
}
public void Authenticate(string userName, string password)
{
LastAuthenticatedUser = userName;
Calls.Add(new RecordingSmtpCall(RecordingSmtpCallKind.Authenticate, userName, null, null));
}
public Task SendAsync(MimeMessage message, CancellationToken cancellationToken = default)
{
LastSentMessage = message;
Calls.Add(new RecordingSmtpCall(RecordingSmtpCallKind.Send, message.Subject, null, null));
return Task.CompletedTask;
}
public void Disconnect(bool quit)
{
WasDisconnected = quit;
Calls.Add(new RecordingSmtpCall(RecordingSmtpCallKind.Disconnect, null, null, null));
}
public void Dispose()
{
Disposed = true;
}
}
public enum RecordingSmtpCallKind
{
Connect,
Authenticate,
Send,
Disconnect,
}
public readonly record struct RecordingSmtpCall(
RecordingSmtpCallKind Kind,
string? HostOrSubjectOrUser,
int? Port,
SecureSocketOptions? Options);
}