|
|
@@ -293,6 +293,119 @@ describe("ProviderTransform.schema - gemini array items", () => {
|
|
|
})
|
|
|
})
|
|
|
|
|
|
+describe("ProviderTransform.schema - gemini nested array items", () => {
|
|
|
+ const geminiModel = {
|
|
|
+ providerID: "google",
|
|
|
+ api: {
|
|
|
+ id: "gemini-3-pro",
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+
|
|
|
+ test("adds type to 2D array with empty inner items", () => {
|
|
|
+ const schema = {
|
|
|
+ type: "object",
|
|
|
+ properties: {
|
|
|
+ values: {
|
|
|
+ type: "array",
|
|
|
+ items: {
|
|
|
+ type: "array",
|
|
|
+ items: {}, // Empty items object
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+
|
|
|
+ const result = ProviderTransform.schema(geminiModel, schema) as any
|
|
|
+
|
|
|
+ // Inner items should have a default type
|
|
|
+ expect(result.properties.values.items.items.type).toBe("string")
|
|
|
+ })
|
|
|
+
|
|
|
+ test("adds items and type to 2D array with missing inner items", () => {
|
|
|
+ const schema = {
|
|
|
+ type: "object",
|
|
|
+ properties: {
|
|
|
+ data: {
|
|
|
+ type: "array",
|
|
|
+ items: { type: "array" }, // No items at all
|
|
|
+ },
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+
|
|
|
+ const result = ProviderTransform.schema(geminiModel, schema) as any
|
|
|
+
|
|
|
+ expect(result.properties.data.items.items).toBeDefined()
|
|
|
+ expect(result.properties.data.items.items.type).toBe("string")
|
|
|
+ })
|
|
|
+
|
|
|
+ test("handles deeply nested arrays (3D)", () => {
|
|
|
+ const schema = {
|
|
|
+ type: "object",
|
|
|
+ properties: {
|
|
|
+ matrix: {
|
|
|
+ type: "array",
|
|
|
+ items: {
|
|
|
+ type: "array",
|
|
|
+ items: {
|
|
|
+ type: "array",
|
|
|
+ // No items
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+
|
|
|
+ const result = ProviderTransform.schema(geminiModel, schema) as any
|
|
|
+
|
|
|
+ expect(result.properties.matrix.items.items.items).toBeDefined()
|
|
|
+ expect(result.properties.matrix.items.items.items.type).toBe("string")
|
|
|
+ })
|
|
|
+
|
|
|
+ test("preserves existing item types in nested arrays", () => {
|
|
|
+ const schema = {
|
|
|
+ type: "object",
|
|
|
+ properties: {
|
|
|
+ numbers: {
|
|
|
+ type: "array",
|
|
|
+ items: {
|
|
|
+ type: "array",
|
|
|
+ items: { type: "number" }, // Has explicit type
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+
|
|
|
+ const result = ProviderTransform.schema(geminiModel, schema) as any
|
|
|
+
|
|
|
+ // Should preserve the explicit type
|
|
|
+ expect(result.properties.numbers.items.items.type).toBe("number")
|
|
|
+ })
|
|
|
+
|
|
|
+ test("handles mixed nested structures with objects and arrays", () => {
|
|
|
+ const schema = {
|
|
|
+ type: "object",
|
|
|
+ properties: {
|
|
|
+ spreadsheetData: {
|
|
|
+ type: "object",
|
|
|
+ properties: {
|
|
|
+ rows: {
|
|
|
+ type: "array",
|
|
|
+ items: {
|
|
|
+ type: "array",
|
|
|
+ items: {}, // Empty items
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+
|
|
|
+ const result = ProviderTransform.schema(geminiModel, schema) as any
|
|
|
+
|
|
|
+ expect(result.properties.spreadsheetData.properties.rows.items.items.type).toBe("string")
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
describe("ProviderTransform.schema - gemini non-object properties removal", () => {
|
|
|
const geminiModel = {
|
|
|
providerID: "google",
|