Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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();
        }
    }