def test_add_three_ips(xorp_and_tredy_hosts):
    """
    Тест проверяет метод add_ip. Кейс3.
    Создаем пользователя. Создаем ему профиль.
    Пытаемся добавить три ip-адреса с комментариями.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    ip_list = [generate_public_ip() for _ in range(3)]
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    full_ip_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': ip_list,
        'profile': profile_id,
        'comment': ['ip_1_comment', 'ip_2_comment', 'ip_3_comment'],
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', full_ip_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert data['added_addresses'] == ip_list
def test_clear_vpn_for_profile(xorp_and_tredy_hosts):
    """
    Тест проверяет метод clear_vpn_for_profile.
    Создаем пользователя. Создаем пользователю профиль.
    Добавляем VPN на созданный профиль. Проверяем, что VPN добавился.
    Удаляем VPN c созданного профиля. Проверяем, что VPN удалился.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    add_vpn_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'name': 'vpn_name',
        'profile_id': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_vpn', add_vpn_params)
    make_verification(response)
    data = response.json()['data']
    expected_keys = [
        'BEGIN CERTIFICATE',
        'END CERTIFICATE',
        'BEGIN PRIVATE KEY',
        'END PRIVATE KEY',
    ]

    assert all(key in data['ovpn'] for key in expected_keys)

    check_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
    }
    response = make_request(xorp_and_tredy_hosts, 'get_vpn_list', check_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert data[0]['profile'] == 'my_profile_test'
    assert data[0]['name'] == 'vpn_name'

    clear_params = {
        'key': API_PUBLIC_KEY,
        'profile_id': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'clear_vpn_for_profile',
                            clear_params)
    make_verification(response)
    response = make_request(xorp_and_tredy_hosts, 'get_vpn_list', check_params)
    make_verification(response)

    assert response.json(
    )['data'] == [], 'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
        response.json())
def test_update_profile(xorp_and_tredy_hosts, expected_plan):
    """
    Тест проверяет метод update_profile.
    Создаем пользователя, делаем для него новый профиль.
    Методом update_profile меняем параметры профиля.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    update_params = {
        'key': API_PUBLIC_KEY,
        'profile_id': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'update_profile',
                            update_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert not data['tls']
    assert data['name'] == 'my_profile_test'

    full_update_params = {
        'key': API_PUBLIC_KEY,
        'profile_id': profile_id,
        'name': 'modified_profile',
        'tls': 'True',
    }
    prolongate_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'plan': expected_plan,
    }
    response = make_request(xorp_and_tredy_hosts, 'prolongate',
                            prolongate_params)
    make_verification(response)
    response = make_request(xorp_and_tredy_hosts, 'update_profile',
                            full_update_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert data['tls']
    assert data['name'] == 'modified_profile'
    assert data['id'] == int(profile_id)
def test_update_nat(xorp_and_tredy_hosts, nat_ip):
    """
    Тест проверяет метод update_nat.
    Создаем пользователя. Добавляем ему профиль.
    Привязываем созданный профиль к DNS адресу.
    """
    login, password = generate_login_password()
    # Используем для теста первый адрес из списка
    create_user(xorp_and_tredy_hosts, login, password)
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    update_params = {
        'key': API_PUBLIC_KEY,
        'profile_id': profile_id,
        'address': nat_ip,
    }
    response = make_request(xorp_and_tredy_hosts, 'update_nat', update_params)
    make_verification(response)
def test_list_ip_optional(xorp_and_tredy_hosts):
    """
    Тест проверяет метод list_ip с обязательным и дополнительным параметрами.
    Создается пользователь. Добавляем ему ip-адреса на дефолтный профиль.
    Создаем пользователю второй профиль. Добавляем на него ip-адреса.
    Определяем айдишник дефолтного профиля.
    Получаем список ip-адрессов с обоих профилей.
    Валидируем результат запроса.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    ip_for_profile = generate_public_ip()
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    ip_params_my_profile = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': ip_for_profile,
        'profile': profile_id,
        'comment': 'comment_list_ip_my_profile',
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip',
                            ip_params_my_profile)
    make_verification(response)
    list_params_full = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'profile': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'list_ip', list_params_full)
    make_verification(response)

    try:
        data = response.json()['data']
        profile = data['ip'][0]
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert profile['profile'] == int(profile_id)
    assert profile['comment'] == 'comment_list_ip_my_profile'
    assert profile['address'] == ip_for_profile
