/*
Unit tests for resolve field path covering its documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-1311: Compass header sweep — declares the resolve suite's contract for test-file scaffold coverage.
*/
import { test, expect } from "vitest";
import { resolveFieldPath } from "../resolve-field-path.ts";
test("resolveFieldPath resolves shallow field", () => {
const result = resolveFieldPath({ companyName: "Warpgogol" }, ["companyName"]);
expect(result.missingField).toBe(null);
expect(result.value).toBe("Warpgogol");
});
test("resolveFieldPath resolves nested field", () => {
const data = { owner: { address: { street: "Main St" } } };
const result = resolveFieldPath(data, ["owner", "address", "street"]);
expect(result.missingField).toBe(null);
expect(result.value).toBe("Main St");
});
test("resolveFieldPath reports the next field after a missing intermediate", () => {
const data = { owner: { fullName: "Alice" } };
const result = resolveFieldPath(data, ["owner", "address", "street"]);
expect(result.missingField).toBe("street");
});
test("resolveFieldPath does not report missing leaf field on last step (matches original behavior)", () => {
const result = resolveFieldPath({}, ["companyName"]);
expect(result.missingField).toBe(null);
expect(result.value).toBe(undefined);
});
test("resolveFieldPath handles null intermediate value", () => {
const data = { owner: null };
const result = resolveFieldPath(data, ["owner", "address"]);
expect(result.missingField).toBe("address");
});
test("resolveFieldPath handles undefined intermediate value", () => {
const data = { owner: undefined };
const result = resolveFieldPath(data, ["owner", "address"]);
expect(result.missingField).toBe("address");
});
test("resolveFieldPath handles numeric array indices", () => {
const data = { items: [{ name: "first" }, { name: "second" }] };
const result = resolveFieldPath(data, ["items", "1", "name"]);
expect(result.missingField).toBe(null);
expect(result.value).toBe("second");
});
test("resolveFieldPath reports next field after out-of-bounds array index", () => {
const data = { items: [{ name: "first" }] };
const result = resolveFieldPath(data, ["items", "5", "name"]);
expect(result.missingField).toBe("name");
});