Skip to content

Commit cb6840a

Browse files
committed
feat: print each result of the test command as soon as its check ends
1 parent b4549f3 commit cb6840a

6 files changed

Lines changed: 52 additions & 20 deletions

File tree

‎doc/changelog.rst‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
Changelog
22
=========
33

4+
[0.7.1] - Unreleased
5+
--------------------
6+
7+
Changed
8+
^^^^^^^
9+
- The ``test`` command prints each result as soon as its check ends, instead of at the end of
10+
the run. Requires scim2-tester 0.6.4, which also brings new checks.
11+
412
[0.7.0] - 2026-10-29
513
--------------------
614

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ requires-python = ">= 3.11"
2929
dependencies = [
3030
"click>=8.5.0",
3131
"scim2-client[httpx2]>=0.14.0",
32-
"scim2-tester>=0.6.3",
32+
"scim2-tester>=0.6.4",
3333
"sphinx-click-rst-to-ansi-formatter>=0.2.0",
3434
"pydanclick>=0.5.0",
3535
"pygments>=2.18.0",

‎scim2_cli/test.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import click
66
from scim2_tester import Outcome
77
from scim2_tester import Status
8-
from scim2_tester import check_server
8+
from scim2_tester import iter_check_server
99
from sphinx_click.rst_to_ansi_formatter import make_rst_to_ansi_formatter
1010

1111
from .utils import DOC_URL
@@ -89,7 +89,7 @@ def test_cli(
8989
if seed is None:
9090
seed = secrets.randbelow(2**32)
9191
click.echo(f"Performing a SCIM compliance check on {client.client.base_url} ...")
92-
results = check_server(client, seed=seed)
92+
results = iter_check_server(client, seed=seed)
9393
failed = False
9494
outcomes: Counter[Outcome] = Counter()
9595
for result in results:

‎tests/test_escape.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def test_compliance_report_is_escaped(runner, httpserver, field, sequence, escap
7777
)
7878
setattr(result, field, f"{getattr(result, field)}{sequence}")
7979

80-
with patch("scim2_cli.test.check_server", side_effect=[[result]]):
80+
with patch("scim2_cli.test.iter_check_server", side_effect=[[result]]):
8181
output = runner.invoke(
8282
cli, ["--url", httpserver.url_for("/"), "test", "-vv"], color=True
8383
).output
@@ -146,7 +146,7 @@ def test_line_breaks_and_tabulations_are_kept(runner, httpserver):
146146
"""Line breaks and tabulations are the layout of the messages, not escape sequences."""
147147
result = CheckResult(status=Status.ERROR, title="check", reason="first\n\tsecond")
148148

149-
with patch("scim2_cli.test.check_server", side_effect=[[result]]):
149+
with patch("scim2_cli.test.iter_check_server", side_effect=[[result]]):
150150
output = runner.invoke(
151151
cli, ["--url", httpserver.url_for("/"), "test"], color=True
152152
).output

‎tests/test_test.py‎

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212

1313
def run_checks(runner, httpserver, results, *options, color=False):
14-
with patch("scim2_cli.test.check_server", side_effect=[results]):
14+
with patch("scim2_cli.test.iter_check_server", side_effect=[results]):
1515
return runner.invoke(
1616
cli,
1717
["--url", httpserver.url_for("/"), "test", *options],
@@ -112,12 +112,12 @@ def test_response_checks_options(runner, httpserver, options, expected):
112112
"""Test that the response check options are applied on the client."""
113113
checked = {}
114114

115-
def check_server(client, seed):
115+
def iter_check_server(client, seed):
116116
checked["status_codes"] = client.check_response_status_codes
117117
checked["content_type"] = client.check_response_content_type
118118
return []
119119

120-
with patch("scim2_cli.test.check_server", check_server):
120+
with patch("scim2_cli.test.iter_check_server", iter_check_server):
121121
result = runner.invoke(
122122
cli,
123123
["--url", httpserver.url_for("/"), "test", *options],
@@ -218,28 +218,32 @@ def test_every_outcome_has_a_color():
218218

219219
def test_seed_is_sent_and_printed(runner, httpserver):
220220
"""The seed passed with --seed generates the values, and is printed at the end."""
221-
with patch("scim2_cli.test.check_server", return_value=[]) as check_server:
221+
with patch(
222+
"scim2_cli.test.iter_check_server", return_value=[]
223+
) as iter_check_server:
222224
result = runner.invoke(
223225
cli,
224226
["--url", httpserver.url_for("/"), "test", "--seed", "1234"],
225227
catch_exceptions=False,
226228
)
227229

228-
assert check_server.call_args.kwargs["seed"] == 1234
230+
assert iter_check_server.call_args.kwargs["seed"] == 1234
229231
assert result.output.splitlines()[-1] == "no checks ran (seed 1234)"
230232

231233

232234
def test_each_run_has_its_own_seed(runner, httpserver):
233235
"""Without --seed, each run draws a new seed and prints it."""
234236
seeds = []
235237
for _ in range(2):
236-
with patch("scim2_cli.test.check_server", return_value=[]) as check_server:
238+
with patch(
239+
"scim2_cli.test.iter_check_server", return_value=[]
240+
) as iter_check_server:
237241
result = runner.invoke(
238242
cli,
239243
["--url", httpserver.url_for("/"), "test"],
240244
catch_exceptions=False,
241245
)
242-
seed = check_server.call_args.kwargs["seed"]
246+
seed = iter_check_server.call_args.kwargs["seed"]
243247
assert result.output.splitlines()[-1] == f"no checks ran (seed {seed})"
244248
seeds.append(seed)
245249

@@ -248,24 +252,24 @@ def test_each_run_has_its_own_seed(runner, httpserver):
248252

249253
def test_seed_must_be_an_integer(runner, httpserver):
250254
"""A seed that is not an integer is a usage error."""
251-
with patch("scim2_cli.test.check_server") as check_server:
255+
with patch("scim2_cli.test.iter_check_server") as iter_check_server:
252256
result = runner.invoke(
253257
cli, ["--url", httpserver.url_for("/"), "test", "--seed", "abc"]
254258
)
255259

256260
assert result.exit_code == 2
257261
assert "'abc' is not a valid integer" in result.output
258-
check_server.assert_not_called()
262+
iter_check_server.assert_not_called()
259263

260264

261265
def test_header_is_printed_before_the_checks(runner, httpserver):
262266
"""The header is printed before the checks run."""
263267

264-
def check_server(client, seed):
268+
def iter_check_server(client, seed):
265269
click.echo("checks running")
266270
return []
267271

268-
with patch("scim2_cli.test.check_server", check_server):
272+
with patch("scim2_cli.test.iter_check_server", iter_check_server):
269273
result = runner.invoke(
270274
cli, ["--url", httpserver.url_for("/"), "test"], catch_exceptions=False
271275
)
@@ -276,6 +280,26 @@ def check_server(client, seed):
276280
]
277281

278282

283+
def test_results_are_printed_as_soon_as_they_arrive(runner, httpserver):
284+
"""Each result is printed before the next check runs."""
285+
286+
def iter_check_server(client, seed):
287+
yield CheckResult(status=Status.ERROR, title="test1")
288+
click.echo("next check running")
289+
yield CheckResult(status=Status.ERROR, title="test2")
290+
291+
with patch("scim2_cli.test.iter_check_server", iter_check_server):
292+
result = runner.invoke(
293+
cli, ["--url", httpserver.url_for("/"), "test"], catch_exceptions=False
294+
)
295+
296+
assert result.output.splitlines()[1:4] == [
297+
"ERROR test1",
298+
"next check running",
299+
"ERROR test2",
300+
]
301+
302+
279303
@pytest.mark.parametrize(
280304
("statuses", "expected"),
281305
[

‎uv.lock‎

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)