def test_delete_has_users_new_role(self): """ Test deleting a role if there are still users and a valid new role is given. Expected result: The role is deleted. The role is assigned to all users who had the old role (but not to others). """ # The role that will be deleted. name = 'Administrator' role = Role(name=name) user = User('*****@*****.**', 'Jane Doe') user.role = role db.session.add(role) db.session.add(user) # The new role for the user. new_role = Role(name='Guest') db.session.add(new_role) # Another role and user who will stay untouched. other_role = Role(name='User') other_user = User('*****@*****.**', 'John Doe') other_user.role = other_role db.session.add(other_role) db.session.add(other_user) db.session.commit() role.delete(new_role) loaded_role = Role.load_from_name(name) self.assertIsNone(loaded_role) self.assertEqual(new_role, user.role) self.assertEqual(other_role, other_user.role)
def test_init_has_users(self): """ Test that the form is correctly initialized if the role has users. Expected result: The new_role field exists and is initialized with all other roles. """ role = Role(name='Administrator') user = User('*****@*****.**', 'Jane Doe') user.role = role other_role_1 = Role(name='Visitor') other_role_2 = Role(name='Guest') db.session.add(role) db.session.add(user) db.session.add(other_role_1) db.session.add(other_role_2) db.session.commit() # The role choices are ordered by name and skip the role to delete. choices = [ (0, ''), (other_role_2.id, other_role_2.name), (other_role_1.id, other_role_1.name), ] self.assertLess(other_role_1.id, other_role_2.id) self.assertListEqual([user], role.users.all()) form = RoleDeleteForm(role) self.assertIsNotNone(form.new_role) self.assertListEqual(choices, form.new_role.choices)
def test_permission_required_one_of_has_permission(self): """ Test the `permission_required` decorator if the user has one of the requested permission, but not all. Expected result: The decorated view function is returned. """ email = '*****@*****.**' name = 'Jane Doe' password = '******' user = User(email, name) user.set_password(password) user.role = Role('Administrator') user.role.permissions = Permission.EditRole db.session.add(user) db.session.commit() user.login(email, password) self.assertTrue(user.role.has_permission(Permission.EditRole)) self.assertFalse(user.role.has_permission(Permission.EditUser)) view_function = permission_required_one_of( Permission.EditRole, Permission.EditUser)(self.view_function) response = view_function() self.assertEqual(self.view_function(), response)
def test_permission_required_all_not_all_permissions(self): """ Test the `permission_required_all` decorator if the user does not have all the requested permissions. Expected result: The request is aborted with an error 403. """ email = '*****@*****.**' name = 'Jane Doe' password = '******' user = User(email, name) user.set_password(password) user.role = Role('Administrator') user.role.permissions = Permission.EditRole db.session.add(user) db.session.commit() user.login(email, password) self.assertTrue(user.role.has_permission(Permission.EditRole)) self.assertFalse(user.role.has_permission(Permission.EditUser)) with self.assertRaises(Forbidden): permission_required_all(Permission.EditRole, Permission.EditUser)(self.view_function)()
def test_permission_required_one_of_has_permission(self): """ Test the `permission_required` decorator if the user has one of the requested permission, but not all. Expected result: The decorated view function is returned. """ email = '*****@*****.**' name = 'Jane Doe' password = '******' user = User(email, name) user.set_password(password) user.role = Role('Administrator') user.role.permissions = Permission.EditRole db.session.add(user) db.session.commit() user.login(email, password) self.assertTrue(user.role.has_permission(Permission.EditRole)) self.assertFalse(user.role.has_permission(Permission.EditUser)) view_function = permission_required_one_of(Permission.EditRole, Permission.EditUser)(self.view_function) response = view_function() self.assertEqual(self.view_function(), response)
def create_user(email: str, name: str, password: str, role: Optional[Role] = None) -> User: """ Create a user with the given parameters. If a role is given, assign the role to the user. Commit this user to the DB. :param email: The email address of the user. :param name: The name of the user. :param password: The password of the user. :param role: The role for the user. Defaults to `None`. :return: The created user. """ user = User(email, name) user.set_password(password) if role: user.role = role db.session.add(user) db.session.commit() return user
def test_delete_same_role(self): """ Test deleting a role if the same role is given. Expected result: An error is raised. """ name = 'Administrator' role = Role(name=name) user = User('*****@*****.**', 'Jane Doe') user.role = role db.session.add(role) db.session.add(user) db.session.commit() with self.assertRaises(ValueError) as exception_cm: role.delete(role) loaded_role = Role.load_from_name(name) self.assertEqual( 'The new role must not be the role that will be deleted.', str(exception_cm.exception)) self.assertIsNotNone(loaded_role) self.assertEqual(loaded_role, user.role)
def test_delete_has_users_no_role(self): """ Test deleting a role if there are still users and no role is given. Expected result: An error is raised. """ name = 'Administrator' role = Role(name=name) user = User('*****@*****.**', 'Jane Doe') user.role = role db.session.add(role) db.session.add(user) db.session.commit() with self.assertRaises(ValueError) as exception_cm: role.delete() loaded_role = Role.load_from_name(name) self.assertIn('A new role must be given', str(exception_cm.exception)) self.assertIsNotNone(loaded_role) self.assertEqual(loaded_role, user.role)