diff options
Diffstat (limited to 'tests/wpt/web-platform-tests/tools/pytest/testing/test_pytester.py')
-rw-r--r-- | tests/wpt/web-platform-tests/tools/pytest/testing/test_pytester.py | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/tests/wpt/web-platform-tests/tools/pytest/testing/test_pytester.py b/tests/wpt/web-platform-tests/tools/pytest/testing/test_pytester.py new file mode 100644 index 00000000000..65660afdfe3 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/pytest/testing/test_pytester.py @@ -0,0 +1,122 @@ +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.assert_outcomes(passed=1) + + +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_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 |