public KickUser ( ChatUser user, ChatUser targetUser, ChatRoom targetRoom ) : void | ||
user | ChatUser | |
targetUser | ChatUser | |
targetRoom | ChatRoom | |
return | void |
public void KickUser(ChatUser user, ChatUser targetUser, ChatRoom targetRoom)
{
EnsureOwnerOrAdmin(user, targetRoom);
if (targetUser == user)
{
throw new InvalidOperationException("Why would you want to kick yourself?");
}
if (!_repository.IsUserInRoom(_cache, targetUser, targetRoom))
{
throw new InvalidOperationException(String.Format("'{0}' isn't in '{1}'.", targetUser.Name, targetRoom.Name));
}
// only admin can kick admin
if (!user.IsAdmin && targetUser.IsAdmin)
{
throw new InvalidOperationException("You cannot kick an admin. Only admin can kick admin.");
}
// If this user isn't the creator/admin AND the target user is an owner then throw
if (targetRoom.Creator != user && targetRoom.Owners.Contains(targetUser) && !user.IsAdmin)
{
throw new InvalidOperationException("Owners cannot kick other owners. Only the room creator can kick an owner.");
}
LeaveRoom(targetUser, targetRoom);
}
public void ThrowsIfUserIsNotOwner() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; var user2 = new ChatUser { Name = "foo2" }; repository.Add(user); repository.Add(user2); var room = new ChatRoom { Name = "Room", }; user.Rooms.Add(room); user2.Rooms.Add(room); room.Users.Add(user); room.Users.Add(user2); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.KickUser(user, user2, room)); }