Files
the-littlest-jupyterhub/tests/test_user.py
2021-11-03 23:55:34 +01:00

124 lines
3.4 KiB
Python

"""
Test wrappers in tljw.user module
"""
from tljh import user
import os
import os.path
import stat
import uuid
import pwd
import grp
import pytest
def test_ensure_user():
"""
Test user creation & removal
"""
# Use a prefix to make sure we never start with a number
username = "u" + str(uuid.uuid4())[:8]
# Validate that no user exists
with pytest.raises(KeyError):
pwd.getpwnam(username)
try:
# Create user!
user.ensure_user(username)
# This raises exception if user doesn't exist
entry = pwd.getpwnam(username)
# Home directory must also exist
home_dir = entry.pw_dir
assert os.path.exists(home_dir)
# Ensure not word readable/writable especially in teaching context
homedir_stats = os.stat(home_dir).st_mode
assert not (
homedir_stats & stat.S_IROTH
), "Everyone should not be able to read users home directory"
assert not (
homedir_stats & stat.S_IWOTH
), "Everyone should not be able to write users home directory"
assert not (
homedir_stats & stat.S_IXOTH
), "Everyone should not be able to list what is in users home directory"
# Run ensure_user again, should be a noop
user.ensure_user(username)
# User still exists, after our second ensure_user call
pwd.getpwnam(username)
finally:
# We clean up and remove user!
user.remove_user(username)
with pytest.raises(KeyError):
pwd.getpwnam(username)
def test_ensure_group():
"""
Test group creation & removal
"""
# Use a prefix to make sure we never start with a number
groupname = "g" + str(uuid.uuid4())[:8]
# Validate that no group exists
with pytest.raises(KeyError):
grp.getgrnam(groupname)
try:
# Create group
user.ensure_group(groupname)
# This raises if group doesn't exist
grp.getgrnam(groupname)
# Do it again, this should be a noop
user.ensure_group(groupname)
grp.getgrnam(groupname)
finally:
# Remove the group
user.remove_group(groupname)
with pytest.raises(KeyError):
grp.getgrnam(groupname)
def test_group_membership():
"""
Test group memberships can be added / removed
"""
username = "u" + str(uuid.uuid4())[:8]
groupname = "g" + str(uuid.uuid4())[:8]
# Validate that no group exists
with pytest.raises(KeyError):
grp.getgrnam(groupname)
with pytest.raises(KeyError):
pwd.getpwnam(username)
try:
user.ensure_group(groupname)
user.ensure_user(username)
user.ensure_user_group(username, groupname)
assert username in grp.getgrnam(groupname).gr_mem
# Do it again, this should be a noop
user.ensure_user_group(username, groupname)
assert username in grp.getgrnam(groupname).gr_mem
# Remove it
user.remove_user_group(username, groupname)
assert username not in grp.getgrnam(groupname).gr_mem
# Do it again, this should be a noop
user.remove_user_group(username, groupname)
assert username not in grp.getgrnam(groupname).gr_mem
finally:
# Remove the group
user.remove_user(username)
user.remove_group(groupname)
with pytest.raises(KeyError):
grp.getgrnam(groupname)
with pytest.raises(KeyError):
pwd.getpwnam(username)