2026-06-24 13:42:21 +02:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
import gen_rack
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def item(**kw):
|
|
|
|
|
base = {"hostname": "x", "kind": "server", "status": "in-use", "rack": "rack01"}
|
|
|
|
|
base.update(kw)
|
|
|
|
|
return base
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_accepts_valid_placement():
|
|
|
|
|
gen_rack.validate_item(item(rack_u=12, u_height=2, rack_face="front"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_rejects_u_overflow():
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.validate_item(item(rack_u=47, u_height=3, rack_face="front"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_rejects_u_below_one():
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.validate_item(item(rack_u=0, u_height=1, rack_face="front"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_rejects_bad_face():
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.validate_item(item(rack_u=1, u_height=1, rack_face="sideways"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_rejects_zero_u_with_units():
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.validate_item(item(rack_face="left", rack_u=1, u_height=1))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_accepts_zero_u_rail():
|
|
|
|
|
gen_rack.validate_item(item(rack_face="left"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_rejects_missing_units_on_faced_item():
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.validate_item(item(rack_face="front"))
|
2026-06-24 13:45:08 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_overlaps_detects_same_face_overlap():
|
|
|
|
|
items = [
|
|
|
|
|
item(hostname="a", rack_u=1, u_height=2, rack_face="front"),
|
|
|
|
|
item(hostname="b", rack_u=2, u_height=1, rack_face="front"),
|
|
|
|
|
]
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.check_overlaps(items)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_overlaps_allows_same_u_different_face():
|
|
|
|
|
items = [
|
|
|
|
|
item(hostname="a", rack_u=5, u_height=1, rack_face="front"),
|
|
|
|
|
item(hostname="b", rack_u=5, u_height=1, rack_face="rear"),
|
|
|
|
|
]
|
|
|
|
|
gen_rack.check_overlaps(items) # no raise
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_overlaps_both_face_conflicts_with_front():
|
|
|
|
|
items = [
|
|
|
|
|
item(hostname="a", rack_u=5, u_height=1, rack_face="both"),
|
|
|
|
|
item(hostname="b", rack_u=5, u_height=1, rack_face="front"),
|
|
|
|
|
]
|
|
|
|
|
with pytest.raises(gen_rack.SchemaError):
|
|
|
|
|
gen_rack.check_overlaps(items)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_overlaps_ignores_zero_u_rails():
|
|
|
|
|
items = [
|
|
|
|
|
item(hostname="p1", rack_face="left"),
|
|
|
|
|
item(hostname="p2", rack_face="left"),
|
|
|
|
|
]
|
|
|
|
|
gen_rack.check_overlaps(items) # no raise
|