---
phase: 22-generate-node-dynamic-input-tests
plan: 01
type: execute
---
Add comprehensive tests for dynamic input handling in generate nodes, covering schema-driven handle rendering, ModelParameters component, and input validation.
Purpose: Ensure generate nodes correctly render dynamic inputs from provider schemas and pass validated inputs to API calls.
Output: Complete test coverage for dynamic input flows in GenerateImageNode, GenerateVideoNode, and ModelParameters.
~/.claude/get-shit-done/workflows/execute-phase.md
~/.claude/get-shit-done/templates/summary.md
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
**Existing test files to extend:**
@src/components/__tests__/GenerateImageNode.test.tsx
@src/components/__tests__/GenerateVideoNode.test.tsx
**Component being tested:**
@src/components/nodes/GenerateImageNode.tsx (lines 464-580 for dynamic handles)
@src/components/nodes/GenerateVideoNode.tsx
@src/components/nodes/ModelParameters.tsx
**Prior Phase Summary (provides test patterns):**
@.planning/phases/17-component-tests/17-03-SUMMARY.md
**Tech stack available:** Vitest, React Testing Library, ReactFlowProvider wrapper
**Established patterns:** Zustand store mocking, fetch mocking, createPortal mocking for modals
**Constraining decisions:**
- Phase 17: ReactFlowProvider wrapper for component tests using @xyflow/react hooks
- Phase 17: Zustand store mocking with vi.mock pattern returning mocked functions
- Phase 18: API payload tests for dynamicInputs already covered in route tests
Task 1: Add ModelParameters component tests
src/components/__tests__/ModelParameters.test.tsx
Create comprehensive tests for ModelParameters component:
**Schema Loading:**
- Should fetch schema when modelId and non-gemini provider are set
- Should not fetch schema for gemini provider
- Should not fetch schema when modelId is empty
- Should call onInputsLoaded with inputs from schema response
- Should handle fetch errors gracefully
- Should show loading state while fetching
**Parameter Handling:**
- Should render parameter inputs based on schema
- Should call onParametersChange when parameter value changes
- Should remove parameter from object when value is cleared
- Should render number inputs for integer/number types
- Should render select inputs for enum types
- Should render boolean toggle for boolean types
**Collapse/Expand:**
- Should call onExpandChange when toggled
- Should start expanded by default
- Should show parameter count in header
Mock fetch for schema endpoint:
```typescript
mockFetch.mockResolvedValueOnce({
ok: true,
json: () => Promise.resolve({
parameters: [
{ name: "seed", type: "integer", description: "Random seed" },
{ name: "guidance_scale", type: "number", default: 7.5 },
],
inputs: [
{ name: "prompt", type: "text", required: true, label: "Prompt" },
{ name: "image_url", type: "image", required: false, label: "Image" },
],
}),
});
```
npm test -- src/components/__tests__/ModelParameters.test.tsx
ModelParameters tests pass covering schema loading, parameter handling, and collapse behavior
Task 2: Extend GenerateImageNode dynamic handle tests
src/components/__tests__/GenerateImageNode.test.tsx
Add tests to existing "Dynamic Input Handles" describe block:
**Multiple Image Inputs:**
- Should render multiple image handles with indexed IDs (image-0, image-1)
- Should position multiple image handles correctly (spaced evenly)
- Should show labels for each image input from schema
**Multiple Text Inputs:**
- Should render multiple text handles with indexed IDs (text-0, text-1)
- Should show labels for each text input from schema
**Placeholder Handle Variations:**
- Should show dimmed image handle (opacity 0.3) when schema has only text inputs
- Should show dimmed text handle when schema has only image inputs
- Should show "Not used by this model" description for placeholder handles
**Handle Ordering:**
- Should render image handles before text handles
- Should maintain gap between image and text handle groups
Test data patterns:
```typescript
// Multiple image inputs
inputSchema: [
{ name: "first_frame", type: "image", required: true, label: "First Frame" },
{ name: "last_frame", type: "image", required: false, label: "Last Frame" },
{ name: "prompt", type: "text", required: true, label: "Prompt" },
]
// Text-only model (placeholder image handle)
inputSchema: [
{ name: "prompt", type: "text", required: true, label: "Prompt" },
{ name: "negative_prompt", type: "text", required: false, label: "Negative" },
]
```
npm test -- src/components/__tests__/GenerateImageNode.test.tsx --testNamePattern="Dynamic"
GenerateImageNode tests cover all dynamic handle variations and placeholder scenarios
Task 3: Extend GenerateVideoNode dynamic handle tests
src/components/__tests__/GenerateVideoNode.test.tsx
Mirror the GenerateImageNode dynamic handle tests for video nodes:
**Multiple Image Inputs (common for video):**
- Should render multiple image handles for multi-frame video models
- Should show labels like "Start Frame", "End Frame" from schema
**Placeholder Handles:**
- Should show dimmed image handle when video model only needs text
- Should show dimmed text handle when video model only needs images
**Schema Integration:**
- Should update handles when inputSchema changes (model change)
Use similar test patterns as Task 2 but with video-specific schemas:
```typescript
// Image-to-video model
inputSchema: [
{ name: "start_image", type: "image", required: true, label: "Start Image" },
{ name: "end_image", type: "image", required: false, label: "End Image" },
{ name: "prompt", type: "text", required: true, label: "Motion Prompt" },
]
```
npm test -- src/components/__tests__/GenerateVideoNode.test.tsx --testNamePattern="Dynamic"
GenerateVideoNode tests match GenerateImageNode coverage for dynamic handles
Before declaring plan complete:
- [ ] `npm test -- src/components/__tests__/ModelParameters.test.tsx` passes
- [ ] `npm test -- src/components/__tests__/GenerateImageNode.test.tsx` passes
- [ ] `npm test -- src/components/__tests__/GenerateVideoNode.test.tsx` passes
- [ ] No TypeScript errors
- [ ] Schema loading tested
- [ ] Dynamic handle variations tested
- [ ] Placeholder handles tested
- All tasks completed
- All verification checks pass
- ModelParameters component fully tested
- Dynamic input handle rendering fully tested
- Placeholder handle behavior fully tested
- Phase 22 complete