Codebase list drms / abd6b8b4-20e4-442d-887e-c3ca95914d06/main conftest.py
abd6b8b4-20e4-442d-887e-c3ca95914d06/main

Tree @abd6b8b4-20e4-442d-887e-c3ca95914d06/main (Download .tar.gz)

conftest.py @abd6b8b4-20e4-442d-887e-c3ca95914d06/mainraw · history · blame

from urllib.error import URLError, HTTPError
from urllib.request import urlopen

import pytest

import drms

# Test URLs, used to check if a online site is reachable
jsoc_testurl = 'http://jsoc.stanford.edu/'
kis_testurl = 'http://drms.leibniz-kis.de/'


def pytest_addoption(parser):
    parser.addoption('--email', help='Export email address')


class lazily_cached:
    """
    Lazily evaluted function call with cached result.
    """

    def __init__(self, f, *args, **kwargs):
        self.func = lambda: f(*args, **kwargs)

    def __call__(self):
        if not hasattr(self, 'result'):
            self.result = self.func()
        return self.result


def site_reachable(url, timeout=15):
    """
    Checks if the given URL is accessible.
    """
    try:
        urlopen(url, timeout=timeout)
    except (URLError, HTTPError):
        return False
    return True


# Create lazily evaluated, cached site checks for JSOC and KIS.
jsoc_reachable = lazily_cached(site_reachable, jsoc_testurl)
kis_reachable = lazily_cached(site_reachable, kis_testurl)


def pytest_runtest_setup(item):
    # Skip JSOC online site tests if the site is not reachable.
    if item.get_closest_marker('jsoc') is not None:
        if not jsoc_reachable():
            pytest.skip('JSOC is not reachable')

    # Skip KIS online site tests if the site is not reachable.
    if item.get_closest_marker('kis') is not None:
        if not kis_reachable():
            pytest.skip('KIS is not reachable')

    # Skip export tests if no email address was specified.
    if item.get_closest_marker('export') is not None:
        email = item.config.getoption('email')
        if email is None:
            pytest.skip('No email address specified; use the --email option to enable export tests')


@pytest.fixture
def email(request):
    """
    Email address from --email command line option.
    """
    return request.config.getoption('--email')


@pytest.fixture
def jsoc_client():
    """
    Client fixture for JSOC online tests, does not use email.
    """
    return drms.Client('jsoc')


@pytest.fixture
def jsoc_client_export(email):
    """
    Client fixture for JSOC online tests, uses email if specified.
    """
    return drms.Client('jsoc', email=email)


@pytest.fixture
def kis_client():
    """
    Client fixture for KIS online tests.
    """
    return drms.Client('kis')