import { describe, expect, it } from '@jest/globals';
import { z } from 'zod';
import { ZAIProvider } from '../../../src/ai-providers/zai.js';
describe('ZAIProvider - Schema Introspection', () => {
const provider = new ZAIProvider();
it('should find array property in schema with single array', () => {
const schema = z.object({
subtasks: z.array(z.string()),
metadata: z.object({ count: z.number() }).nullable()
});
const result = provider.findArrayPropertyInSchema(schema);
expect(result).toBe('subtasks');
});
it('should find first array property when multiple arrays exist', () => {
const schema = z.object({
tasks: z.array(z.string()),
items: z.array(z.number())
});
const result = provider.findArrayPropertyInSchema(schema);
expect(result).toBe('tasks');
});
it('should handle schema with no arrays', () => {
const schema = z.object({
name: z.string(),
count: z.number()
});
const result = provider.findArrayPropertyInSchema(schema);
expect(result).toBeNull();
});
it('should handle non-object schemas gracefully', () => {
const schema = z.array(z.string());
const result = provider.findArrayPropertyInSchema(schema);
expect(result).toBeNull();
});
it('should find complexityAnalysis array property', () => {
const schema = z.object({
complexityAnalysis: z.array(
z.object({
taskId: z.number(),
score: z.number()
})
),
metadata: z
.union([z.object({ total: z.number() }), z.null()])
.default(null)
});
const result = provider.findArrayPropertyInSchema(schema);
expect(result).toBe('complexityAnalysis');
});
it('should work with actual PRD response schema', () => {
const schema = z.object({
tasks: z.array(
z.object({
id: z.number(),
title: z.string()
})
),
metadata: z
.union([
z.object({
projectName: z.string(),
totalTasks: z.number()
}),
z.null()
])
.default(null)
});
const result = provider.findArrayPropertyInSchema(schema);
expect(result).toBe('tasks');
});
});