import os
import unittest
from unittest.mock import patch
from mindie_motor.src.example.deploy_scripts.utils.validate_config import (
is_valid_path,
is_valid_integer,
is_valid_bool,
is_valid_str,
is_valid_mount,
PathValidationConfig
)
FILE_PATH = "filepath"
VALUE = "value"
FLAG = "flag"
NAME = "name"
MOUNTS = "mounts"
TEST_PATH = "test_path"
TEST_LINK = "test_link"
class TestValidationFunctions(unittest.TestCase):
def setUp(self):
self.test_dir = "test_dir"
self.test_file = "test_file.txt"
os.makedirs(self.test_dir, exist_ok=True)
with open(self.test_file, "w") as f:
f.write("test content")
def tearDown(self):
if os.path.exists(self.test_file):
os.remove(self.test_file)
if os.path.exists(self.test_dir):
os.rmdir(self.test_dir)
def test_is_valid_path(self):
test_path = os.path.abspath(self.test_file)
self.assertTrue(is_valid_path(TEST_PATH, test_path))
config = PathValidationConfig(allow_empty=True)
self.assertTrue(is_valid_path(TEST_PATH, "", config))
self.assertFalse(is_valid_path(TEST_PATH, ""))
self.assertFalse(is_valid_path(TEST_PATH, 123))
long_path = "/" + ("a" * 1025)
self.assertFalse(is_valid_path(TEST_PATH, long_path))
invalid_path = "test?file.txt"
self.assertFalse(is_valid_path(TEST_PATH, invalid_path))
os.symlink(self.test_file, TEST_LINK)
config = PathValidationConfig(is_support_root=False)
self.assertFalse(is_valid_path(TEST_LINK, TEST_LINK, config))
if os.path.exists(TEST_LINK):
os.remove(TEST_LINK)
self.assertFalse(is_valid_path(TEST_PATH, "nonexistent_file.txt"))
with patch("os.getuid", return_value=1000), patch("os.getgid", return_value=1000):
with patch("os.stat") as mock_stat:
mock_stat.return_value.st_uid = 2000
mock_stat.return_value.st_gid = 2000
config = PathValidationConfig(is_support_root=False)
self.assertFalse(is_valid_path(TEST_PATH, self.test_file, config))
large_file = "large_file.bin"
with open(large_file, "wb") as f:
f.write(b'\0' * (11 * 1024 * 1024))
config = PathValidationConfig(max_file_size=10 * 1024 * 1024)
self.assertFalse(is_valid_path(TEST_PATH, large_file, config))
if os.path.exists(large_file):
os.remove(large_file)
system_path = "/usr/bin/test_file"
self.assertFalse(is_valid_path(TEST_PATH, system_path))
def test_is_valid_integer(self):
is_valid_integer(VALUE, 5, min_val=1, max_val=10)
is_valid_integer(VALUE, 0, min_val=0)
is_valid_integer(VALUE, 10, max_val=10)
with self.assertRaises(ValueError):
is_valid_integer(VALUE, 15, min_val=1, max_val=10)
with self.assertRaises(TypeError):
is_valid_integer(VALUE, 3.14, min_val=1, max_val=5)
def test_is_valid_bool(self):
is_valid_bool(FLAG, True)
is_valid_bool(FLAG, False)
with self.assertRaises(TypeError):
is_valid_bool(FLAG, 1)
with self.assertRaises(TypeError):
is_valid_bool(FLAG, 'true')
def test_is_valid_str(self):
is_valid_str(NAME, 'valid_string')
is_valid_str(NAME, 'a', min_length=1)
is_valid_str(NAME, 'a' * 64, max_length=64)
with self.assertRaises(ValueError):
is_valid_str(NAME, 'a' * 65)
with self.assertRaises(ValueError):
is_valid_str(NAME, 'invalid_char!')
def test_is_valid_mount(self):
is_valid_mount(MOUNTS, {'/path1': '/path2'})
is_valid_mount(MOUNTS, {'$var': 'path'})
with self.assertRaises(ValueError):
is_valid_mount(MOUNTS, {'$var': '/invalid_value$'})
with self.assertRaises(ValueError):
is_valid_mount(MOUNTS, {'invalid_key$': ''})
with self.assertRaises(TypeError):
is_valid_mount(MOUNTS, 'invalid_input')
if __name__ == '__main__':
unittest.main()