Skip to content

Commit

Permalink
improve tests
Browse files Browse the repository at this point in the history
  • Loading branch information
constverum committed Sep 26, 2017
1 parent 2a09c0f commit d560297
Show file tree
Hide file tree
Showing 11 changed files with 591 additions and 673 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
__dev__
__pycache__
*.eggs
*.egg-info
.idea
.DS_Store
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ python:
- 3.5
- 3.6
os:
- osx
- linux
install:
- pip install -r requirements.txt
Expand Down
10 changes: 5 additions & 5 deletions environment.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: py35
name: py36
dependencies:
- pip=8.1.1=py35_0
- python=3.5.1=0
- setuptools=20.3=py35_0
- wheel=0.29.0=py35_0
- pip=9.0.1=py36_1
- python=3.6.2=0
- setuptools=27.2=py36_0
- wheel=0.29.0=py36_0
- pip:
- sphinx
- alabaster
Expand Down
6 changes: 4 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@
test = pytest

[tool:pytest]
addopts = --verbose
testpaths = tests
addopts = --verbose --pep8 --flakes
norecursedirs = .* *.egg build dist docs
pep8ignore = E731
flakes-ignore = E731
7 changes: 5 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
REQUIRES = f.read().split()

SETUP_REQUIRES = ['pytest-runner']
TEST_REQUIRES = ['pytest>=3.2.2']
TEST_REQUIRES = ['pytest>=3.2.2', 'pytest-asyncio>=0.8', 'pytest-mock>=1.6.3',
'pytest-pep8>=1.0.6', 'pytest-flakes>=2.0.0']
PACKAGES = ['proxybroker', 'proxybroker.data']
PACKAGE_DATA = {'': ['LICENSE'], INFO['package']: ['data/*.mmdb']}

Expand Down Expand Up @@ -53,7 +54,9 @@
'Topic :: Internet :: Proxy Servers',
'License :: OSI Approved :: Apache Software License',
],
keywords='proxy finder grabber scraper parser graber scrapper checker broker async asynchronous http https connect socks socks4 socks5',
keywords=(
'proxy finder grabber scraper parser graber scrapper checker '
'broker async asynchronous http https connect socks socks4 socks5'),
zip_safe=False,
test_suite='tests',
)
80 changes: 80 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
"""
The module was copied from
https://github.com/aio-libs/aiohttp/blob/master/tests/conftest.py
"""

import collections
import logging

import pytest


_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
["records", "output"])


class _CapturingHandler(logging.Handler):
"""
A logging handler capturing all (raw and formatted) logging output.
"""

def __init__(self):
logging.Handler.__init__(self)
self.watcher = _LoggingWatcher([], [])

def flush(self):
pass

def emit(self, record):
self.watcher.records.append(record)
msg = self.format(record)
self.watcher.output.append(msg)


class _AssertLogsContext:
"""A context manager used to implement TestCase.assertLogs()."""

LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"

def __init__(self, logger_name=None, level=None):
self.logger_name = logger_name
if level:
self.level = logging._nameToLevel.get(level, level)
else:
self.level = logging.INFO
self.msg = None

def __enter__(self):
if isinstance(self.logger_name, logging.Logger):
logger = self.logger = self.logger_name
else:
logger = self.logger = logging.getLogger(self.logger_name)
formatter = logging.Formatter(self.LOGGING_FORMAT)
handler = _CapturingHandler()
handler.setFormatter(formatter)
self.watcher = handler.watcher
self.old_handlers = logger.handlers[:]
self.old_level = logger.level
self.old_propagate = logger.propagate
logger.handlers = [handler]
logger.setLevel(self.level)
logger.propagate = False
return handler.watcher

def __exit__(self, exc_type, exc_value, tb):
self.logger.handlers = self.old_handlers
self.logger.propagate = self.old_propagate
self.logger.setLevel(self.old_level)
if exc_type is not None:
# let unexpected exceptions pass through
return False
if len(self.watcher.records) == 0:
__tracebackhide__ = True
assert 0, ("no logs of level {} or higher triggered on {}"
.format(logging.getLevelName(self.level),
self.logger.name))


@pytest.fixture
def log():
return _AssertLogsContext
Loading

0 comments on commit d560297

Please sign in to comment.