2023-03-10 11:05:22 -05:00
|
|
|
import pytest
|
2023-03-10 18:17:03 -05:00
|
|
|
import yaml
|
2023-03-10 13:57:18 -05:00
|
|
|
from sachet.server.users import manage
|
2023-03-10 11:05:22 -05:00
|
|
|
from click.testing import CliRunner
|
|
|
|
from sachet.server import app, db
|
2023-03-27 21:54:20 -04:00
|
|
|
from sachet.server.models import Permissions, UserSchema
|
|
|
|
from bitmask import Bitmask
|
|
|
|
|
|
|
|
user_schema = UserSchema()
|
2023-03-10 11:05:22 -05:00
|
|
|
|
|
|
|
@pytest.fixture
|
2023-03-10 13:57:18 -05:00
|
|
|
def client():
|
2023-03-10 11:05:22 -05:00
|
|
|
"""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()
|
2023-03-10 13:57:18 -05:00
|
|
|
yield client
|
2023-03-10 11:05:22 -05:00
|
|
|
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()
|
|
|
|
|
|
|
|
|
2023-03-10 13:57:18 -05:00
|
|
|
@pytest.fixture
|
|
|
|
def users(client):
|
|
|
|
"""Creates all the test users.
|
|
|
|
|
|
|
|
Returns a dictionary with all the info for each user.
|
|
|
|
"""
|
2023-03-27 21:54:20 -04:00
|
|
|
userinfo = dict(
|
|
|
|
jeff = dict(
|
|
|
|
password = "1234",
|
|
|
|
permissions = Bitmask()
|
|
|
|
),
|
|
|
|
administrator = dict(
|
|
|
|
password = "4321",
|
|
|
|
permissions = Bitmask(Permissions.ADMIN)
|
|
|
|
),
|
|
|
|
)
|
2023-03-10 13:57:18 -05:00
|
|
|
|
|
|
|
for user, info in userinfo.items():
|
|
|
|
info["username"] = user
|
|
|
|
manage.create_user(
|
2023-03-27 21:54:20 -04:00
|
|
|
info["permissions"],
|
2023-03-10 13:57:18 -05:00
|
|
|
info["username"],
|
|
|
|
info["password"]
|
|
|
|
)
|
|
|
|
|
|
|
|
return userinfo
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def validate_info(users):
|
2023-03-27 21:54:20 -04:00
|
|
|
"""Given a response, deserialize and validate the information against a given user's info."""
|
2023-03-25 17:16:33 -04:00
|
|
|
|
|
|
|
verify_fields = [
|
|
|
|
"username",
|
2023-03-27 21:54:20 -04:00
|
|
|
"permissions",
|
2023-03-25 17:16:33 -04:00
|
|
|
]
|
|
|
|
|
2023-03-10 13:57:18 -05:00
|
|
|
def _validate(user, info):
|
2023-03-27 21:54:20 -04:00
|
|
|
info = user_schema.load(info)
|
|
|
|
|
2023-03-25 17:16:33 -04:00
|
|
|
for k in verify_fields:
|
|
|
|
assert users[user][k] == info[k]
|
2023-03-10 13:57:18 -05:00
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
2023-03-10 11:05:22 -05:00
|
|
|
@pytest.fixture
|
|
|
|
def cli():
|
|
|
|
"""click's testing fixture"""
|
|
|
|
return CliRunner()
|