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")) 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