]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
tests: Add coloured runner
authorStephen Finucane <stephen@that.guru>
Wed, 2 Aug 2023 11:23:45 +0000 (12:23 +0100)
committerStephen Finucane <stephen@that.guru>
Wed, 2 Aug 2023 11:27:29 +0000 (12:27 +0100)
This is nicer to work with than a wall of red text.

Signed-off-by: Stephen Finucane <stephen@that.guru>
patchwork/settings/base.py
patchwork/tests/runner.py [new file with mode: 0644]
requirements-test.txt

index 965c949f5a7ce851e78358ec89c2a6b40b124be9..dccab6c36dbafc43029bcf702c03e01743d36f41 100644 (file)
@@ -41,7 +41,7 @@ USE_I18N = False
 
 USE_TZ = False
 
-TEST_RUNNER = 'django.test.runner.DiscoverRunner'
+TEST_RUNNER = 'patchwork.tests.runner.PatchworkTestRunner'
 
 ROOT_URLCONF = 'patchwork.urls'
 
diff --git a/patchwork/tests/runner.py b/patchwork/tests/runner.py
new file mode 100644 (file)
index 0000000..84f3aba
--- /dev/null
@@ -0,0 +1,89 @@
+# Patchwork - automated patch tracking system
+# Copyright (C) 2023 Stephen Finucane <stephen@that.guru>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+from unittest import TestResult
+from unittest import TextTestRunner
+
+from django.test.runner import DiscoverRunner
+from termcolor import colored
+
+
+# Based on upstream source
+# https://github.com/python/cpython/blob/v3.11.4/Lib/unittest/runner.py
+class ColourTextTestResult(TestResult):
+    def __init__(self, stream, descriptions, verbosity, *, durations=None):
+        super().__init__(stream, descriptions, verbosity)
+
+        self.stream = stream
+        self.descriptions = descriptions
+        self.verbosity = verbosity
+
+    def startTest(self, test):
+        super().startTest(test)
+        if self.verbosity > 1:
+            self.stream.write(colored(str(test), 'white'))
+            self.stream.write(colored(' ... ', 'white'))
+            self.stream.flush()
+
+    def _reportResult(self, short, long, color):
+        if self.verbosity == 1:
+            self.stream.write(short)
+        else:  # > 1
+            self.stream.writeln(colored(long, color, attrs=['bold']))
+        self.stream.flush()
+
+    def addSuccess(self, test):
+        super().addSuccess(test)
+        self._reportResult('.', 'ok', 'green')
+
+    def addError(self, test, err):
+        super().addError(test, err)
+        self._reportResult('E', 'ERROR', 'red')
+
+    def addFailure(self, test, err):
+        super().addFailure(test, err)
+        self._reportResult('F', 'FAIL', 'yellow')
+
+    def addSkip(self, test, reason):
+        super().addSkip(test, reason)
+        self._reportResult('s', f'skipped {reason!r}', 'white')
+
+    def addExpectedFailure(self, test, err):
+        super().addExpectedFailure(test, err)
+        self._reportResult('s', 'expected failure', 'blue')
+
+    def addUnexpectedSuccess(self, test):
+        super().addUnexpectedSuccess(test)
+        self._reportResult('s', 'unexpected success', 'red')
+
+    def printErrors(self):
+        self.stream.writeln()
+        self.stream.flush()
+
+        self.printErrorList('ERROR', self.errors)
+        self.printErrorList('FAIL', self.failures)
+
+        unexpectedSuccesses = getattr(self, 'unexpectedSuccesses', ())
+        if unexpectedSuccesses:
+            self.stream.writeln('=' * 70)
+            for test in unexpectedSuccesses:
+                self.stream.writeln(f"UNEXPECTED SUCCESS: {str(test)}")
+            self.stream.flush()
+
+    def printErrorList(self, flavour, errors):
+        for test, err in errors:
+            self.stream.writeln('=' * 70)
+            self.stream.writeln(f'{flavour}: {str(test)}')
+            self.stream.writeln('-' * 70)
+            self.stream.writeln(str(err))
+            self.stream.flush()
+
+
+class ColourTextTestRunner(TextTestRunner):
+    resultclass = ColourTextTestResult
+
+
+class PatchworkTestRunner(DiscoverRunner):
+    test_runner = ColourTextTestRunner
index af4f8635ea729632e455a369d03fec26fd239437..f538b61dd89d7c24159f0c7804f7417517b60bf9 100644 (file)
@@ -4,3 +4,4 @@ sqlparse~=0.4.0
 python-dateutil~=2.8.0
 tblib~=2.0.0
 openapi-core~=0.18.0
+termcolor~=2.3.0