135 lines
3.7 KiB
Python
135 lines
3.7 KiB
Python
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:
|
|
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:
|
|
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.stdout.fnmatch_lines([
|
|
"*1 passed*"
|
|
])
|
|
|
|
|
|
def make_holder():
|
|
class apiclass:
|
|
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_inprocess_plugins(testdir):
|
|
class Plugin(object):
|
|
configured = False
|
|
def pytest_configure(self, config):
|
|
self.configured = True
|
|
plugin = Plugin()
|
|
testdir.inprocess_run([], [plugin])
|
|
|
|
assert plugin.configured
|
|
|
|
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
|