public async Task<bool> ConfirmEmailAsync(string email, string code) { AssertUtil.Waterfall() .NotNullOrWhiteSpace(email, "邮箱不能为空") .NotNullOrWhiteSpace(code, "验证码不能为空") .IsValidEmail(email, "邮箱地址不正确") .Done(); UserAccountHandler uaHandler = new UserAccountHandler(_dbContext); PersonHandler perHandler = new PersonHandler(_dbContext); AvatarHandler avatarHandler = new AvatarHandler(_dbContext); UserAccount user = await uaHandler.GetByEmailAsync(email); if (user != null) { //1. 判断验证码是否匹配。 bool isMatched = await Entities.AnyAsync(x => x.UserAccountID == user.ID && x.Code == code); if (isMatched) { //这里需要用事务来保证执行成功。 using(TransactionScope transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { //2. 匹配则修改邮件验证为True。 user.EmailConfirmed = true; uaHandler.MarkAsModified(user); bool isSucceed = await SaveChangesAsync() > 0; //3. 同时生成UserAccountXPerson记录。 if (isSucceed) { Person per = await perHandler.CreatePersonAsync(user); //4. 生成默认Avatar。 await avatarHandler.CreateDefaultAvatar(per.ID); } transactionScope.Complete(); return true; } } } return false; }
public async Task Test_01_CreatePersonAsync() { using(KoalaBlogDbContext dbContext = new KoalaBlogDbContext()) { PersonHandler perHandler = new PersonHandler(dbContext); UserAccountXPersonHandler uaxpHandler = new UserAccountXPersonHandler(dbContext); //1. Test normal create person Person p = await perHandler.CreatePersonAsync(testUA1); Assert.IsNotNull(p); Assert.AreEqual(p.NickName, "testUserAccount"); Assert.AreEqual(p.Gender, null); Assert.AreEqual(p.RealNameAccessLevel, PersonInfoAccessInfo.MyselfOnly); Assert.AreEqual(p.SexualTrendAccessLevel, PersonInfoAccessInfo.MyselfOnly); Assert.AreEqual(p.DOBAccessLevel, PersonInfoAccessInfo.MyselfOnly); //2. Get the UserAccountXPerson and test UserAccountXPerson uaxp = await uaxpHandler.LoadByUserAccountIDAsync(testUA1.ID); Assert.IsNotNull(uaxp); Assert.AreEqual(uaxp.PersonID, p.ID); Assert.AreEqual(uaxp.UserAccountID, testUA1.ID); //3. Give the null parameter and check it. bool isChecked = false; try { Person per = await perHandler.CreatePersonAsync(null); } catch (Exception ex) { isChecked = true; Assert.AreEqual(ex.GetType(), typeof(AssertException)); Assert.AreEqual(ex.Message, "UserAccount can't be null"); } Assert.IsTrue(isChecked); //4. Give the error user account and check it. isChecked = false; try { UserAccount ua = new UserAccount() { ID = 99999 }; Person per = await perHandler.CreatePersonAsync(ua); } catch (Exception ex) { isChecked = true; Assert.AreEqual(ex.GetType(), typeof(AssertException)); Assert.AreEqual(ex.Message, "This user account doesn't exist"); } Assert.IsTrue(isChecked); //5. Give the same user account and check it. isChecked = false; try { Person per = await perHandler.CreatePersonAsync(testUA1); } catch (Exception ex) { isChecked = true; Assert.AreEqual(ex.GetType(), typeof(AssertException)); Assert.AreEqual(ex.Message, "Existing relationships"); } Assert.IsTrue(isChecked); } }