from __future__ import absolute_import, division, print_function import sys import pytest from _pytest.compat import is_generator, get_real_func, safe_getattr from _pytest.outcomes import OutcomeException def test_is_generator(): def zap(): yield def foo(): pass assert is_generator(zap) assert not is_generator(foo) def test_real_func_loop_limit(): class Evil(object): def __init__(self): self.left = 1000 def __repr__(self): return "".format(left=self.left) def __getattr__(self, attr): if not self.left: raise RuntimeError('its over') self.left -= 1 return self evil = Evil() with pytest.raises(ValueError): res = get_real_func(evil) print(res) @pytest.mark.skipif(sys.version_info < (3, 4), reason='asyncio available in Python 3.4+') def test_is_generator_asyncio(testdir): testdir.makepyfile(""" from _pytest.compat import is_generator import asyncio @asyncio.coroutine def baz(): yield from [1,2,3] def test_is_generator_asyncio(): assert not is_generator(baz) """) # avoid importing asyncio into pytest's own process, # which in turn imports logging (#8) result = testdir.runpytest_subprocess() result.stdout.fnmatch_lines(['*1 passed*']) @pytest.mark.skipif(sys.version_info < (3, 5), reason='async syntax available in Python 3.5+') def test_is_generator_async_syntax(testdir): testdir.makepyfile(""" from _pytest.compat import is_generator def test_is_generator_py35(): async def foo(): await foo() async def bar(): pass assert not is_generator(foo) assert not is_generator(bar) """) result = testdir.runpytest() result.stdout.fnmatch_lines(['*1 passed*']) class ErrorsHelper(object): @property def raise_exception(self): raise Exception('exception should be catched') @property def raise_fail(self): pytest.fail('fail should be catched') def test_helper_failures(): helper = ErrorsHelper() with pytest.raises(Exception): helper.raise_exception with pytest.raises(OutcomeException): helper.raise_fail def test_safe_getattr(): helper = ErrorsHelper() assert safe_getattr(helper, 'raise_exception', 'default') == 'default' assert safe_getattr(helper, 'raise_fail', 'default') == 'default'