public async Task SendCodeThroughEmailTest() { Crypto.SecretToken = Crypto.RandomString(); var smtp = new MailSmtpProvider { Id = Guid.NewGuid(), Host = "smtp.live.com", Port = 25, Ssl = false, SenderDisplayName = "Weixing Chen", SenderMailAddress = "*****@*****.**", CredentialName = "*****@*****.**", Password = "", IsInUse = true }; //Config CredentialName & Password before running this test if (string.IsNullOrEmpty(smtp.CredentialName) || string.IsNullOrEmpty(smtp.Password)) { return; } using var mailDb = new DbContextOptionsBuilder <MailDbContext>().UseInMemoryDatabase("UnitTest").CreateDbContext(); using var twoFactorDb = new DbContextOptionsBuilder <TwoFactorDbContext>().UseInMemoryDatabase("UnitTest").CreateDbContext(); mailDb.Add(smtp); mailDb.SaveChanges(); var sendTo = "*****@*****.**"; var principal = PrincipalUser.Personate(1, "TestUser", null); var mailSender = new MailSender(mailDb); var twoFactorManager = new TwoFactorManager(twoFactorDb, principal, null, mailSender); var sentResult = await twoFactorManager.SendCodeThroughEmailAsync(sendTo); var row = twoFactorDb.TwoFactorCodes.FirstOrDefault(); Assert.IsTrue(sentResult.Ok); Assert.IsNotNull(row); Assert.AreEqual(sendTo, row.SentTo); Assert.IsFalse(row.IsUsed); var verifyResult = await twoFactorManager.VerifyCodeAsync(sendTo, row.Code, true); row = twoFactorDb.TwoFactorCodes.FirstOrDefault(); Assert.IsTrue(verifyResult.Ok); Assert.AreEqual(sendTo, row.SentTo); Assert.IsTrue(row.IsUsed); mailDb.Database.EnsureDeleted(); twoFactorDb.Database.EnsureDeleted(); }
public async Task VerifyCodeTest() { using var testDb = new DbContextOptionsBuilder <TwoFactorDbContext>().UseInMemoryDatabase("UnitTest").CreateDbContext(); var principal = PrincipalUser.Personate(1, "TestUser", null); var row = new TwoFactorCode { Code = "123456", UserId = principal.Id, SentTo = "17751283521" }; testDb.Add(row); testDb.SaveChanges(); Result verifyResult = null; var twoFactorManager = new TwoFactorManager(testDb, principal, new AliyunSmsSender(new AliyunSmsOptions()), null); for (var i = 0; i < 12; i++) { verifyResult = await twoFactorManager.VerifyCodeAsync(row.SentTo, "WRONG!", true); Assert.IsFalse(verifyResult.Ok); } row = testDb.TwoFactorCodes.First(); Assert.IsFalse(row.IsUsed); Assert.IsTrue(row.ErrorTimes > 10); //it still fails even the code is correct this time, because it has already failed for more than 10 times verifyResult = await twoFactorManager.VerifyCodeAsync(row.SentTo, row.Code, true); Assert.IsFalse(verifyResult.Ok); //reset then try a good one row.ErrorTimes = 0; testDb.SaveChanges(); verifyResult = await twoFactorManager.VerifyCodeAsync(row.SentTo, row.Code, true); row = testDb.TwoFactorCodes.First(); Assert.IsTrue(verifyResult.Ok); Assert.IsTrue(row.IsUsed); //if try one more time, it should fail because the code is used verifyResult = await twoFactorManager.VerifyCodeAsync(row.SentTo, row.Code, true); Assert.IsFalse(verifyResult.Ok); testDb.Database.EnsureDeleted(); }
public async Task SendAsyncTest() { Crypto.SecretToken = Crypto.RandomString(); //attention: fill the required values to run this test var smtp = new MailSmtpProvider { Id = Guid.NewGuid(), Host = "smtp.live.com", Port = 25, Ssl = false, SenderDisplayName = "Weixing Chen", SenderMailAddress = "*****@*****.**", CredentialName = "*****@*****.**", Password = "", IsInUse = true }; if (string.IsNullOrEmpty(smtp.CredentialName) || string.IsNullOrEmpty(smtp.Password)) { return; } using var db = new DbContextOptionsBuilder <MailDbContext>().UseInMemoryDatabase("UnitTest").CreateDbContext(); db.Add(smtp); db.SaveChanges(); var sender = new MailSender(db); var mail = new MailMessage { Subject = $"Husky.Mail Unit Test - {DateTime.Now:yyyy-M-d H:mm}", Body = "<div style='color:navy'>Greeting</div>", IsHtml = true, To = new List <MailAddress> { new MailAddress { Name = "Weixing", Address = "*****@*****.**" } }, Cc = new List <MailAddress> { new MailAddress { Name = "Weixing", Address = "*****@*****.**" } }, Attachments = new List <MailAttachment> { new MailAttachment { Name = "DummyAttachment.zip", ContentType = "application/x-zip-compressed", ContentStream = new MemoryStream(Crypto.RandomBytes()) } } }; string strReadFromCallback = null; await sender.SendAsync(mail, arg => strReadFromCallback = arg.MailMessage.Body); var mailRecord = db.MailRecords .AsNoTracking() .Include(x => x.Smtp) .Include(x => x.Attachments) .OrderBy(x => x.Id) .LastOrDefault(); Assert.IsNotNull(mailRecord); Assert.AreEqual(mailRecord.Subject, mail.Subject); Assert.AreEqual(mailRecord.Body, mail.Body); Assert.AreEqual(mailRecord.IsHtml, mail.IsHtml); Assert.AreEqual(mailRecord.Smtp.Id, smtp.Id); Assert.AreEqual(mailRecord.To, string.Join(";", mail.To.Select(x => x.ToString()))); Assert.AreEqual(mailRecord.Cc, string.Join(";", mail.Cc.Select(x => x.ToString()))); Assert.AreEqual(mailRecord.Attachments.Count, mail.Attachments.Count); Assert.AreEqual(mailRecord.Attachments.First().Name, mail.Attachments.First().Name); Assert.AreEqual(mailRecord.Attachments.First().ContentStream.Length, mail.Attachments.First().ContentStream.Length); Assert.AreEqual(mailRecord.Body, strReadFromCallback); Assert.AreEqual(mailRecord.IsSuccessful, true); Assert.IsTrue(string.IsNullOrEmpty(mailRecord.Exception)); db.Database.EnsureDeleted(); } }