102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			102 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'
 |