import pytest

from auth.signedgrant import validate_signed_grant, generate_signed_token, SIGNATURE_PREFIX
from auth.validateresult import AuthKind, ValidateResult


@pytest.mark.parametrize('header, expected_result', [
  pytest.param('', ValidateResult(AuthKind.signed_grant, missing=True), id='Missing'),
  pytest.param('somerandomtoken', ValidateResult(AuthKind.signed_grant, missing=True),
               id='Invalid header'),
  pytest.param('token somerandomtoken', ValidateResult(AuthKind.signed_grant, missing=True),
               id='Random Token'),
  pytest.param('token ' + SIGNATURE_PREFIX + 'foo',
               ValidateResult(AuthKind.signed_grant,
                              error_message='Signed grant could not be validated'),
               id='Invalid token'),
])
def test_token(header, expected_result):
  assert validate_signed_grant(header) == expected_result


def test_valid_grant():
  header = 'token ' + generate_signed_token({'a': 'b'}, {'c': 'd'})
  expected = ValidateResult(AuthKind.signed_grant, signed_data={
    'grants': {
      'a': 'b',
    },
    'user_context': {
      'c': 'd'
    },
  })
  assert validate_signed_grant(header) == expected