Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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");
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
 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;
 }
Esempio n. 5
0
 public Dictionary <string, object> BindEmailApi(JsonUserDetails Data)
 {
     return(ObjDAL.BindEmail(Data));
 }
Esempio n. 6
0
 public Dictionary <string, object> BindGridApi1(JsonUserDetails Data)
 {
     return(ObjDAL.BindGrid1(Data));
 }
Esempio n. 7
0
        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);
        }