import importlib.util
import json
import tempfile
import unittest
from pathlib import Path
MODULE_PATH = Path(__file__).resolve().parent.parent / "tools" / "lmstudio" / "wrapper_generator.py"
if MODULE_PATH.exists():
spec = importlib.util.spec_from_file_location("wrapper_generator", MODULE_PATH)
module = importlib.util.module_from_spec(spec)
assert spec is not None and spec.loader is not None
spec.loader.exec_module(module)
gen = module
else: # pragma: no cover
gen = None
class WrapperGeneratorTests(unittest.TestCase):
def setUp(self):
if gen is None:
self.fail("tools.lmstudio.wrapper_generator is not available")
self.official_model_yaml = """\
model: qwen/qwen3.6-35b-a3b
base:
- key: lmstudio-community/qwen3.6-35b-a3b-gguf
metadataOverrides:
domain: llm
architectures:
- qwen35moe
compatibilityTypes:
- gguf
reasoning: true
config:
operation:
fields:
- key: llm.prediction.promptTemplate
value:
type: jinja
jinjaPromptTemplate:
template: |
{%- if add_generation_prompt %}
{%- if enable_thinking is defined and enable_thinking is false %}
{{- '\\n\\n\\n\\n' }}
{%- else %}
{{- '\\n' }}
{%- endif %}
{%- endif %}
customFields:
- key: enableThinking
effects:
- type: setJinjaVariable
variable: enable_thinking
- key: preserveThinking
effects:
- type: setJinjaVariable
variable: preserve_thinking
"""
self.official_manifest = {
"type": "model",
"owner": "qwen",
"name": "qwen3.6-35b-a3b",
"dependencies": [
{
"type": "model",
"purpose": "baseModel",
"modelKeys": ["lmstudio-community/qwen3.6-35b-a3b-gguf"],
}
],
"revision": 1,
}
def test_build_wrapper_files_contains_reasoning_and_target_key(self):
result = gen.build_wrapper_files(
target_model_key="qwen3.6-35b-a3b-uncensored-hauhaucs-aggressive",
wrapper_owner="local",
wrapper_name="qwen3.6-35b-a3b-hauhaucs-aggressive",
official_model_yaml_text=self.official_model_yaml,
official_manifest=self.official_manifest,
)
self.assertIn("reasoning: true", result["model.yaml"])
self.assertIn("key: enableThinking", result["model.yaml"])
self.assertIn("key: preserveThinking", result["model.yaml"])
self.assertIn(
"qwen3.6-35b-a3b-uncensored-hauhaucs-aggressive",
result["model.yaml"],
)
manifest = json.loads(result["manifest.json"])
self.assertEqual(manifest["owner"], "local")
self.assertEqual(manifest["name"], "qwen3.6-35b-a3b-hauhaucs-aggressive")
self.assertEqual(
manifest["dependencies"][0]["modelKeys"],
["qwen3.6-35b-a3b-uncensored-hauhaucs-aggressive"],
)
def test_dry_run_does_not_write_output(self):
with tempfile.TemporaryDirectory() as tmpdir:
output_dir = Path(tmpdir) / "wrapper"
summary = gen.generate_wrapper(
output_dir=output_dir,
target_model_key="qwen3.6-35b-a3b-uncensored-hauhaucs-aggressive",
wrapper_owner="local",
wrapper_name="qwen3.6-35b-a3b-hauhaucs-aggressive",
official_model_yaml_text=self.official_model_yaml,
official_manifest=self.official_manifest,
dry_run=True,
)
self.assertFalse(output_dir.exists())
self.assertTrue(summary["dry_run"])
self.assertIn("model.yaml", summary["files"])
self.assertIn("manifest.json", summary["files"])
self.assertIn("README.md", summary["files"])
if __name__ == "__main__":
unittest.main()