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_ip(xorp_and_tredy_hosts):
    """
    Тест проверяет метод clear_ip.
    Создается пользователь. Добавляем ему ip-адреса.
    Определяем айдишник дефолтного профиля.
    Удаляем добавленные пользователю ip-адреса.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    ip_list = [generate_public_ip() for _ in range(3)]
    ip_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': ip_list,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', ip_params)
    make_verification(response)
    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 = [key for key, value in data.items() if value == 'Default'][0]

    clear_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'profile': profile_id,
    }
    response = make_request(xorp_and_tredy_hosts, 'clear_ip', clear_params)
    make_verification(response)
    response = make_request(xorp_and_tredy_hosts, 'list_ip', clear_params)
    make_verification(response)

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

    assert 'ip' in data
    assert not data['ip']
def test_add_user_with_the_same_ip(xorp_and_tredy_hosts):
    """
    Тест проверяет метод add_ip. Кейс2.
    Создаем пользователя, добавляем ему ip-адрес.
    Создаем еще одного пользователя и пытаемся добавить ему ip-адрес первого пользователя.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    ip_address = generate_public_ip()
    mandatory_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': ip_address,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', mandatory_params)
    make_verification(response)

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

    assert data['added_addresses'][0] == ip_address
    assert 'invalid_adresses' not in data.keys()

    new_login, new_password = generate_login_password()
    create_user(xorp_and_tredy_hosts, new_login, new_password)
    # Пытаемся добавить ему адрес, ранее добавленный первому пользователю
    mandatory_params_case_2 = {
        'key': API_PUBLIC_KEY,
        'ident': new_login,
        'ip': ip_address,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip',
                            mandatory_params_case_2)
    make_verification(response)

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

    assert data['added_addresses'] == []
    assert invalid_adress[
        ip_address] == 'Address already added to another user'
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_remove_ip(xorp_and_tredy_hosts):
    """
    Тест проверяет метод remove_ip.
    Создаем пользователя, добавляем ему айпишник.
    Удаляем добавленный айпишник. Валидируем по статусу ответа.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    public_ip = generate_public_ip()
    mandatory_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': public_ip,
    }
    response = make_request(xorp_and_tredy_hosts, 'update_ip',
                            mandatory_params)
    make_verification(response)
    response = make_request(xorp_and_tredy_hosts, 'remove_ip',
                            mandatory_params)
    make_verification(response)
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_add_ip_free(xorp_and_tredy_hosts):
    """
    Тест проверяет метод add_ip. Кейс1.
    Создаем пользователя с тарифом FREE и пытаемся добавить ему непубличный ip-адрес.
    Пытаемся добавить пользователю два ip-адреса.
    Первый адрес добавляется, второй не может быть добавлен.
    """
    login, password = generate_login_password()
    create_user(xorp_and_tredy_hosts, login, password)
    unsubscribe_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
    }
    response = make_request(xorp_and_tredy_hosts, 'unsubscribe',
                            unsubscribe_params)
    make_verification(response)

    # Case1
    mandatory_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': '255.255.255.255',
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', mandatory_params)
    make_verification(response)

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

    assert data['added_addresses'] == [], 'Case1. Добавлен непубличный адрес'

    invalid_adress = data['invalid_adresses'][0]

    assert invalid_adress['255.255.255.255'] == 'This address is not public', \
    'Case1. Адрес отсутствует в invalid_adresses'

    # Case2
    address = generate_public_ip()
    mandatory_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': address,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', mandatory_params)
    make_verification(response)

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

    assert data['added_addresses'][0] == address, 'Case2. Адрес не добавлен'
    assert 'invalid_adresses' not in data.keys()

    # Case3
    address = generate_public_ip()
    mandatory_params = {
        'key': API_PUBLIC_KEY,
        'ident': login,
        'ip': address,
    }
    response = make_request(xorp_and_tredy_hosts, 'add_ip', mandatory_params)
    make_verification(response)

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

    assert data['added_addresses'] == [], 'Case3. Добавлен лишний ip-адрес'
    assert address in data['invalid_adresses'][0].keys()
    assert data['invalid_adresses'][0].get(
        address
    ) == 'The limit is reached', 'Case3. Отсутствует сообщение об ошибке'