Skip to content

Commit d72757e

Browse files
committed
tests: refactor web/exec tests
Factorize reference testing database validation logic in TestRacksDBReferenceDB common abstract class.
1 parent db5b998 commit d72757e

File tree

3 files changed

+98
-140
lines changed

3 files changed

+98
-140
lines changed

Diff for: racksdb/tests/lib/reference.py

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Copyright (c) 2025 Rackslab
2+
#
3+
# This file is part of RacksDB.
4+
#
5+
# SPDX-License-Identifier: GPL-3.0-or-later
6+
7+
import unittest
8+
9+
# Expected values from testing reference DB.
10+
REFDB_DATACENTERS = ["paris", "london"]
11+
REFDB_INFRASTRUCTURES = ["mercury", "jupiter", "sharednet"]
12+
REFDB_TOTAL_NODES = 130
13+
14+
15+
class TestRacksDBReferenceDB(unittest.TestCase):
16+
"""Abstract TestCase class with method to validate data from testing reference
17+
database."""
18+
19+
def assertDatacentersResponse(self, content):
20+
self.assertIsInstance(content, list)
21+
self.assertEqual(len(content), 2)
22+
self.assertCountEqual(
23+
[datacenter["name"] for datacenter in content], REFDB_DATACENTERS
24+
)
25+
self.assertIsInstance(content[0], dict)
26+
# tags key is optional, it may not be present in selected datacenter.
27+
for key in ["name", "rooms", "location"]:
28+
self.assertIn(
29+
key,
30+
content[0],
31+
)
32+
33+
def assertInfrastructuresResponse(self, content):
34+
self.assertIsInstance(content, list)
35+
self.assertEqual(len(content), 3)
36+
self.assertCountEqual(
37+
[infrastructure["name"] for infrastructure in content],
38+
REFDB_INFRASTRUCTURES,
39+
)
40+
self.assertIsInstance(content[0], dict)
41+
# tags key is optional, it may not be present in selected infrastructure.
42+
for key in ["name", "description", "layout"]:
43+
self.assertIn(
44+
key,
45+
content[0],
46+
)
47+
48+
def assertNodesResponse(self, content):
49+
self.assertIsInstance(content, list)
50+
self.assertEqual(len(content), 130)
51+
self.assertIsInstance(content[0], dict)
52+
self.assertCountEqual(
53+
content[0].keys(),
54+
["name", "infrastructure", "rack", "type", "slot", "tags", "position"],
55+
)
56+
57+
def assertRacksResponse(self, content):
58+
self.assertIsInstance(content, list)
59+
self.assertEqual(len(content), 101)
60+
self.assertIsInstance(content[0], dict)
61+
# tags key is optional, it may not be present in select rack.
62+
for key in [
63+
"name",
64+
"slot",
65+
"type",
66+
"datacenter",
67+
"room",
68+
"row",
69+
"nodes",
70+
"fillrate",
71+
]:
72+
self.assertIn(
73+
key,
74+
content[0].keys(),
75+
)

Diff for: racksdb/tests/test_exec.py

+11-68
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#
55
# SPDX-License-Identifier: GPL-3.0-or-later
66

7-
import unittest
87
from unittest import mock
98
import io
109
import tempfile
@@ -20,17 +19,19 @@
2019
from racksdb.version import get_version
2120

2221
from .lib.common import schema_path, db_path, drawing_schema_path
22+
from .lib.reference import (
23+
TestRacksDBReferenceDB,
24+
REFDB_INFRASTRUCTURES,
25+
REFDB_DATACENTERS,
26+
REFDB_TOTAL_NODES,
27+
)
2328

24-
# Expected values from example DB.
25-
EXAMPLE_DATACENTERS = ["paris", "london"]
26-
EXAMPLE_INFRASTRUCTURES = ["mercury", "jupiter", "sharednet"]
27-
EXAMPLE_TOTAL_NODES = 130
2829

2930
CMD_BASE_ARGS = ["--schema", str(schema_path()), "--db", str(db_path())]
3031
CMD_DRAW_BASE_ARGS = ["draw", "--drawings-schema", str(drawing_schema_path())]
3132