def test_update_ip(xorp_and_tredy_hosts):
    """
    Тест проверяет метод update_ip по добавлению DDNS.
    Кейс1. Создается пользователь. Добавляем ему DDNS.
    Кейс2. Содаем еще одного пользователя. Добавляем ему DDNS пользователя из Кейс1.
    Кейс3. Добавляем пользователю из Кейс2 второй DDNS на дефолтный профиль.
    Кейс4. Создаем пользователю из Кейс2 новый профиль. Добавляем DDNS на новый профиль.
    """
    # Кейс1.
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    public_ip = generate_public_ip()
    update_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': public_ip,
    }
    # Пока нет api-метода для получения списка динамических адресов, валидировать можем только по состоянию ответа
    response = make_request(xorp_and_tredy_hosts, 'update_ip', update_params)

    assert response.status_code == 200, 'Кейс1. Статус-код ответа != 200'
    assert response.json(
    )['status'] == 'ok', 'Кейс1. ' + response.json()['data'].get('message')

    # Кейс2.
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    update_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': public_ip,
    }
    response = make_request(xorp_and_tredy_hosts, 'update_ip', update_params)

    assert response.status_code == 200, 'Кейс2. Статус-код ответа != 200'
    assert response.json(
    )['status'] == 'ok', 'Кейс2. ' + response.json()['data'].get('message')

    # Кейс 3. Последовательно добавляем два разных айпишника, привязывая их к разным хостам на дефолтном профиле
    update_params_first_hostname = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': generate_public_ip(),
        'hostname': 'first_hostname',
    }
    update_params_second_hostname = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': generate_public_ip(),
        'hostname': 'second_hostname',
    }
    response = make_request(xorp_and_tredy_hosts, 'update_ip',
                            update_params_first_hostname)

    assert response.status_code == 200, 'Кейс3.first_hostname. Статус-код ответа != 200'
    assert response.json(
    )['status'] == 'ok', 'Кейс3.first_hostname. ' + response.json(
    )['data'].get('message')

    response = make_request(xorp_and_tredy_hosts, 'update_ip',
                            update_params_second_hostname)

    assert response.status_code == 200, 'Кейс3.second_hostname. Статус-код ответа != 200'
    assert response.json(
    )['status'] == 'ok', 'Кейс3.second_hostname. ' + response.json(
    )['data'].get('message')

    # Кейс4.
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    update_params_profile = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': generate_public_ip(),
        'profile': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'update_ip',
                            update_params_profile)

    assert response.status_code == 200, 'Кейс4. Статус-код ответа != 200'
    assert response.json(
    )['status'] == 'ok', 'Кейс4. ' + response.json()['data'].get('message')
def test_list_ip_compulsory(xorp_and_tredy_hosts):
    """
    Тест проверяет метод list_ip с одним обязательным параметром.
    Создается пользователь. Добавляем ему ip-адреса на дефолтный профиль.
    Создаем пользователю второй профиль. Добавляем на него ip-адреса.
    Определяем айдишник дефолтного профиля.
    Получаем список ip-адрессов с обоих профилей.
    Валидируем результат запроса.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    default_ip = generate_public_ip()
    ip_for_profile = generate_public_ip()
    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    profiles_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
    }
    response = make_request(xorp_and_tredy_hosts, 'profiles', profiles_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    default_id = eval(
        [key for key, value in data.items() if value == 'Default'][0])

    # Накатываем айпишники на каждый профиль отдельно, т.к. совместно запрос не проходит
    ip_params_default = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': default_ip,
        'comment': 'comment_list_default_ip',
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', ip_params_default)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert data['added_addresses'][
        0] == default_ip, 'Адрес не добавлен {}'.format(response.json())

    make_verification(response)
    ip_params_my_profile = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': ip_for_profile,
        'profile': profile_id,
        'comment': 'comment_list_ip_my_profile',
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip',
                            ip_params_my_profile)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert data['added_addresses'][
        0] == ip_for_profile, 'Адрес не добавлен {}'.format(response.json())

    make_verification(response)
    list_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
    }
    response = make_request(xorp_and_tredy_hosts, 'list_ip', list_params)
    make_verification(response)

    try:
        data = response.json()['data']
        default = data['ip'][0]
        profile = data['ip'][1]
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert default['profile'] == int(default_id)
    assert default['comment'] == 'comment_list_default_ip'
    assert default['address'] == default_ip

    assert profile['profile'] == int(profile_id)
    assert profile['comment'] == 'comment_list_ip_my_profile'
    assert profile['address'] == ip_for_profile
def test_clear_vpn_for_user(xorp_and_tredy_hosts):
    """
    Тест проверяет метод clear_vpn_for_profile.
    Создаем пользователя. Привязываем VPN к дефолтному профилю.
    Создаем пользователю профиль. Привязываем VPN к созданному профилю.
    Удаляем все VPN. Проверяем, что все VPN удалены.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    profiles_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
    }
    response = make_request(xorp_and_tredy_hosts, 'profiles', profiles_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    profile_id = [k for k, v in data.items() if v == 'Default'][0]

    add_vpn_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'name': 'vpn_name_default',
        'profile_id': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_vpn', add_vpn_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    expected_keys = [
        'BEGIN CERTIFICATE',
        'END CERTIFICATE',
        'BEGIN PRIVATE KEY',
        'END PRIVATE KEY',
    ]

    assert all(key in data['ovpn'] for key in expected_keys)

    profile_id = create_profile(xorp_and_tredy_hosts, login, password)
    add_vpn_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'name': 'vpn_name_my_profile',
        'profile_id': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_vpn', add_vpn_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    expected_keys = [
        'BEGIN CERTIFICATE',
        'END CERTIFICATE',
        'BEGIN PRIVATE KEY',
        'END PRIVATE KEY',
    ]

    assert all(key in data['ovpn'] for key in expected_keys)

    check_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
    }
    response = make_request(xorp_and_tredy_hosts, 'get_vpn_list', check_params)
    make_verification(response)

    try:
        data = response.json()['data']
    except KeyError:
        pytest.fail(
            'Ошибка поиска значения по ключу "data" в ответе: {}'.format(
                response.json()))

    assert data[0]['profile'] == 'Default'
    assert data[0]['name'] == 'vpn_name_default'
    assert data[1]['profile'] == 'my_profile_test'
    assert data[1]['name'] == 'vpn_name_my_profile'

    response = make_request(xorp_and_tredy_hosts, 'clear_vpn_for_user',
                            check_params)
    make_verification(response)
    response = make_request(xorp_and_tredy_hosts, 'get_vpn_list', check_params)
    make_verification(response)

    assert response.json()['data'] == []