| """Tests for LoRA merge helper tooling.""" |
|
|
| from __future__ import annotations |
|
|
| import json |
| import tempfile |
| import unittest |
| from pathlib import Path |
|
|
| from scripts.merge_lora_adapter import plan_merge, validate_adapter_source |
|
|
|
|
| class MergeLoraAdapterTest(unittest.TestCase): |
| def test_validate_local_adapter_requires_config_and_weights(self) -> None: |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| adapter_dir = Path(tmp_dir) |
| (adapter_dir / "adapter_config.json").write_text("{}", encoding="utf-8") |
|
|
| with self.assertRaises(ValueError): |
| validate_adapter_source(adapter_dir, base_model="Qwen/Qwen2.5-1.5B-Instruct") |
|
|
| def test_plan_merge_dry_run_returns_summary_without_loading_model(self) -> None: |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| adapter_dir = Path(tmp_dir) / "adapter" |
| adapter_dir.mkdir() |
| (adapter_dir / "adapter_config.json").write_text( |
| json.dumps({"base_model_name_or_path": "Qwen/Qwen2.5-1.5B-Instruct"}), |
| encoding="utf-8", |
| ) |
| (adapter_dir / "adapter_model.safetensors").write_text("fake", encoding="utf-8") |
|
|
| summary = plan_merge( |
| base_model="Qwen/Qwen2.5-1.5B-Instruct", |
| adapter=adapter_dir, |
| output=Path(tmp_dir) / "merged", |
| dry_run=True, |
| ) |
|
|
| self.assertTrue(summary["dry_run"]) |
| self.assertFalse(summary["merged"]) |
| self.assertEqual(summary["base_model"], "Qwen/Qwen2.5-1.5B-Instruct") |
| self.assertEqual(summary["adapter_type"], "local") |
|
|
|
|
| if __name__ == "__main__": |
| unittest.main() |
|
|