from yaml import load, SafeLoader
from os import environ
from pytest import raises

import warnings
import socket
from requests import get
from requests.exceptions import SSLError


def req(url, ip, verify=True):
    # Monkey patch to force IPv4 resolution
    old_getaddrinfo = socket.getaddrinfo
    def new_getaddrinfo(*args, **kwargs):
        ret = old_getaddrinfo(*args, **kwargs)
        dns = list(ret[0])
        dns[-1] = (ip, dns[-1][1])
        return [dns]
    socket.getaddrinfo = new_getaddrinfo
    if not verify:
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            ret = get(url, verify=verify)
    else:
        ret = get(url, verify=verify)
    ret_code = ret.status_code
    content = ret.content
    socket.getaddrinfo = old_getaddrinfo
    return ret_code, content.decode()


def test_revprox():
    conf_file = f'{environ["MACHINE_TEST_DIR"]}/nginx-common.yml'
    with open(conf_file) as yaml:
        data = load(yaml, Loader=SafeLoader)
    # test unknown domain
    url = 'google.fr'
    protocols = []
    if data['nginx_default_http']:
        protocols.append('http')
    if data['nginx_default_https']:
        protocols.append('https')
        # test certificate
        with raises(SSLError):
            # certificat problem for https://{url}
            req(f'https://{url}', data['address'])
    for protocol in protocols:
        ret_code, content = req(f'{protocol}://{url}', data['address'], verify=False)
        assert ret_code == 200, f'{protocol}://{url} do not returns code 200 but {ret_code}'
#        assert "<title>Welcome</title>" in content, f'{protocol}://{url} do not returns default fedora page'