flesh out REST API

can now list/view/add/create/modify users
and start/stop single-user servers
This commit is contained in:
MinRK
2014-09-14 14:33:11 -07:00
parent a47e390aa0
commit 0a8759b0a5
10 changed files with 322 additions and 33 deletions

View File

@@ -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