roc-fnb-server/roc_fnb/website/models/test_user.py

85 lines
2.5 KiB
Python

import json
from random import randbytes
from bson.objectid import ObjectId
from pytest import fixture
from roc_fnb.util.base64 import base64_decode
from roc_fnb.website.database import Database
from roc_fnb.website.models.user import User
@fixture
def user() -> User:
return User.create('test@t.co', 'name', 'monkey')
@fixture
def database() -> Database:
return Database.from_env()
def test_user_and_check_password(user):
assert user.name == 'name'
assert user.email == 'test@t.co'
assert user._id is None
assert user.check_password('monkey')
def test_jwt(user):
user._id = (_id := ObjectId(randbytes(12)))
token = user.jwt
header, payload, sig = (base64_decode(part.replace('.', ''))
for part in token.split('.'))
header = json.loads(header)
payload = json.loads(payload)
assert header['alg'] == 'RS256'
assert header['typ'] == 'JWT'
assert set(header.keys()) == {'alg', 'typ'}
# Note that JWT contents are visible to the user: this can be useful but
# must be done with caution
assert payload['email'] == user.email
assert payload['name'] == user.name
assert ObjectId(base64_decode(payload['_id'])) == user._id == _id
assert set(payload.keys()) == {'email', 'name', '_id', 'admin', 'moderator'}
result = user.verify_jwt(token)
assert result.email == user.email
assert result.name == user.name
assert result._id == user._id == _id
assert not result.admin
assert not result.moderator
def test_store_and_retreive(user: User, database: Database):
try:
database.store_user(user)
assert user._id is not None
retreived = database.get_user_by_email(user.email)
assert retreived is not None
assert retreived._id == user._id
assert retreived == user
finally:
if id := user._id:
database.delete_user(id)
def test_store_and_retreive_by_id(user: User, database: Database):
try:
database.store_user(user)
assert user._id is not None
retreived = database.get_user_by_id(user._id)
assert retreived == user
finally:
if id := user._id:
database.delete_user(id)
def test_store_and_retreive_by_jwt(user: User, database: Database):
try:
token = database.store_user(user).jwt
assert user._id is not None
retreived = database.get_user_from_token(token)
assert retreived == user
finally:
if id := user._id:
database.delete_user(id)