private void CheckUserDataUpdated(User mcUser, JsonUserDetails jsonUserDetails) { Thread.Sleep(100); // EF Core proxy object is returning stale data. Delay allows it to settle. Suggestions welcome! var mcUserFirstName = mcUser.FirstName; // seems to be a race condition or something here, keep getting stale value assigned mcUserFirstName.Should().Be(jsonUserDetails.GivenName); mcUser.LastName.Should().Be(jsonUserDetails.FamilyName); mcUser.Email.Should().Be(jsonUserDetails.Email); }
public void UnknownUserSignInShouldThrow() { var unknownUser = new JsonUserDetails { Email = "*****@*****.**", FamilyName = "Who", GivenName = "The", Subject = "673535D4-3CB3-4A1D-B1F0-B0FFB787CECF", }; Func <Task> signIn = async() => { await _userService.GetAndUpdateUserAsync(unknownUser); }; signIn.Should().Throw <McUserNotFoundException>($"{unknownUser.Email} / {unknownUser.Subject} does not exist in McUsers"); }
/// <inheritdoc /> public async Task <User> GetAndUpdateUserAsync(JsonUserDetails userDetails) { var mcUser = await _context.Users.SingleOrDefaultAsync(u => u.SignInUserId == userDetails.Subject); if (mcUser == null) { // fall back to email address for users where we don't yet know their sign-in id mcUser = await _context.GetUsers(userDetails.Email).SingleOrDefaultAsync(); if (mcUser != null) { // record the sign-in id and use that in future mcUser.SignInUserId = userDetails.Subject; } } if (mcUser == null) { throw new McUserNotFoundException(); } UpdateMcUserFromSignIn(mcUser, userDetails); _context.Save(); return(mcUser); }
private static void UpdateMcUserFromSignIn(User user, JsonUserDetails userDetails) { //user.Email = userDetails.Email; // todo: update email address from sign-in. blocked by use of email as a foreign-key user.FirstName = userDetails.GivenName; user.LastName = userDetails.FamilyName; }
public Dictionary <string, object> BindEmailApi(JsonUserDetails Data) { return(ObjDAL.BindEmail(Data)); }
public Dictionary <string, object> BindGridApi1(JsonUserDetails Data) { return(ObjDAL.BindGrid1(Data)); }
public async Task SignInTest() { var firstSignInTime = new DateTime(2017, 12, 31, 23, 59, 59); _mockTime = firstSignInTime; const string bobSubject = "2C4B4170-8979-444F-8D44-DC6DE22BEABF"; var userDetails1 = new JsonUserDetails { Email = _testUserBob.Email, GivenName = "2.Bobby", FamilyName = "Charlton", // different to contents of McUsers to check it gets updated Subject = bobSubject, }; // bob signs in for the first time var bob = await _userService.GetAndUpdateUserAsync(userDetails1); await _userService.LoggedInAsync(bob); // check user data updated from claims and timestamps have been set CheckUserDataUpdated(_testUserBob, userDetails1); _testUserBob.FirstLoginDateUtc.Should().Be(firstSignInTime); _testUserBob.LastLoginDateUtc.Should().Be(firstSignInTime); // check welcome email sent & logged _testUserBob.WelcomeEmailDateUtc.Should().Be(firstSignInTime); var welcomeModelBob = new WelcomeEmailModel(_testUserBob); _mockWelcomeEmailService.Verify( x => x.Send(It.Is <WelcomeEmailModel>(model => (model.EmailAddress == welcomeModelBob.EmailAddress))), Times.Once); var secondSignInTime = _mockTime.AddHours(8); _mockTime = secondSignInTime; // bob signs in again, with a new name & email // this checks that we are now relying on the sign-in guid and not the email address, // and also that the email address gets updated var userDetails2 = new JsonUserDetails { Email = _testUserBob.Email, //Email = "*****@*****.**"; // todo: check for email address changes, blocked by use of email as an FK GivenName = "3.Sir Bob", FamilyName = "Charlton the legend", Subject = bobSubject, }; var bob2 = await _userService.GetAndUpdateUserAsync(userDetails2); // would throw if it couldn't find the McUser entry await _userService.LoggedInAsync(bob2); // check user data updated from claims and timestamps have been set CheckUserDataUpdated(_testUserBob, userDetails2); _testUserBob.LastLoginDateUtc.Should().Be(secondSignInTime); // check original timestamps have not been altered _testUserBob.FirstLoginDateUtc.Should().Be(firstSignInTime); _testUserBob.WelcomeEmailDateUtc.Should().Be(firstSignInTime); // check only one email was sent _mockWelcomeEmailService.Verify(x => x.Send(It.IsAny <WelcomeEmailModel>()), Times.Once); }