3233

33-
class TestRacksDBExec(unittest.TestCase):
34+
class TestRacksDBExec(TestRacksDBReferenceDB):
3435
def test_version(self):
3536
for option in ["-v", "--version"]:
3637
with mock.patch("sys.stdout", new=io.StringIO()) as output:
@@ -70,20 +71,6 @@ def test_schema(self):
7071
# datacenters
7172
#
7273

73-
def assertDatacentersResponse(self, content):
74-
self.assertIsInstance(content, list)
75-
self.assertEqual(len(content), 2)
76-
self.assertCountEqual(
77-
[datacenter["name"] for datacenter in content], EXAMPLE_DATACENTERS
78-
)
79-
self.assertIsInstance(content[0], dict)
80-
# tags key is optional, it may not be present in selected datacenter.
81-
for key in ["name", "rooms", "location"]:
82-
self.assertIn(
83-
key,
84-
content[0],
85-
)
86-
8774
def test_datacenters(self):
8875
with mock.patch("sys.stdout", new=io.StringIO()) as output:
8976
RacksDBExec(CMD_BASE_ARGS + ["datacenters"])
@@ -111,7 +98,7 @@ def test_datacenters_list(self):
11198
]
11299
)
113100
self.assertCountEqual(
114-
output.getvalue().strip().split("\n"), EXAMPLE_DATACENTERS
101+
output.getvalue().strip().split("\n"), REFDB_DATACENTERS
115102
)
116103

117104
def test_datacenters_not_found(self):
@@ -130,21 +117,6 @@ def test_datacenters_not_found(self):
130117
# infrastructures
131118
#
132119

133-
def assertInfrastructuresResponse(self, content):
134-
self.assertIsInstance(content, list)
135-
self.assertEqual(len(content), 3)
136-
self.assertCountEqual(
137-
[infrastructure["name"] for infrastructure in content],
138-
EXAMPLE_INFRASTRUCTURES,
139-
)
140-
self.assertIsInstance(content[0], dict)
141-
# tags key is optional, it may not be present in selected infrastructure.
142-
for key in ["name", "description", "layout"]:
143-
self.assertIn(
144-
key,
145-
content[0],
146-
)
147-
148120
def test_infrastructures(self):
149121
with mock.patch("sys.stdout", new=io.StringIO()) as output:
150122
RacksDBExec(
@@ -177,7 +149,7 @@ def test_infrastructure_list(self):
177149
]
178150
)
179151
self.assertCountEqual(
180-
output.getvalue().strip().split("\n"), EXAMPLE_INFRASTRUCTURES
152+
output.getvalue().strip().split("\n"), REFDB_INFRASTRUCTURES
181153
)
182154

183155
def test_infrastructure_not_found(self):
@@ -196,15 +168,6 @@ def test_infrastructure_not_found(self):
196168
# nodes
197169
#
198170

199-
def assertNodesResponse(self, content):
200-
self.assertIsInstance(content, list)
201-
self.assertEqual(len(content), EXAMPLE_TOTAL_NODES)
202-
self.assertIsInstance(content[0], dict)
203-
self.assertCountEqual(
204-
content[0].keys(),
205-
["name", "infrastructure", "rack", "type", "slot", "tags", "position"],
206-
)
207-
208171
def test_nodes(self):
209172
with mock.patch("sys.stdout", new=io.StringIO()) as output:
210173
RacksDBExec(
@@ -237,7 +200,7 @@ def test_nodes_list(self):
237200
]
238201
)
239202
self.assertEqual(
240-
len(output.getvalue().strip().split("\n")), EXAMPLE_TOTAL_NODES
203+
len(output.getvalue().strip().split("\n")), REFDB_TOTAL_NODES
241204
)
242205

243206
def test_nodes_name(self):
@@ -279,7 +242,7 @@ def test_nodes_tags(self):
279242
)
280243
nodes = yaml.safe_load(output.getvalue())
281244
self.assertIsInstance(nodes, list)
282-
self.assertLess(len(nodes), EXAMPLE_TOTAL_NODES)
245+
self.assertLess(len(nodes), REFDB_TOTAL_NODES)
283246

