import { parseApplyLayerStylePayload } from "./toolCallStyleHelpers"; import { createDefaultLayerStyleState } from "@components/olmap/core/Controls/styleEditorPresets"; import { validateStyleConfig } from "@components/olmap/core/Controls/styleEditorUtils"; describe("parseApplyLayerStylePayload", () => { it("accepts a valid snake_case interval contract", () => { expect( parseApplyLayerStylePayload({ layer_id: "pipes", style_config: { property: "velocity", classification_method: "custom_breaks", segments: 3, custom_breaks: [0, 1, 2, 3], color_type: "custom", custom_colors: ["#000000", "#777777", "#ffffff"], }, }), ).toMatchObject({ layerId: "pipes", resetToDefault: false, styleConfig: { segments: 3, customBreaks: [0, 1, 2, 3] }, }); }); it("rejects invalid class counts and array cardinalities", () => { expect( parseApplyLayerStylePayload({ layer_id: "pipes", style_config: { segments: 1, property: "velocity" }, }), ).toBeNull(); expect( parseApplyLayerStylePayload({ layer_id: "junctions", style_config: { segments: 3, custom_breaks: [0, 1, 2], }, }), ).toBeNull(); }); it("keeps camelCase compatibility", () => { expect( parseApplyLayerStylePayload({ layerId: "junctions", styleConfig: { opacity: 0.5, colorType: "gradient" }, }), ).toMatchObject({ layerId: "junctions", styleConfig: { opacity: 0.5 } }); }); it("preserves default palette indexes when only some style fields are provided", () => { const payload = parseApplyLayerStylePayload({ layer_id: "pipes", style_config: { property: "flow", color_type: "gradient" }, }); expect(payload).not.toBeNull(); const merged = { ...createDefaultLayerStyleState("pipes").styleConfig, ...payload?.styleConfig, }; expect(validateStyleConfig(merged)).toEqual({ valid: true, errors: [] }); }); });