from datetime import datetime import pytest from data import model from data.model.appspecifictoken import create_token, revoke_token, access_valid_token from data.model.appspecifictoken import gc_expired_tokens, get_expiring_tokens from util.timedeltastring import convert_to_timedelta from test.fixtures import * @pytest.mark.parametrize('expiration', [ (None), ('-1m'), ('-1d'), ('-1w'), ('10m'), ('10d'), ('10w'), ]) def test_gc(expiration, initialized_db): user = model.user.get_user('devtable') expiration_date = None is_expired = False if expiration: if expiration[0] == '-': is_expired = True expiration_date = datetime.now() - convert_to_timedelta(expiration[1:]) else: expiration_date = datetime.now() + convert_to_timedelta(expiration) # Create a token. token = create_token(user, 'Some token', expiration=expiration_date) # GC tokens. gc_expired_tokens(user) # Ensure the token was GCed if expired and not if it wasn't. assert (access_valid_token(token.token_code) is None) == is_expired def test_access_token(initialized_db): user = model.user.get_user('devtable') # Create a token. token = create_token(user, 'Some token') assert token.last_accessed is None # Lookup the token. token = access_valid_token(token.token_code) assert token.last_accessed is not None # Revoke the token. revoke_token(token) # Ensure it cannot be accessed assert access_valid_token(token.token_code) is None def test_expiring_soon(initialized_db): user = model.user.get_user('devtable') # Create some tokens. create_token(user, 'Some token') exp_token = create_token(user, 'Some expiring token', datetime.now() + convert_to_timedelta('1d')) create_token(user, 'Some other token', expiration=datetime.now() + convert_to_timedelta('2d')) # Get the token expiring soon. expiring_soon = get_expiring_tokens(user, convert_to_timedelta('25h')) assert expiring_soon assert len(expiring_soon) == 1 assert expiring_soon[0].id == exp_token.id expiring_soon = get_expiring_tokens(user, convert_to_timedelta('49h')) assert expiring_soon assert len(expiring_soon) == 2