111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
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 "<Evil left={left}>".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"
 |