import json
import pytest

from httmock import urlmatch, HTTMock

from oauth.oidc import OIDC_WELLKNOWN
from util.config.validators import ConfigValidationException
from util.config.validators.validate_oidc import OIDCLoginValidator

@pytest.mark.parametrize('unvalidated_config', [
  ({'SOMETHING_LOGIN_CONFIG': {}}),
  ({'SOMETHING_LOGIN_CONFIG': {'OIDC_SERVER': 'foo'}}),
  ({'SOMETHING_LOGIN_CONFIG': {'OIDC_SERVER': 'foo', 'CLIENT_ID': 'foobar'}}),
  ({'SOMETHING_LOGIN_CONFIG': {'OIDC_SERVER': 'foo', 'CLIENT_SECRET': 'foobar'}}),
])
def test_validate_invalid_oidc_login_config(unvalidated_config):
  validator = OIDCLoginValidator()

  with pytest.raises(ConfigValidationException):
    validator.validate(unvalidated_config, None, None)

def test_validate_oidc_login():
  url_hit = [False]
  @urlmatch(netloc=r'someserver', path=r'/\.well-known/openid-configuration')
  def handler(_, __):
    url_hit[0] = True
    data = {
      'userinfo_endpoint': 'foobar',
    }
    return {'status_code': 200, 'content': json.dumps(data)}

  with HTTMock(handler):
    validator = OIDCLoginValidator()
    validator.validate({
      'SOMETHING_LOGIN_CONFIG': {
        'CLIENT_ID': 'foo',
        'CLIENT_SECRET': 'bar',
        'OIDC_SERVER': 'http://someserver',
        'DEBUGGING': True, # Allows for HTTP.
      },
    }, None, None)

  assert url_hit[0]