public void ApproveModerationTest_Invitation()
        {
            // Arrange dependencies
            var requests = viewModelFactory.GetViewModel <ModerationRequestCollectionViewModel>();

            requests.Models = DesignTimeHelper.GetModerationRequests(DesignTimeHelper.GetGuestUser());
            var grantsVm  = viewModelFactory.GetViewModel <RoomPermissionGrantCollectionViewModel>();
            var requestVm = requests.ViewModels[0];
            var roomVm    = viewModelFactory.GetViewModel <RoomViewModel>();

            roomVm.Model = room;
            var localUserVm = viewModelFactory.GetViewModel <LocalUserViewModel>();

            localUserVm.Model = user;

            // Configure mock RoomServiceAdapter.
            mockRoomService.Setup(rs => rs.CreateInvitation(It.IsAny <LoginSession>(), It.IsAny <Guid>(), It.IsAny <Invitation>(), It.IsAny <OperationCallback>()))
            .Callback((LoginSession loginSessionId, Guid roomId, Invitation invitation, OperationCallback callback) =>
            {
                Assert.IsNotNull(invitation);
                Assert.AreEqual(user.UserId, invitation.UserId);
                Assert.AreEqual(room.RoomId, invitation.RoomId);
                callback(null);
            });
            mockRoomService.Setup(rs => rs.UpdateRoomPermissionsForInvitation(It.IsAny <LoginSession>(), It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <ObservableCollection <RoomPermissionGrant> >(), It.IsAny <OperationCallback>()))
            .Callback((LoginSession loginSessionId, Guid moderationRequestId, Guid securityPrincipalId, ObservableCollection <RoomPermissionGrant> grants, OperationCallback callback) =>
            {
                Assert.AreEqual(2, grants.Count);
                Assert.AreEqual(1, grants.Count(g => g.RoomPermissionTag == "Share"));
                Assert.AreEqual(1, grants.Count(g => g.RoomPermissionTag == "Join"));
                callback(null);
            });

            // Affirm
            Assert.IsTrue(requestVm.Model.ModerationRequestedRoomPermissions.Count > 0);
            Assert.IsTrue(requestVm.Model.ModerationRequestedRoomPermissions.All(p => !string.IsNullOrEmpty(p.RoomPermissionTag)));

            // Act
            grantsVm.ApproveModerationRequest(requestVm);

            // Assert
            mockRoomService.VerifyAll();
            Assert.AreEqual(1, grantsVm.SecurityPrincipals.OfType <InvitationViewModel>().Count());
            var invitationVm = grantsVm.SecurityPrincipals.OfType <InvitationViewModel>().First();

            Assert.AreEqual(requestVm.Model.ModerationRequestedRoomPermissions.Count, invitationVm.RoomPermissionGrants.ViewModelCount);
            foreach (var grantvm in invitationVm.RoomPermissionGrants.ViewModels)
            {
                string roomPermissionTag = grantvm.Model.RoomPermissionTag;
                Assert.AreEqual(RoomPermissionScopeValues.Invitation, grantvm.Model.RoomPermissionScopeTag);
                Assert.AreEqual(1, requestVm.Model.ModerationRequestedRoomPermissions.Count(p => p.RoomPermissionTag == roomPermissionTag));
            }
        }
        public void ApproveModerationTest_User()
        {
            // Arrange
            var requests = viewModelFactory.GetViewModel <ModerationRequestCollectionViewModel>();

            requests.Models = DesignTimeHelper.GetModerationRequests(user);
            var grantsVm  = viewModelFactory.GetViewModel <RoomPermissionGrantCollectionViewModel>();
            var requestVm = requests.ViewModels[0];
            var roomVm    = viewModelFactory.GetViewModel <RoomViewModel>();

            roomVm.Model = room;
            mockRoomService.Setup(rs => rs.UpdateRoomPermissionsForUser(It.IsAny <LoginSession>(), It.IsAny <Guid>(), It.IsAny <ObservableCollection <RoomPermissionGrant> >(), It.IsAny <OperationCallback>()))
            .Callback((LoginSession loginSession, Guid moderationRequestId, ObservableCollection <RoomPermissionGrant> grants, OperationCallback callback) =>
            {
                Assert.AreEqual(2, grants.Count);
                Assert.AreEqual(1, grants.Count(g => g.RoomPermissionTag == "Share"));
                Assert.AreEqual(1, grants.Count(g => g.RoomPermissionTag == "Join"));
                callback(null);
            });

            // Affirm
            Assert.IsTrue(requestVm.Model.ModerationRequestedRoomPermissions.Count > 0);
            Assert.IsTrue(requestVm.Model.ModerationRequestedRoomPermissions.All(p => !string.IsNullOrEmpty(p.RoomPermissionTag)));

            // Act
            grantsVm.ApproveModerationRequest(requestVm);

            // Assert
            mockRoomService.VerifyAll();
            Assert.IsTrue(grantsVm.SecurityPrincipals.Count(p => p.SecurityPrincipalId == requestVm.Model.UserId) == 1, "The generated grant should have the same SecurityPrincipalId as the request's UserId");
            var uservm = (UserViewModel)grantsVm.SecurityPrincipals.First(p => p.SecurityPrincipalId == requestVm.Model.UserId);

            Assert.AreEqual(requestVm.Model.ModerationRequestedRoomPermissions.Count, uservm.RoomPermissionGrants.ViewModelCount);
            foreach (var grantvm in uservm.RoomPermissionGrants.ViewModels)
            {
                string roomPermissionTag = grantvm.Model.RoomPermissionTag;
                Assert.AreEqual(RoomPermissionScopeValues.User, grantvm.Model.RoomPermissionScopeTag);
                Assert.AreEqual(1, requestVm.Model.ModerationRequestedRoomPermissions.Count(p => p.RoomPermissionTag == roomPermissionTag));
            }
        }