import sys import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import gradio as gr from browser_settings import SettingsSchema class TestBrowserSettings(unittest.TestCase): def setUp(self): with gr.Blocks(analytics_enabled=False): controls = { "model": gr.Dropdown(choices=["a", "b"], value="a"), "prompt": gr.Textbox(value="default"), "negative_prompt": gr.Textbox(value="negative"), "steps": gr.Slider(6, 60, value=8, step=1), "cfg": gr.Slider(1, 8, value=1, step=.1), "width": gr.Slider(512, 1536, value=1024, step=16), "seed": gr.Number(value=-1, precision=0), "lora1_file": gr.Dropdown(choices=["---", "valid"], value="---"), "lora1_enabled": gr.Checkbox(value=False, interactive=False), "embedding1": gr.Checkbox(value=False, interactive=False), } self.schema = SettingsSchema(controls) def test_allowlist_and_ranges(self): raw = {"model": "https://evil/model", "steps": 1000, "cfg": float("nan"), "width": 1027, "seed": 42, "token": "never stored", "embedding1": True} clean = self.schema.sanitize(raw) self.assertEqual(clean["model"], "a") self.assertEqual(clean["steps"], 8) self.assertEqual(clean["cfg"], 1) self.assertEqual(clean["width"], 1024) self.assertEqual(clean["seed"], 42) self.assertNotIn("token", clean) self.assertFalse(clean["embedding1"]) def test_exact_seed_strings(self): seed = "3952492001372691585" self.assertEqual(self.schema.sanitize({"seed": seed})["seed"], int(seed)) for value in ("no", "1e10", "18446744073709551616", "-2"): self.assertEqual(self.schema.sanitize({"seed": value})["seed"], -1) def test_prompts_opt_in_and_length(self): raw = {"prompt": "private text", "negative_prompt": "private negative"} self.assertEqual(self.schema.sanitize(raw)["prompt"], "default") self.assertEqual(self.schema.sanitize(raw, True)["prompt"], "private text") self.assertEqual(self.schema.sanitize({"prompt": "x" * 20001}, True)["prompt"], "default") def test_restored_blank_slot_and_removed_file_disabled(self): raw = {"lora1_file": "valid", "lora1_enabled": True} self.assertTrue(self.schema.sanitize(raw)["lora1_enabled"]) for name in ("---", "removed", "../other.safetensors"): raw["lora1_file"] = name clean = self.schema.sanitize(raw) self.assertEqual(clean["lora1_file"], "---") self.assertFalse(clean["lora1_enabled"]) def test_invalid_shapes_and_huge_numbers_fall_back(self): for raw in (None, [], "bad", {"seed": 10**1000, "steps": True, "model": {"url": "evil"}}): clean = self.schema.sanitize(raw) self.assertEqual(clean["seed"], -1) self.assertEqual(clean["steps"], 8) self.assertEqual(clean["model"], "a") if __name__ == "__main__": unittest.main()