from flask import current_app
from itsdangerous import TimedJSONWebSignatureSerializer
from flaskbb.utils.tokens import make_token, get_token_status


def test_make_token(user):
    token = make_token(user, "test")
    s = TimedJSONWebSignatureSerializer(current_app.config['SECRET_KEY'])
    unpacked_token = s.loads(token)
    assert user.id == unpacked_token["id"]
    assert "test" == unpacked_token["op"]


def test_valid_token_status(user):
    token = make_token(user, "valid_test")
    expired, invalid, token_user = get_token_status(token, "valid_test")

    assert not expired
    assert not invalid
    assert token_user == user


def test_token_status_with_data(user):
    token = make_token(user, "test_data")
    expired, invalid, token_user, data = \
        get_token_status(token, "test_data", return_data=True)
    assert user.id == data["id"]
    assert "test_data" == data["op"]


def test_token_operation(user):
    token = make_token(user, "operation_test")
    expired, invalid, token_user = get_token_status(token, "invalid_op")
    assert invalid
    assert not expired
    assert not token_user


def test_invalid_token_status(user):
    token = "this-is-not-a-token"
    expired, invalid, token_user, data = \
        get_token_status(token, "invalid_test", return_data=True)

    assert invalid
    assert not expired
    assert not token_user
    assert data is None


def test_expired_token_status(user):
    token = make_token(user, "expired_test", -1)
    expired, invalid, token_user = get_token_status(token, "expired_test")
    assert expired
    assert not invalid
    assert not token_user