284247
def test_nodes_multiple_tags(self):
285248
# Check less nodes are selected with multiple tags than with only one tag.
@@ -333,26 +296,6 @@ def test_nodes_fold(self):
333296
# racks
334297
#
335298

336-
def assertRacksResponse(self, content):
337-
self.assertIsInstance(content, list)
338-
self.assertEqual(len(content), 101)
339-
self.assertIsInstance(content[0], dict)
340-
# tags key is optional, it may not be present in select rack.
341-
for key in [
342-
"name",
343-
"slot",
344-
"type",
345-
"datacenter",
346-
"room",
347-
"row",
348-
"nodes",
349-
"fillrate",
350-
]:
351-
self.assertIn(
352-
key,
353-
content[0].keys(),
354-
)
355-
356299
def test_racks(self):
357300
with mock.patch("sys.stdout", new=io.StringIO()) as output:
358301
RacksDBExec(

Diff for: racksdb/tests/web/test_blueprint.py

+12-72
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#
55
# SPDX-License-Identifier: GPL-3.0-or-later
66

7-
import unittest
87
import tempfile
98
import json
109
import parameterized
@@ -20,10 +19,11 @@
2019

2120
from ..lib.web import RacksDBCustomTestResponse
2221
from ..lib.common import schema_path, db_path, drawing_schema_path
23-
24-
# Expected values from example DB.
25-
EXAMPLE_DATACENTERS = ["paris", "london"]
26-
EXAMPLE_INFRASTRUCTURES = ["mercury", "jupiter", "sharednet"]
22+
from ..lib.reference import (
23+
TestRacksDBReferenceDB,
24+
REFDB_DATACENTERS,
25+
REFDB_INFRASTRUCTURES,
26+
)
2727

2828

2929
class FakeRacksDBWebApp(flask.Flask):
@@ -38,7 +38,7 @@ def __init__(self, schema, db, drawing_schema, openapi):
3838
self.register_blueprint(self.blueprint)
3939

4040

41-
class TestRacksDBWebBlueprint(unittest.TestCase):
41+
class TestRacksDBWebBlueprint(TestRacksDBReferenceDB):
4242
def setUp(self):
4343
try:
4444
self.schema_path = schema_path()
@@ -120,26 +120,10 @@ def test_schema(self):
120120
tmp.write(response.text)
121121
RacksDB.load(schema=tmp.name, db=self.db_path)
122122

123-
# test schema
124-
125123
#
126124
# datacenters
127125
#
128126

129-
def assertDatacentersResponse(self, content):
130-
self.assertIsInstance(content, list)
131-
self.assertEqual(len(content), 2)
132-
self.assertCountEqual(
133-
[datacenter["name"] for datacenter in content], EXAMPLE_DATACENTERS
134-
)
135-
self.assertIsInstance(content[0], dict)
136-
# tags key is optional, it may not be present in selected datacenter.
137-
for key in ["name", "rooms", "location"]:
138-
self.assertIn(
139-
key,
140-
content[0],
141-
)
142-
143127
def test_datacenters(self):
144128
response = self.client.get(f"/v{get_version()}/datacenters")
145129
self.assertEqual(response.status_code, 200)
@@ -157,17 +141,17 @@ def test_datacenters_list(self):
157141
self.assertEqual(response.status_code, 200)
158142
self.assertEqual(response.mimetype, "application/json")
159143
self.assertIsInstance(response.json, list)
160-
self.assertCountEqual(response.json, EXAMPLE_DATACENTERS)
144+
self.assertCountEqual(response.json, REFDB_DATACENTERS)
161145

162146
def test_datacenters_name(self):
163147
response = self.client.get(
164-
f"/v{get_version()}/datacenters?name={EXAMPLE_DATACENTERS[0]}"
148+
f"/v{get_version()}/datacenters?name={REFDB_DATACENTERS[0]}"
165149
)
166150
self.assertEqual(response.status_code, 200)
167151
self.assertEqual(response.mimetype, "application/json")
168152
self.assertIsInstance(response.json, list)
169153
self.assertEqual(len(response.json), 1)
170-
self.assertCountEqual(response.json[0]["name"], EXAMPLE_DATACENTERS[0])
154+
self.assertCountEqual(response.json[0]["name"], REFDB_DATACENTERS[0])
171155

172156
def test_datacenters_name_not_found(self):
173157
response = self.client.get(f"/v{get_version()}/datacenters?name=fail")
@@ -216,21 +200,6 @@ def test_datacenters_fold(self):
216200
# infrastructures
217201
#
218202

219-
def assertInfrastructuresResponse(self, content):
220-
self.assertIsInstance(content, list)
221-
self.assertEqual(len(content), 3)
222-
self.assertCountEqual(
223-
[infrastructure["name"] for infrastructure in content],
224-
EXAMPLE_INFRASTRUCTURES,
225-
)
226-
self.assertIsInstance(content[0], dict)
227-
# tags key is optional, it may not be present in selected infrastructure.
228-
for key in ["name", "description", "layout"]:
229-
self.assertIn(
230-
key,
231-
content[0],
232-
)
233-
234203
def test_infrastructures(self):
235204
response = self.client.get(f"/v{get_version()}/infrastructures")
236205
self.assertEqual(response.status_code, 200)
@@ -248,16 +217,16 @@ def test_infrastructures_list(self):
248217
self.assertEqual(response.status_code, 200)
249218
self.assertEqual(response.mimetype, "application/json")
250219
self.assertIsInstance(response.json, list)
251-
self.assertCountEqual(response.json, EXAMPLE_INFRASTRUCTURES)
220+
self.assertCountEqual(response.json, REFDB_INFRASTRUCTURES)
252221

253222
def test_infrastructures_name(self):
254223
response = self.client.get(
255-
f"/v{get_version()}/infrastructures?name={EXAMPLE_INFRASTRUCTURES[0]}"
224+
f"/v{get_version()}/infrastructures?name={REFDB_INFRASTRUCTURES[0]}"
256225
)
257226
self.assertEqual(response.status_code, 200)
258227
self.assertEqual(response.mimetype, "application/json")
259228
self.assertIsInstance(response.json, list)
260-
self.assertEqual(response.json[0]["name"], EXAMPLE_INFRASTRUCTURES[0])
229+
self.assertEqual(response.json[0]["name"], REFDB_INFRASTRUCTURES[0])
261230

262231
def test_infrastructures_name_not_found(self):
263232
response = self.client.get(f"/v{get_version()}/infrastructures?name=fail")
@@ -321,15 +290,6 @@ def test_infrastructures_fold(self):
321290
# nodes
322291
#
323292

324-
def assertNodesResponse(self, content):
325-
self.assertIsInstance(content, list)
326-
self.assertEqual(len(content), 130)
327-
self.assertIsInstance(content[0], dict)
328-
self.assertCountEqual(
329-
content[0].keys(),
330-
["name", "infrastructure", "rack", "type", "slot", "tags", "position"],
331-
)
332-
333293
def test_nodes(self):
334294
response = self.client.get(f"/v{get_version()}/nodes")
335295
self.assertEqual(response.status_code, 200)
@@ -438,26 +398,6 @@ def test_nodes_infrastructure_not_found(self):
438398
# racks
439399
#
440400

441-
def assertRacksResponse(self, content):
442-
self.assertIsInstance(content, list)
443-
self.assertEqual(len(content), 101)
444-
self.assertIsInstance(content[0], dict)
445-
# tags key is optional, it may not be present in select rack.
446-
for key in [
447-
"name",
448-
"slot",
449-
"type",
450-
"datacenter",
451-
"room",
452-
"row",
453-
"nodes",
454-
"fillrate",
455-
]:
456-
self.assertIn(
457-
key,
458-
content[0].keys(),
459-
)
460-
461401
def test_racks(self):
462402
response = self.client.get(f"/v{get_version()}/racks")
463403
self.assertEqual(response.status_code, 200)

0 commit comments

Comments
 (0)