diff --git a/src/pytest_html/scripts/main.js b/src/pytest_html/scripts/main.js index b737285..ffff533 100644 --- a/src/pytest_html/scripts/main.js +++ b/src/pytest_html/scripts/main.js @@ -78,9 +78,9 @@ const renderDerived = (tests, collectedItems, isFinished) => { const accTime = tests.reduce((prev, { duration }) => prev + duration, 0) const formattedAccTime = formatDuration(accTime) const testWord = numberOfTests > 1 ? 'tests' : 'test' - const durationText = formattedAccTime.hasOwnProperty('ms') ? formattedAccTime.ms : formattedAccTime.seconds + const durationText = formattedAccTime.hasOwnProperty('ms') ? formattedAccTime.ms : formattedAccTime.formatted - document.querySelector('.run-count').innerText = `${numberOfTests} ${testWord} ran in ${durationText}.` + document.querySelector('.run-count').innerText = `${numberOfTests} ${testWord} took ${durationText}.` document.querySelector('.summary__reload__button').classList.add('hidden') } else { document.querySelector('.run-count').innerText = `${numberOfTests} / ${collectedItems} tests done` diff --git a/src/pytest_html/scripts/utils.js b/src/pytest_html/scripts/utils.js index 44549c1..278ab15 100644 --- a/src/pytest_html/scripts/utils.js +++ b/src/pytest_html/scripts/utils.js @@ -1,4 +1,4 @@ -const formatedNumber = (number) => +const formattedNumber = (number) => number.toLocaleString('en-US', { minimumIntegerDigits: 2, useGrouping: false, @@ -17,7 +17,7 @@ const formatDuration = ( totalSeconds ) => { return { seconds: `${Math.round(totalSeconds)} seconds`, - formatted: `${formatedNumber(hours)}:${formatedNumber(minutes)}:${formatedNumber(seconds)}`, + formatted: `${formattedNumber(hours)}:${formattedNumber(minutes)}:${formattedNumber(seconds)}`, } } diff --git a/testing/test_integration.py b/testing/test_integration.py index 079f738..72862bd 100644 --- a/testing/test_integration.py +++ b/testing/test_integration.py @@ -83,13 +83,6 @@ def assert_results( result = get_text(page, f"span[class={outcome}]") assert_that(result).is_equal_to(f"{number} {OUTCOMES[outcome]}") - # if total_tests is not None: - # number_of_tests = total_tests - # total = get_text(page, "p[class='run-count']") - # expr = r"%d %s ran in \d+.\d+ seconds." - # % (number_of_tests, "tests" if number_of_tests > 1 else "test") - # assert_that(total).matches(expr) - def get_element(page, selector): return page.select_one(selector) @@ -150,12 +143,43 @@ class TestHTML: ) page = run(pytester) duration = get_text(page, "#results-table td[class='col-duration']") + total_duration = get_text(page, "p[class='run-count']") if pause < 1: assert_that(int(duration.replace("ms", ""))).is_between( expectation, expectation * 2 ) + assert_that(total_duration).matches(r"\d+\s+ms") else: assert_that(duration).matches(expectation) + assert_that(total_duration).matches(r"\d{2}:\d{2}:\d{2}") + + def test_total_number_of_tests_zero(self, pytester): + page = run(pytester) + assert_results(page) + + total = get_text(page, "p[class='run-count']") + assert_that(total).matches(r"0 test(?!s)") + + def test_total_number_of_tests_singular(self, pytester): + pytester.makepyfile("def test_pass(): pass") + page = run(pytester) + assert_results(page, passed=1) + + total = get_text(page, "p[class='run-count']") + assert_that(total).matches(r"1 test(?!s)") + + def test_total_number_of_tests_plural(self, pytester): + pytester.makepyfile( + """ + def test_pass_one(): pass + def test_pass_two(): pass + """ + ) + page = run(pytester) + assert_results(page, passed=2) + + total = get_text(page, "p[class='run-count']") + assert_that(total).matches(r"2 tests(?!\S)") def test_pass(self, pytester): pytester.makepyfile("def test_pass(): pass")