|
3 | 3 | from __future__ import annotations |
4 | 4 |
|
5 | 5 | import unittest |
| 6 | +from unittest.mock import patch |
6 | 7 |
|
7 | 8 | from local_coding_slm.safety import ( |
8 | 9 | CheckResult, |
| 10 | + OFFICIAL_LIBRARY_TAGS, |
9 | 11 | classify_base_url, |
10 | 12 | classify_env_example, |
11 | 13 | classify_env_ignored, |
@@ -70,8 +72,26 @@ def test_path_or_url_fails(self) -> None: |
70 | 72 | self.assertEqual(classify_model_tag("fast", "/tmp/mystery.gguf").status, "fail") |
71 | 73 | self.assertEqual(classify_model_tag("fast", "user/trojan-finetune").status, "fail") |
72 | 74 |
|
73 | | - def test_unknown_library_name_warns(self) -> None: |
74 | | - self.assertEqual(classify_model_tag("fast", "some-random-coder:7b").status, "warn") |
| 75 | + def test_unknown_library_name_fails(self) -> None: |
| 76 | + result = classify_model_tag("fast", "some-random-coder:7b") |
| 77 | + self.assertEqual(result.status, "fail") |
| 78 | + self.assertIn("OFFICIAL_LIBRARY_TAGS", result.message) |
| 79 | + |
| 80 | + def test_official_family_unlisted_variant_fails(self) -> None: |
| 81 | + result = classify_model_tag("fast", "qwen2.5-coder:32b") |
| 82 | + self.assertEqual(result.status, "fail") |
| 83 | + self.assertNotEqual(classify_model_tag("fast", "qwen2.5-coder:7b").status, "fail") |
| 84 | + |
| 85 | + def test_allowlist_length_changes_classify_accept_reject(self) -> None: |
| 86 | + extra = "brand-new-coder:7b" |
| 87 | + self.assertEqual(classify_model_tag("fast", extra).status, "fail") |
| 88 | + lengthened = OFFICIAL_LIBRARY_TAGS | {extra} |
| 89 | + with patch("local_coding_slm.safety.OFFICIAL_LIBRARY_TAGS", lengthened): |
| 90 | + self.assertEqual(classify_model_tag("fast", extra).status, "pass") |
| 91 | + shortened = OFFICIAL_LIBRARY_TAGS - {"qwen3.5:9b"} |
| 92 | + with patch("local_coding_slm.safety.OFFICIAL_LIBRARY_TAGS", shortened): |
| 93 | + self.assertEqual(classify_model_tag("fast", "qwen3.5:9b").status, "fail") |
| 94 | + self.assertEqual(classify_model_tag("fast", "qwen3.5:9b").status, "pass") |
75 | 95 |
|
76 | 96 | def test_empty_fails(self) -> None: |
77 | 97 | self.assertEqual(classify_model_tag("fast", " ").status, "fail") |
@@ -134,6 +154,22 @@ def test_safe_deployment_no_fail(self) -> None: |
134 | 154 | ) |
135 | 155 | self.assertEqual(worst_status(results), "pass") |
136 | 156 |
|
| 157 | + def test_unofficial_library_tag_fails_run_checks(self) -> None: |
| 158 | + results = run_checks( |
| 159 | + environ={ |
| 160 | + "OLLAMA_BASE_URL": "http://127.0.0.1:11434", |
| 161 | + "OLLAMA_FAST_MODEL": "some-random-coder:7b", |
| 162 | + "OLLAMA_STRONG_MODEL": "devstral-small-2", |
| 163 | + }, |
| 164 | + skip_listen=True, |
| 165 | + tracked=[], |
| 166 | + env_ignored=True, |
| 167 | + env_example_text="OLLAMA_BASE_URL=http://127.0.0.1:11434\n", |
| 168 | + ) |
| 169 | + self.assertEqual(worst_status(results), "fail") |
| 170 | + names = {item.name: item for item in results} |
| 171 | + self.assertEqual(names["OLLAMA_FAST_MODEL"].status, "fail") |
| 172 | + |
137 | 173 | def test_trojan_shaped_tag_fails(self) -> None: |
138 | 174 | results = run_checks( |
139 | 175 | environ={ |
|
0 commit comments