Coverage for backend/core/testing/AhuoraServerTestCase.py: 100%
22 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
1from django.core.servers.basehttp import WSGIRequestHandler
2from django.test import LiveServerTestCase
3from django.test.testcases import LiveServerThread, QuietWSGIRequestHandler
6class ResusableLiveServerThread(LiveServerThread):
7 """
8 This miniclass overrides _create_server to allow port reuse. This avoids creating
9 "address already in use" errors for tests that have been run subsequently.
10 """
12 def _create_server(self, connections_override=None):
13 return self.server_class(
14 (self.host, self.port),
15 WSGIRequestHandler,
16 allow_reuse_address=True,
17 connections_override=connections_override,
18 )
20class AhuoraServerTestCase(LiveServerTestCase):
21 host = "0.0.0.0"
22 port = 8000
23 server_thread_class = ResusableLiveServerThread
25 def assertJsonAlmostEqual(self, obj1, obj2, places=7):
26 """Recursively compare JSON-like structures with float tolerance."""
27 if isinstance(obj1, dict) and isinstance(obj2, dict):
28 self.assertEqual(set(obj1.keys()), set(obj2.keys()), msg="Dict keys mismatch")
29 for key in obj1:
30 self.assertJsonAlmostEqual(obj1[key], obj2[key], places)
31 elif isinstance(obj1, list) and isinstance(obj2, list):
32 self.assertEqual(len(obj1), len(obj2), msg="List lengths differ")
33 for a, b in zip(obj1, obj2):
34 self.assertJsonAlmostEqual(a, b, places)
35 elif isinstance(obj1, float) or isinstance(obj2, float):
36 self.assertAlmostEqual(obj1, obj2, places=places)
37 else:
38 self.assertEqual(obj1, obj2)