mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-17 15:03:02 +00:00
flesh out REST API
can now list/view/add/create/modify users and start/stop single-user servers
This commit is contained in:
@@ -1,10 +1,15 @@
|
||||
"""Tests for the REST API"""
|
||||
|
||||
import json
|
||||
|
||||
import requests
|
||||
|
||||
from ..utils import url_path_join as ujoin
|
||||
from .. import orm
|
||||
|
||||
def find_user(db, name):
|
||||
return db.query(orm.User).filter(orm.User.name==name).first()
|
||||
|
||||
def add_user(db, **kwargs):
|
||||
user = orm.User(**kwargs)
|
||||
db.add(user)
|
||||
@@ -12,7 +17,7 @@ def add_user(db, **kwargs):
|
||||
return user
|
||||
|
||||
def auth_header(db, name):
|
||||
user = db.query(orm.User).filter(orm.User.name==name).first()
|
||||
user = find_user(db, name)
|
||||
if user is None:
|
||||
user = add_user(db, name=name)
|
||||
if not user.api_tokens:
|
||||
@@ -72,10 +77,12 @@ def test_get_users(app):
|
||||
assert sorted(r.json(), key=lambda d: d['name']) == [
|
||||
{
|
||||
'name': 'admin',
|
||||
'admin': True,
|
||||
'server': None,
|
||||
},
|
||||
{
|
||||
'name': 'user',
|
||||
'admin': False,
|
||||
'server': None,
|
||||
}
|
||||
]
|
||||
@@ -84,3 +91,79 @@ def test_get_users(app):
|
||||
headers=auth_header(db, 'user'),
|
||||
)
|
||||
assert r.status_code == 403
|
||||
|
||||
def test_add_user(app):
|
||||
db = app.db
|
||||
name = 'newuser'
|
||||
r = api_request(app, 'users', name, method='post')
|
||||
assert r.status_code == 201
|
||||
user = find_user(db, name)
|
||||
assert user is not None
|
||||
assert user.name == name
|
||||
assert not user.admin
|
||||
|
||||
def test_add_admin(app):
|
||||
db = app.db
|
||||
name = 'newadmin'
|
||||
r = api_request(app, 'users', name, method='post',
|
||||
data=json.dumps({'admin': True}),
|
||||
)
|
||||
assert r.status_code == 201
|
||||
user = find_user(db, name)
|
||||
assert user is not None
|
||||
assert user.name == name
|
||||
assert user.admin
|
||||
|
||||
def test_delete_user(app):
|
||||
db = app.db
|
||||
mal = add_user(db, name='mal')
|
||||
r = api_request(app, 'users', 'mal', method='delete')
|
||||
assert r.status_code == 204
|
||||
|
||||
|
||||
def test_make_admin(app):
|
||||
db = app.db
|
||||
name = 'admin2'
|
||||
r = api_request(app, 'users', name, method='post')
|
||||
assert r.status_code == 201
|
||||
user = find_user(db, name)
|
||||
assert user is not None
|
||||
assert user.name == name
|
||||
assert not user.admin
|
||||
|
||||
r = api_request(app, 'users', name, method='patch',
|
||||
data=json.dumps({'admin': True})
|
||||
)
|
||||
assert r.status_code == 200
|
||||
user = find_user(db, name)
|
||||
assert user is not None
|
||||
assert user.name == name
|
||||
assert user.admin
|
||||
|
||||
|
||||
def test_spawn(app, io_loop):
|
||||
db = app.db
|
||||
name = 'wash'
|
||||
user = add_user(db, name=name)
|
||||
r = api_request(app, 'users', name, 'server', method='post')
|
||||
assert r.status_code == 201
|
||||
assert user.spawner is not None
|
||||
status = io_loop.run_sync(user.spawner.poll)
|
||||
assert status is None
|
||||
|
||||
assert user.server.base_url == '/user/%s' % name
|
||||
r = requests.get(ujoin(app.proxy.public_server.url, user.server.base_url))
|
||||
assert r.status_code == 200
|
||||
assert r.text == user.server.base_url
|
||||
|
||||
r = requests.get(ujoin(app.proxy.public_server.url, user.server.base_url, 'args'))
|
||||
assert r.status_code == 200
|
||||
argv = r.json()
|
||||
for expected in ['--user=%s' % name, '--base-url=%s' % user.server.base_url]:
|
||||
assert expected in argv
|
||||
|
||||
r = api_request(app, 'users', name, 'server', method='delete')
|
||||
assert r.status_code == 204
|
||||
|
||||
assert user.spawner is None
|
||||
|
Reference in New Issue
Block a user