mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-10 19:43:01 +00:00
update tests with new user models
add normalize_user and fill_user utilities
This commit is contained in:
@@ -1,24 +1,21 @@
|
|||||||
"""Tests for the REST API."""
|
"""Tests for the REST API."""
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
from concurrent.futures import Future
|
from concurrent.futures import Future
|
||||||
import json
|
import json
|
||||||
import time
|
import re
|
||||||
import sys
|
import sys
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
from urllib.parse import urlparse, quote
|
from urllib.parse import urlparse, quote
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import pytest
|
|
||||||
from pytest import mark
|
from pytest import mark
|
||||||
import requests
|
|
||||||
|
|
||||||
from tornado import gen
|
from tornado import gen
|
||||||
|
|
||||||
import jupyterhub
|
import jupyterhub
|
||||||
from .. import orm
|
from .. import orm
|
||||||
from ..user import User
|
|
||||||
from ..utils import url_path_join as ujoin
|
from ..utils import url_path_join as ujoin
|
||||||
from . import mocking
|
|
||||||
from .mocking import public_host, public_url
|
from .mocking import public_host, public_url
|
||||||
from .utils import async_requests
|
from .utils import async_requests
|
||||||
|
|
||||||
@@ -187,6 +184,48 @@ def test_referer_check(app):
|
|||||||
# User API tests
|
# User API tests
|
||||||
# --------------
|
# --------------
|
||||||
|
|
||||||
|
def normalize_timestamp(ts):
|
||||||
|
"""Normalize a timestamp
|
||||||
|
|
||||||
|
For easier comparison
|
||||||
|
"""
|
||||||
|
if ts is None:
|
||||||
|
return
|
||||||
|
return re.sub('\d(\.\d+)?', '0', ts)
|
||||||
|
|
||||||
|
def normalize_user(user):
|
||||||
|
"""Normalize a user model for comparison
|
||||||
|
|
||||||
|
smooths out user model with things like timestamps
|
||||||
|
for easier comparison
|
||||||
|
"""
|
||||||
|
for key in ('created', 'last_activity', 'started'):
|
||||||
|
user[key] = normalize_timestamp(user[key])
|
||||||
|
if 'servers' in user:
|
||||||
|
for server in user['servers'].values():
|
||||||
|
for key in ('started', 'last_activity'):
|
||||||
|
server[key] = normalize_timestamp(server[key])
|
||||||
|
return user
|
||||||
|
|
||||||
|
def fill_user(model):
|
||||||
|
"""Fill a default user model
|
||||||
|
|
||||||
|
Any unspecified fields will be filled with the defaults
|
||||||
|
"""
|
||||||
|
model.setdefault('server', None)
|
||||||
|
model.setdefault('kind', 'user')
|
||||||
|
model.setdefault('groups', [])
|
||||||
|
model.setdefault('admin', False)
|
||||||
|
model.setdefault('server', None)
|
||||||
|
model.setdefault('pending', None)
|
||||||
|
model.setdefault('created', TIMESTAMP)
|
||||||
|
model.setdefault('last_activity', TIMESTAMP)
|
||||||
|
model.setdefault('started', None)
|
||||||
|
return model
|
||||||
|
|
||||||
|
|
||||||
|
TIMESTAMP = normalize_timestamp(datetime.now().isoformat() + 'Z')
|
||||||
|
|
||||||
@mark.user
|
@mark.user
|
||||||
@mark.gen_test
|
@mark.gen_test
|
||||||
def test_get_users(app):
|
def test_get_users(app):
|
||||||
@@ -195,25 +234,17 @@ def test_get_users(app):
|
|||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
|
|
||||||
users = sorted(r.json(), key=lambda d: d['name'])
|
users = sorted(r.json(), key=lambda d: d['name'])
|
||||||
for u in users:
|
users = [ normalize_user(u) for u in users ]
|
||||||
u.pop('last_activity')
|
|
||||||
assert users == [
|
assert users == [
|
||||||
{
|
fill_user({
|
||||||
'kind': 'user',
|
|
||||||
'name': 'admin',
|
'name': 'admin',
|
||||||
'groups': [],
|
|
||||||
'admin': True,
|
'admin': True,
|
||||||
'server': None,
|
}),
|
||||||
'pending': None,
|
fill_user({
|
||||||
},
|
|
||||||
{
|
|
||||||
'kind': 'user',
|
|
||||||
'name': 'user',
|
'name': 'user',
|
||||||
'groups': [],
|
|
||||||
'admin': False,
|
'admin': False,
|
||||||
'server': None,
|
'last_activity': None,
|
||||||
'pending': None,
|
}),
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
r = yield api_request(app, 'users',
|
r = yield api_request(app, 'users',
|
||||||
@@ -275,18 +306,9 @@ def test_get_user(app):
|
|||||||
name = 'user'
|
name = 'user'
|
||||||
r = yield api_request(app, 'users', name)
|
r = yield api_request(app, 'users', name)
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
user = r.json()
|
|
||||||
user.pop('last_activity')
|
user = normalize_user(r.json())
|
||||||
assert user == {
|
assert user == fill_user({'name': name, 'auth_state': None})
|
||||||
'kind': 'user',
|
|
||||||
'name': name,
|
|
||||||
'groups': [],
|
|
||||||
'admin': False,
|
|
||||||
'server': None,
|
|
||||||
'pending': None,
|
|
||||||
# auth state is present because requestor is an admin
|
|
||||||
'auth_state': None
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@mark.user
|
@mark.user
|
||||||
|
@@ -5,7 +5,7 @@ import pytest
|
|||||||
|
|
||||||
from ..utils import url_path_join
|
from ..utils import url_path_join
|
||||||
|
|
||||||
from .test_api import api_request, add_user
|
from .test_api import api_request, add_user, fill_user, normalize_user, TIMESTAMP
|
||||||
from .mocking import public_url
|
from .mocking import public_url
|
||||||
from .utils import async_requests
|
from .utils import async_requests
|
||||||
|
|
||||||
@@ -28,23 +28,23 @@ def test_default_server(app, named_servers):
|
|||||||
r = yield api_request(app, 'users', username)
|
r = yield api_request(app, 'users', username)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
user_model = r.json()
|
user_model = normalize_user(r.json())
|
||||||
user_model.pop('last_activity')
|
print(user_model)
|
||||||
assert user_model == {
|
assert user_model == fill_user({
|
||||||
'name': username,
|
'name': username,
|
||||||
'groups': [],
|
|
||||||
'kind': 'user',
|
|
||||||
'admin': False,
|
|
||||||
'pending': None,
|
|
||||||
'auth_state': None,
|
'auth_state': None,
|
||||||
'server': user.url,
|
'server': user.url,
|
||||||
|
'started': TIMESTAMP,
|
||||||
'servers': {
|
'servers': {
|
||||||
'': {
|
'': {
|
||||||
'name': '',
|
'name': '',
|
||||||
|
'started': TIMESTAMP,
|
||||||
|
'last_activity': TIMESTAMP,
|
||||||
'url': user.url,
|
'url': user.url,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
})
|
||||||
|
|
||||||
|
|
||||||
# now stop the server
|
# now stop the server
|
||||||
r = yield api_request(app, 'users', username, 'server', method='delete')
|
r = yield api_request(app, 'users', username, 'server', method='delete')
|
||||||
@@ -54,19 +54,12 @@ def test_default_server(app, named_servers):
|
|||||||
r = yield api_request(app, 'users', username)
|
r = yield api_request(app, 'users', username)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
user_model = r.json()
|
user_model = normalize_user(r.json())
|
||||||
user_model.pop('last_activity')
|
assert user_model == fill_user({
|
||||||
assert user_model == {
|
|
||||||
'name': username,
|
'name': username,
|
||||||
'groups': [],
|
|
||||||
'kind': 'user',
|
|
||||||
'admin': False,
|
|
||||||
'pending': None,
|
|
||||||
'server': None,
|
|
||||||
'servers': {},
|
'servers': {},
|
||||||
'auth_state': None,
|
'auth_state': None,
|
||||||
}
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gen_test
|
@pytest.mark.gen_test
|
||||||
@@ -93,24 +86,20 @@ def test_create_named_server(app, named_servers):
|
|||||||
r = yield api_request(app, 'users', username)
|
r = yield api_request(app, 'users', username)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
user_model = r.json()
|
user_model = normalize_user(r.json())
|
||||||
user_model.pop('last_activity')
|
assert user_model == fill_user({
|
||||||
assert user_model == {
|
|
||||||
'name': username,
|
'name': username,
|
||||||
'groups': [],
|
|
||||||
'kind': 'user',
|
|
||||||
'admin': False,
|
|
||||||
'pending': None,
|
|
||||||
'auth_state': None,
|
'auth_state': None,
|
||||||
'server': None,
|
|
||||||
'servers': {
|
'servers': {
|
||||||
servername: {
|
servername: {
|
||||||
'name': name,
|
'name': name,
|
||||||
|
'started': TIMESTAMP,
|
||||||
|
'last_activity': TIMESTAMP,
|
||||||
'url': url_path_join(user.url, name, '/'),
|
'url': url_path_join(user.url, name, '/'),
|
||||||
}
|
}
|
||||||
for name in [servername]
|
for name in [servername]
|
||||||
},
|
},
|
||||||
}
|
})
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gen_test
|
@pytest.mark.gen_test
|
||||||
@@ -131,16 +120,10 @@ def test_delete_named_server(app, named_servers):
|
|||||||
r = yield api_request(app, 'users', username)
|
r = yield api_request(app, 'users', username)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
user_model = r.json()
|
user_model = normalize_user(r.json())
|
||||||
user_model.pop('last_activity')
|
assert user_model == fill_user({
|
||||||
assert user_model == {
|
|
||||||
'name': username,
|
'name': username,
|
||||||
'groups': [],
|
|
||||||
'kind': 'user',
|
|
||||||
'admin': False,
|
|
||||||
'pending': None,
|
|
||||||
'auth_state': None,
|
'auth_state': None,
|
||||||
'server': None,
|
|
||||||
'servers': {
|
'servers': {
|
||||||
name: {
|
name: {
|
||||||
'name': name,
|
'name': name,
|
||||||
@@ -148,7 +131,7 @@ def test_delete_named_server(app, named_servers):
|
|||||||
}
|
}
|
||||||
for name in []
|
for name in []
|
||||||
},
|
},
|
||||||
}
|
})
|
||||||
|
|
||||||
@pytest.mark.gen_test
|
@pytest.mark.gen_test
|
||||||
def test_named_server_disabled(app):
|
def test_named_server_disabled(app):
|
||||||
|
Reference in New Issue
Block a user