# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

from __future__ import absolute_import

from flask.ext.login import current_user
from nose.tools import eq_

from relengapi.lib.testing.context import TestContext

test_context_environ = TestContext(
    config={'RELENGAPI_AUTHENTICATION': {'type': 'external', 'environ': 'TEST'}})

test_context_header = TestContext(
    config={'RELENGAPI_AUTHENTICATION': {'type': 'external', 'header': 'USERNAME'}})


@test_context_environ
def test_external_login_logout(app, client):
    @app.route('/username')
    def username():
        return str(current_user)

    rv = client.get("/username")
    eq_((rv.status_code, rv.data), (200, "anonymous:"))
    rv = client.get(
        "/userauth/login?next=%2Fusername", environ_overrides={'TEST': 'jimmy'})
    eq_((rv.status_code, rv.headers['Location']), (
        302, "http://localhost/username"))
    rv = client.get("/username")
    eq_((rv.status_code, rv.data), (200, "human:jimmy"))
    rv = client.get("/userauth/logout")
    eq_((rv.status_code, rv.headers['Location']), (302, "http://localhost/"))
    rv = client.get("/username")
    eq_((rv.status_code, rv.data), (200, "anonymous:"))


@test_context_header
def test_external_login_header(app, client):
    @app.route('/username')
    def username():
        return str(current_user)

    rv = client.get(
        "/userauth/login", headers={'USERNAME': 'jimmy'})
    rv = client.get("/username")
    eq_((rv.status_code, rv.data), (200, "human:jimmy"))


@test_context_environ
def test_external_login_no_data(app, client):
    @app.route('/username')
    def username():
        return str(current_user)

    rv = client.get("/userauth/login")  # no auth data
    eq_(rv.status_code, 500)


@test_context_header
def test_external_login_ajax(app, client):
    rv = client.get(
        "/userauth/login?ajax=1", headers={'USERNAME': 'jimmy'})
    eq_((rv.status_code, rv.data), (200, 'ok'))