#!/usr/bin/env python3
import argparse
import os
import sys

os.environ["RUNNING_OPENAPI_CURL_TEST"] = "1"

# check for the venv
from lib import sanity_check
sanity_check.check_venv(__file__)

ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ZULIP_PATH)
os.chdir(ZULIP_PATH)

from zulip import Client

from tools.lib.test_script import assert_provisioning_status_ok
from tools.lib.test_server import test_server_running

usage = """test-api [options]"""
parser = argparse.ArgumentParser(usage)
parser.add_argument('--force', dest='force',
                    action="store_true",
                    default=False, help='Run tests despite possible provisioning problems.')
options = parser.parse_args()

assert_provisioning_status_ok(options.force)

with test_server_running(force=options.force, external_host='zulipdev.com:9981'):
    # Zerver imports should happen after `django.setup()` is run
    # by the test_server_running decorator.
    from zerver.openapi.python_examples import test_the_api, test_invalid_api_key
    from zerver.openapi.test_curl_examples import test_generated_curl_examples_for_success
    from zerver.lib.actions import do_create_user
    from zerver.lib.test_helpers import reset_emails_in_zulip_realm
    from zerver.lib.users import get_api_key
    from zerver.models import get_user, get_realm

    print("Running API tests...")

    reset_emails_in_zulip_realm()

    # Prepare the admin client
    email = 'iago@zulip.com'  # Iago is an admin
    realm = get_realm('zulip')
    user = get_user(email, realm)
    api_key = get_api_key(user)
    site = 'http://zulip.zulipdev.com:9981'
    client = Client(
        email=email,
        api_key=api_key,
        site=site
    )

    # Prepare a generic bot client for curl testing
    email = 'default-bot@zulip.com'
    realm = get_realm("zulip")
    bot_user = get_user(email, realm)
    api_key = get_api_key(bot_user)
    bot_client = Client(
        email=email,
        api_key=api_key,
        site=site
    )

    # Prepare the non-admin client
    email = 'guest@zulip.com'  # guest is not an admin
    guest_user = do_create_user('guest@zulip.com', 'secret',
                                get_realm('zulip'), 'Mr. Guest', 'guest')
    api_key = get_api_key(guest_user)
    nonadmin_client = Client(
        email=email,
        api_key=api_key,
        site=site
    )

    test_the_api(client, nonadmin_client)
    test_generated_curl_examples_for_success(client)

    # Test error payloads
    client = Client(
        email=email,
        api_key='X'*32,
        site=site
    )
    test_invalid_api_key(client)


print("API tests passed!")
