"""Tests for ModelsSamplingNode.""" import json import struct import pytest from mp_nodes.models_sampling import ModelsSamplingNode def run(mode, **kwargs): return ModelsSamplingNode().process(mode=mode, theme="(use pack default)", **kwargs) def _make_safetensors(tmp_path, name, metadata=None, tensor_keys=None): """Create a minimal valid safetensors file with the given metadata block.""" header = {} if metadata is not None: header["__metadata__"] = metadata for k in tensor_keys or []: header[k] = {"dtype": "F32", "shape": [1], "data_offsets": [0, 4]} header_bytes = json.dumps(header).encode("utf-8") # Pad to 8-byte alignment pad = (8 - len(header_bytes) % 8) % 8 header_bytes += b" " * pad body = b"\x00\x00\x00\x00" * len(tensor_keys or []) path = tmp_path / name with open(path, "wb") as f: f.write(struct.pack("= 2 assert info["history"][-1] == 2 class TestSampling: def test_sampler_pick(self): assert run("sampler_pick", sampler="euler")[4] == "euler" def test_scheduler_pick(self): assert run("scheduler_pick", scheduler="karras")[3] == "karras" def test_sampler_params_bundle(self): out = run("sampler_params_bundle", sampler="dpmpp_2m", scheduler="karras", steps=30, cfg=8.0, denoise=0.8) assert out[7] == 8.0 # cfg as FLOAT bundle = out[8] assert bundle["sampler"] == "dpmpp_2m" assert bundle["scheduler"] == "karras" assert bundle["steps"] == 30 assert bundle["denoise"] == 0.8 class TestOpaqueOutputs: """ModelsSamplingNode has MODEL/CLIP/VAE in RETURN_TYPES. None of our ops fill them. Verify they pad to None (not raise).""" def test_unfilled_opaque_outputs_are_none(self): out = run("sampler_pick", sampler="euler") # MODEL/CLIP/VAE are at indices 0, 1, 2 assert out[0] is None assert out[1] is None assert out[2] is None