summaryrefslogtreecommitdiff
blob: 54e62aabbc4dfa3af1a1d34f733e8827a0b99247 (plain)
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DISTUTILS_USE_PEP517=setuptools
PYTHON_TESTED=( python3_{10..13} pypy3 )
PYTHON_COMPAT=( "${PYTHON_TESTED[@]}" )

inherit distutils-r1 pypi

DESCRIPTION="Simple powerful testing with Python"
HOMEPAGE="
	https://pytest.org/
	https://github.com/pytest-dev/pytest/
	https://pypi.org/project/pytest/
"

LICENSE="MIT"
SLOT="0"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x64-solaris"
IUSE="test"
RESTRICT="!test? ( test )"

RDEPEND="
	dev-python/iniconfig[${PYTHON_USEDEP}]
	dev-python/packaging[${PYTHON_USEDEP}]
	<dev-python/pluggy-2[${PYTHON_USEDEP}]
	>=dev-python/pluggy-1.5.0[${PYTHON_USEDEP}]
	$(python_gen_cond_dep '
		>=dev-python/exceptiongroup-1.0.0_rc8[${PYTHON_USEDEP}]
		>=dev-python/tomli-1[${PYTHON_USEDEP}]
	' 3.10)
	!!<=dev-python/flaky-3.7.0-r5
"
BDEPEND="
	>=dev-python/setuptools-scm-6.2.3[${PYTHON_USEDEP}]
	test? (
		${RDEPEND}
		$(python_gen_cond_dep '
			dev-python/argcomplete[${PYTHON_USEDEP}]
			>=dev-python/attrs-19.2[${PYTHON_USEDEP}]
			>=dev-python/hypothesis-3.56[${PYTHON_USEDEP}]
			dev-python/mock[${PYTHON_USEDEP}]
			>=dev-python/pygments-2.7.2[${PYTHON_USEDEP}]
			dev-python/pytest-xdist[${PYTHON_USEDEP}]
			dev-python/requests[${PYTHON_USEDEP}]
			dev-python/xmlschema[${PYTHON_USEDEP}]
		' "${PYTHON_TESTED[@]}")
	)
"

src_test() {
	# workaround new readline defaults
	echo "set enable-bracketed-paste off" > "${T}"/inputrc || die
	local -x INPUTRC="${T}"/inputrc
	distutils-r1_src_test
}

python_test() {
	if ! has "${EPYTHON}" "${PYTHON_TESTED[@]/_/.}"; then
		einfo "Skipping tests on ${EPYTHON}"
		return
	fi

	local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
	local -x COLUMNS=80

	local EPYTEST_DESELECT=(
		# broken by epytest args
		testing/test_warnings.py::test_works_with_filterwarnings

		# tend to be broken by random pytest plugins
		# (these tests patch PYTEST_DISABLE_PLUGIN_AUTOLOAD out)
		testing/test_helpconfig.py::test_version_less_verbose
		testing/test_helpconfig.py::test_version_verbose
		testing/test_junitxml.py::test_random_report_log_xdist
		testing/test_junitxml.py::test_runs_twice_xdist
		testing/test_terminal.py::TestProgressOutputStyle::test_xdist_normal
		testing/test_terminal.py::TestProgressOutputStyle::test_xdist_normal_count
		testing/test_terminal.py::TestProgressOutputStyle::test_xdist_verbose
		testing/test_terminal.py::TestProgressWithTeardown::test_xdist_normal
		testing/test_terminal.py::TestTerminalFunctional::test_header_trailer_info
		testing/test_terminal.py::TestTerminalFunctional::test_no_header_trailer_info

		# unstable with xdist
		testing/test_terminal.py::TestTerminalFunctional::test_verbose_reporting_xdist

		# TODO (XPASS)
		testing/test_debugging.py::TestDebuggingBreakpoints::test_pdb_not_altered
		testing/test_debugging.py::TestPDB::test_pdb_interaction_capturing_simple
		testing/test_debugging.py::TestPDB::test_pdb_interaction_capturing_twice
		testing/test_debugging.py::TestPDB::test_pdb_with_injected_do_debug
		testing/test_debugging.py::test_pdb_suspends_fixture_capturing

		# setuptools warnings
		testing/acceptance_test.py::TestInvocationVariants::test_cmdline_python_namespace_package

		# times out
		testing/test_debugging.py::TestPDB::test_pdb_interaction_exception
		testing/test_debugging.py::TestPDB::test_pdb_with_caplog_on_pdb_invocation
	)

	case ${EPYTHON} in
		pypy3)
			EPYTEST_DESELECT+=(
				# regressions on pypy3.9
				# https://github.com/pytest-dev/pytest/issues/9787
				testing/test_skipping.py::test_errors_in_xfail_skip_expressions
				testing/test_unraisableexception.py
			)
			;;
		python3.13)
			EPYTEST_DESELECT+=(
				# regressions reproduced via `tox -e py313`
				# https://github.com/pytest-dev/pytest/issues/12323
				testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_traceback_recursion
				testing/code/test_excinfo.py::TestTraceback_f_g_h::test_traceback_recursion_index
				testing/code/test_excinfo.py::test_exception_repr_extraction_error_on_recursion
				testing/code/test_source.py::test_getfslineno
				testing/test_collection.py::TestSession::test_collect_custom_nodes_multi_id
				testing/test_collection.py::TestSession::test_collect_protocol_single_function
				testing/test_collection.py::TestSession::test_collect_subdir_event_ordering
				testing/test_collection.py::TestSession::test_collect_two_commandline_args
				testing/test_doctest.py::TestDoctests::test_doctest_linedata_on_property
				testing/test_doctest.py::TestDoctests::test_doctest_unexpected_exception
				testing/test_legacypath.py::test_testdir_makefile_ext_none_raises_type_error

				# TODO?
				testing/code/test_excinfo.py::test_excinfo_no_sourcecode

				# more weird timeouts
				testing/test_debugging.py::TestPDB::test_pdb_used_outside_test
				testing/test_debugging.py::TestPDB::test_pdb_used_in_generate_tests
			)
			;;
	esac

	local EPYTEST_XDIST=1
	epytest
}