139 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
| from __future__ import absolute_import, division, print_function
 | |
| import pytest
 | |
| import os
 | |
| from _pytest.pytester import HookRecorder
 | |
| from _pytest.config import PytestPluginManager
 | |
| from _pytest.main import EXIT_OK, EXIT_TESTSFAILED
 | |
| 
 | |
| 
 | |
| def test_make_hook_recorder(testdir):
 | |
|     item = testdir.getitem("def test_func(): pass")
 | |
|     recorder = testdir.make_hook_recorder(item.config.pluginmanager)
 | |
|     assert not recorder.getfailures()
 | |
| 
 | |
|     pytest.xfail("internal reportrecorder tests need refactoring")
 | |
| 
 | |
|     class rep(object):
 | |
|         excinfo = None
 | |
|         passed = False
 | |
|         failed = True
 | |
|         skipped = False
 | |
|         when = "call"
 | |
| 
 | |
|     recorder.hook.pytest_runtest_logreport(report=rep)
 | |
|     failures = recorder.getfailures()
 | |
|     assert failures == [rep]
 | |
|     failures = recorder.getfailures()
 | |
|     assert failures == [rep]
 | |
| 
 | |
|     class rep(object):
 | |
|         excinfo = None
 | |
|         passed = False
 | |
|         failed = False
 | |
|         skipped = True
 | |
|         when = "call"
 | |
|     rep.passed = False
 | |
|     rep.skipped = True
 | |
|     recorder.hook.pytest_runtest_logreport(report=rep)
 | |
| 
 | |
|     modcol = testdir.getmodulecol("")
 | |
|     rep = modcol.config.hook.pytest_make_collect_report(collector=modcol)
 | |
|     rep.passed = False
 | |
|     rep.failed = True
 | |
|     rep.skipped = False
 | |
|     recorder.hook.pytest_collectreport(report=rep)
 | |
| 
 | |
|     passed, skipped, failed = recorder.listoutcomes()
 | |
|     assert not passed and skipped and failed
 | |
| 
 | |
|     numpassed, numskipped, numfailed = recorder.countoutcomes()
 | |
|     assert numpassed == 0
 | |
|     assert numskipped == 1
 | |
|     assert numfailed == 1
 | |
|     assert len(recorder.getfailedcollections()) == 1
 | |
| 
 | |
|     recorder.unregister()
 | |
|     recorder.clear()
 | |
|     recorder.hook.pytest_runtest_logreport(report=rep)
 | |
|     pytest.raises(ValueError, "recorder.getfailures()")
 | |
| 
 | |
| 
 | |
| def test_parseconfig(testdir):
 | |
|     config1 = testdir.parseconfig()
 | |
|     config2 = testdir.parseconfig()
 | |
|     assert config2 != config1
 | |
|     assert config1 != pytest.config
 | |
| 
 | |
| 
 | |
| def test_testdir_runs_with_plugin(testdir):
 | |
|     testdir.makepyfile("""
 | |
|         pytest_plugins = "pytester"
 | |
|         def test_hello(testdir):
 | |
|             assert 1
 | |
|     """)
 | |
|     result = testdir.runpytest()
 | |
|     result.assert_outcomes(passed=1)
 | |
| 
 | |
| 
 | |
| def make_holder():
 | |
|     class apiclass(object):
 | |
|         def pytest_xyz(self, arg):
 | |
|             "x"
 | |
| 
 | |
|         def pytest_xyz_noarg(self):
 | |
|             "x"
 | |
| 
 | |
|     apimod = type(os)('api')
 | |
| 
 | |
|     def pytest_xyz(arg):
 | |
|         "x"
 | |
| 
 | |
|     def pytest_xyz_noarg():
 | |
|         "x"
 | |
| 
 | |
|     apimod.pytest_xyz = pytest_xyz
 | |
|     apimod.pytest_xyz_noarg = pytest_xyz_noarg
 | |
|     return apiclass, apimod
 | |
| 
 | |
| 
 | |
| @pytest.mark.parametrize("holder", make_holder())
 | |
| def test_hookrecorder_basic(holder):
 | |
|     pm = PytestPluginManager()
 | |
|     pm.addhooks(holder)
 | |
|     rec = HookRecorder(pm)
 | |
|     pm.hook.pytest_xyz(arg=123)
 | |
|     call = rec.popcall("pytest_xyz")
 | |
|     assert call.arg == 123
 | |
|     assert call._name == "pytest_xyz"
 | |
|     pytest.raises(pytest.fail.Exception, "rec.popcall('abc')")
 | |
|     pm.hook.pytest_xyz_noarg()
 | |
|     call = rec.popcall("pytest_xyz_noarg")
 | |
|     assert call._name == "pytest_xyz_noarg"
 | |
| 
 | |
| 
 | |
| def test_makepyfile_unicode(testdir):
 | |
|     global unichr
 | |
|     try:
 | |
|         unichr(65)
 | |
|     except NameError:
 | |
|         unichr = chr
 | |
|     testdir.makepyfile(unichr(0xfffd))
 | |
| 
 | |
| 
 | |
| def test_inline_run_clean_modules(testdir):
 | |
|     test_mod = testdir.makepyfile("def test_foo(): assert True")
 | |
|     result = testdir.inline_run(str(test_mod))
 | |
|     assert result.ret == EXIT_OK
 | |
|     # rewrite module, now test should fail if module was re-imported
 | |
|     test_mod.write("def test_foo(): assert False")
 | |
|     result2 = testdir.inline_run(str(test_mod))
 | |
|     assert result2.ret == EXIT_TESTSFAILED
 | |
| 
 | |
| 
 | |
| def test_assert_outcomes_after_pytest_erro(testdir):
 | |
|     testdir.makepyfile("def test_foo(): assert True")
 | |
| 
 | |
|     result = testdir.runpytest('--unexpected-argument')
 | |
|     with pytest.raises(ValueError, message="Pytest terminal report not found"):
 | |
|         result.assert_outcomes(passed=0)
 |