"""Tests for the lightweight glTF metadata extraction service.""" import json import struct import pytest from app.services.gltf import ( extract_gltf_metadata, looks_like_gltf, _parse_glb, _parse_gltf_json, ) # --------------------------------------------------------------------------- # Test data helpers # --------------------------------------------------------------------------- def _make_gltf_json( meshes: int = 1, vertices_per_mesh: int = 24, has_animations: bool = False, images: list[dict] | None = None, ) -> dict: """Build a minimal glTF JSON structure.""" accessors = [] meshes_data = [] for i in range(meshes): acc_index = len(accessors) accessors.append({ "bufferView": 0, "componentType": 5126, # FLOAT "count": vertices_per_mesh, "type": "VEC3", "max": [1.0, 1.0, 1.0], "min": [-1.0, -1.0, -1.0], }) meshes_data.append({ "primitives": [{ "attributes": {"POSITION": acc_index}, }], }) gltf = { "asset": {"version": "2.0"}, "accessors": accessors, "meshes": meshes_data, } if has_animations: gltf["animations"] = [{"name": "anim1", "channels": [], "samplers": []}] if images: gltf["images"] = images return gltf def _make_glb(gltf_json: dict) -> bytes: """Wrap *gltf_json* in a minimal GLB binary container.""" json_bytes = json.dumps(gltf_json).encode("utf-8") json_length = len(json_bytes) # Pad JSON chunk to 4-byte boundary. json_padding = (4 - json_length % 4) % 4 json_chunk = json_bytes + b"\x00" * json_padding json_chunk_type = 0x4E4F534A # "JSON" # No BIN chunk. bin_length = 0 bin_chunk_type = 0x004E4942 total_length = 12 + 8 + len(json_chunk) + 8 + bin_length header = struct.pack(" 0: bin_header = struct.pack("