1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
# This file is part of Hypothesis, which may be found at
# https://github.com/HypothesisWorks/hypothesis/
#
# Copyright the Hypothesis Authors.
# Individual contributors are listed in AUTHORS.rst and the git log.
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/.
import pytest
from hypothesis.internal.compat import WINDOWS, escape_unicode_characters
pytest_plugins = "pytester"
TESTSUITE = """
from hypothesis import given, settings, Verbosity
from hypothesis.strategies import integers
@settings(verbosity=Verbosity.verbose)
@given(integers())
def test_should_be_verbose(x):
pass
"""
@pytest.mark.parametrize("capture,expected", [("no", True), ("fd", False)])
def test_output_without_capture(testdir, capture, expected):
script = testdir.makepyfile(TESTSUITE)
result = testdir.runpytest(script, "--verbose", "--capture", capture)
out = "\n".join(result.stdout.lines)
assert "test_should_be_verbose" in out
assert ("Trying example" in out) == expected
assert result.ret == 0
UNICODE_EMITTING = """
import pytest
from hypothesis import given, settings, Verbosity
from hypothesis.strategies import text
import sys
def test_emits_unicode():
@settings(verbosity=Verbosity.verbose)
@given(text())
def test_should_emit_unicode(t):
assert all(ord(c) <= 1000 for c in t), ascii(t)
with pytest.raises(AssertionError):
test_should_emit_unicode()
"""
@pytest.mark.xfail(
WINDOWS,
reason="Encoding issues in running the subprocess, possibly pytest's fault",
strict=False, # It's possible, if rare, for this to pass on Windows too.
)
def test_output_emitting_unicode(testdir, monkeypatch):
monkeypatch.setenv("LC_ALL", "C")
monkeypatch.setenv("LANG", "C")
script = testdir.makepyfile(UNICODE_EMITTING)
result = getattr(testdir, "runpytest_subprocess", testdir.runpytest)(
script, "--verbose", "--capture=no"
)
out = "\n".join(result.stdout.lines)
assert "test_emits_unicode" in out
assert chr(1001) in out or escape_unicode_characters(chr(1001)) in out
assert result.ret == 0
def get_line_num(token, lines, skip_n=0):
skipped = 0
for i, line in enumerate(lines):
if token in line:
if skip_n == skipped:
return i
else:
skipped += 1
raise AssertionError(
f"Token {token!r} not found (skipped {skipped} of planned {skip_n} skips)"
)
TRACEBACKHIDE_HEALTHCHECK = """
from hypothesis import given, settings
from hypothesis.strategies import integers
import time
@given(integers().map(lambda x: time.sleep(0.2)))
def test_healthcheck_traceback_is_hidden(x):
pass
"""
def test_healthcheck_traceback_is_hidden(testdir, monkeypatch):
monkeypatch.delenv("CI", raising=False)
script = testdir.makepyfile(TRACEBACKHIDE_HEALTHCHECK)
lines = testdir.runpytest(script, "--verbose").stdout.lines
def_token = "__ test_healthcheck_traceback_is_hidden __"
timeout_token = ": FailedHealthCheck"
def_line = get_line_num(def_token, lines)
timeout_line = get_line_num(timeout_token, lines)
# 16 on pytest 8.4.0 combined with py3{9, 10} or 3.13 free-threading (but
# not with 3.13 normal??)
assert timeout_line - def_line in {15, 16}
COMPOSITE_IS_NOT_A_TEST = """
from hypothesis.strategies import composite, none
@composite
def test_data_factory(draw):
return draw(none())
"""
def test_deprecation_of_strategies_as_tests(testdir):
script = testdir.makepyfile(COMPOSITE_IS_NOT_A_TEST)
testdir.runpytest(script).assert_outcomes(failed=1)
|