from __future__ import annotations import unittest from uvm.errors import ValidationError from uvm.validation import parse_cpu, parse_password, parse_ram, parse_username class ValidationTests(unittest.TestCase): def test_parse_ram_uses_mib_by_default(self) -> None: self.assertEqual(parse_ram("512"), 512) self.assertEqual(parse_ram("1G"), 1024) self.assertEqual(parse_ram("512MiB"), 512) self.assertEqual(parse_ram("134217728B"), 128) def test_parse_ram_rejects_small_and_invalid_values(self) -> None: for value in ("127M", "nonsense", "-1G", "1T"): with self.subTest(value=value): with self.assertRaises(ValidationError): parse_ram(value) def test_parse_cpu_requires_a_positive_finite_value(self) -> None: self.assertEqual(parse_cpu("0.5"), 0.5) for value in ("0", "-1", "nan", "inf", "cpu"): with self.subTest(value=value): with self.assertRaises(ValidationError): parse_cpu(value) def test_guest_username_is_validated(self) -> None: self.assertEqual(parse_username("root"), "root") self.assertEqual(parse_username("app-user"), "app-user") for value in ("", "Root", "9user", "user name", "a" * 33): with self.subTest(value=value): with self.assertRaises(ValidationError): parse_username(value) def test_guest_password_rejects_empty_control_or_oversized_values(self) -> None: self.assertEqual( parse_password("correct horse battery staple"), "correct horse battery staple", ) for value in ("", "line\nbreak", "tab\tvalue", "a" * 129): with self.subTest(value=value): with self.assertRaises(ValidationError): parse_password(value)