from auth.credentials import (ACCESS_TOKEN_USERNAME, OAUTH_TOKEN_USERNAME, validate_credentials,
                              CredentialKind, APP_SPECIFIC_TOKEN_USERNAME)
from auth.validateresult import AuthKind, ValidateResult
from data import model

from test.fixtures import *

def test_valid_user(app):
  result, kind = validate_credentials('devtable', 'password')
  assert kind == CredentialKind.user
  assert result == ValidateResult(AuthKind.credentials, user=model.user.get_user('devtable'))

def test_valid_robot(app):
  robot, password = model.user.create_robot('somerobot', model.user.get_user('devtable'))
  result, kind = validate_credentials(robot.username, password)
  assert kind == CredentialKind.robot
  assert result == ValidateResult(AuthKind.credentials, robot=robot)

def test_valid_robot_for_disabled_user(app):
  user = model.user.get_user('devtable')
  user.enabled = False
  user.save()

  robot, password = model.user.create_robot('somerobot', user)
  result, kind = validate_credentials(robot.username, password)
  assert kind == CredentialKind.robot

  err = 'This user has been disabled. Please contact your administrator.'
  assert result == ValidateResult(AuthKind.credentials, error_message=err)

def test_valid_token(app):
  access_token = model.token.create_delegate_token('devtable', 'simple', 'sometoken')
  result, kind = validate_credentials(ACCESS_TOKEN_USERNAME, access_token.code)
  assert kind == CredentialKind.token
  assert result == ValidateResult(AuthKind.credentials, token=access_token)

def test_valid_oauth(app):
  user = model.user.get_user('devtable')
  oauth_token = list(model.oauth.list_access_tokens_for_user(user))[0]
  result, kind = validate_credentials(OAUTH_TOKEN_USERNAME, oauth_token.access_token)
  assert kind == CredentialKind.oauth_token
  assert result == ValidateResult(AuthKind.oauth, oauthtoken=oauth_token)

def test_invalid_user(app):
  result, kind = validate_credentials('devtable', 'somepassword')
  assert kind == CredentialKind.user
  assert result == ValidateResult(AuthKind.credentials,
                                  error_message='Invalid Username or Password')

def test_valid_app_specific_token(app):
  user = model.user.get_user('devtable')
  app_specific_token = model.appspecifictoken.create_token(user, 'some token')

  result, kind = validate_credentials(APP_SPECIFIC_TOKEN_USERNAME, app_specific_token.token_code)
  assert kind == CredentialKind.app_specific_token
  assert result == ValidateResult(AuthKind.credentials, appspecifictoken=app_specific_token)

def test_valid_app_specific_token_for_disabled_user(app):
  user = model.user.get_user('devtable')
  user.enabled = False
  user.save()

  app_specific_token = model.appspecifictoken.create_token(user, 'some token')

  result, kind = validate_credentials(APP_SPECIFIC_TOKEN_USERNAME, app_specific_token.token_code)
  assert kind == CredentialKind.app_specific_token

  err = 'This user has been disabled. Please contact your administrator.'
  assert result == ValidateResult(AuthKind.credentials, error_message=err)

def test_invalid_app_specific_token(app):  
  result, kind = validate_credentials(APP_SPECIFIC_TOKEN_USERNAME, 'somecode')
  assert kind == CredentialKind.app_specific_token
  assert result == ValidateResult(AuthKind.credentials, error_message='Invalid token')