sachet-server/tests/conftest.py

105 lines
2.4 KiB
Python

import pytest
import yaml
from sachet.server.users import manage
from click.testing import CliRunner
from sachet.server import app, db
from sachet.server.models import Permissions, UserSchema
from bitmask import Bitmask
user_schema = UserSchema()
@pytest.fixture
def client():
"""Flask application with DB already set up and ready."""
with app.test_client() as client:
with app.app_context():
db.drop_all()
db.create_all()
db.session.commit()
yield client
db.session.remove()
db.drop_all()
@pytest.fixture
def flask_app_bare():
"""Flask application with empty DB."""
with app.test_client() as client:
with app.app_context():
yield client
db.drop_all()
@pytest.fixture
def users(client):
"""Creates all the test users.
Returns a dictionary with all the info for each user.
"""
userinfo = dict(
jeff = dict(
password = "1234",
permissions = Bitmask()
),
administrator = dict(
password = "4321",
permissions = Bitmask(Permissions.ADMIN)
),
)
for user, info in userinfo.items():
info["username"] = user
manage.create_user(
info["permissions"],
info["username"],
info["password"]
)
return userinfo
@pytest.fixture
def validate_info(users):
"""Given a response, deserialize and validate the information against a given user's info."""
verify_fields = [
"username",
"permissions",
]
def _validate(user, info):
info = user_schema.load(info)
for k in verify_fields:
assert users[user][k] == info[k]
return _validate
@pytest.fixture
def tokens(client, users):
"""Logs in all test users.
Returns a dictionary of auth tokens for all test users.
"""
toks = {}
for user, creds in users.items():
resp = client.post("/users/login", json={
"username": creds["username"],
"password": creds["password"]
})
resp_json = resp.get_json()
token = resp_json.get("auth_token")
assert token is not None and token != ""
toks[creds["username"]] = token
return toks
@pytest.fixture
def cli():
"""click's testing fixture"""
return CliRunner()