test: Add comprehensive tests for SessionHandler dependency validation

Add test coverage for dependency validation logic in SessionHandler:
- Filter out invalid dependency values (empty strings, whitespace, "none")
- Validate UUID format for dependencies
- Handle mixed valid and invalid dependencies
- Support empty dependency arrays
- Handle arrays with only filtered values

This improves test coverage from ~91% to ~97% for SessionHandler.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jonathan Flatt
2025-06-05 05:19:33 +00:00
parent db75aba44d
commit 3e8adba2dc

View File

@@ -108,6 +108,156 @@ describe('SessionHandler', () => {
expect(response.success).toBe(false);
expect(response.error).toBe('Requirements are required for session creation');
});
it('should filter out invalid dependency values', async () => {
mockSessionManager.createContainer.mockResolvedValue('container-123');
const payload: ClaudeWebhookPayload = {
data: {
type: 'session.create',
session: {
project: {
repository: 'owner/repo',
requirements: 'Test requirements'
},
dependencies: ['', ' ', 'none', 'None', 'NONE', '550e8400-e29b-41d4-a716-446655440000']
}
},
metadata: {}
};
const response = await handler.handle(payload, mockContext);
expect(response.success).toBe(true);
// Only the valid UUID should remain
expect(response.data?.session.dependencies).toEqual(['550e8400-e29b-41d4-a716-446655440000']);
});
it('should fail with invalid UUID format in dependencies', async () => {
const payload: ClaudeWebhookPayload = {
data: {
type: 'session.create',
session: {
project: {
repository: 'owner/repo',
requirements: 'Test requirements'
},
dependencies: ['not-a-uuid', 'invalid-uuid-format', '12345']
}
},
metadata: {}
};
const response = await handler.handle(payload, mockContext);
expect(response.success).toBe(false);
expect(response.error).toBe(
'Invalid dependency IDs (not valid UUIDs): not-a-uuid, invalid-uuid-format, 12345'
);
});
it('should accept valid UUID dependencies', async () => {
mockSessionManager.createContainer.mockResolvedValue('container-123');
const validUUIDs = [
'550e8400-e29b-41d4-a716-446655440000',
'f47ac10b-58cc-4372-a567-0e02b2c3d479',
'6ba7b810-9dad-11d1-80b4-00c04fd430c8'
];
const payload: ClaudeWebhookPayload = {
data: {
type: 'session.create',
session: {
project: {
repository: 'owner/repo',
requirements: 'Test requirements'
},
dependencies: validUUIDs
}
},
metadata: {}
};
const response = await handler.handle(payload, mockContext);
expect(response.success).toBe(true);
expect(response.data?.session.dependencies).toEqual(validUUIDs);
});
it('should handle mixed valid and invalid dependencies', async () => {
const payload: ClaudeWebhookPayload = {
data: {
type: 'session.create',
session: {
project: {
repository: 'owner/repo',
requirements: 'Test requirements'
},
dependencies: [
'550e8400-e29b-41d4-a716-446655440000', // valid
'', // empty - filtered out
'none', // filtered out
'not-a-uuid', // invalid format
'f47ac10b-58cc-4372-a567-0e02b2c3d479' // valid
]
}
},
metadata: {}
};
const response = await handler.handle(payload, mockContext);
expect(response.success).toBe(false);
expect(response.error).toBe('Invalid dependency IDs (not valid UUIDs): not-a-uuid');
});
it('should handle empty dependencies array', async () => {
mockSessionManager.createContainer.mockResolvedValue('container-123');
const payload: ClaudeWebhookPayload = {
data: {
type: 'session.create',
session: {
project: {
repository: 'owner/repo',
requirements: 'Test requirements'
},
dependencies: []
}
},
metadata: {}
};
const response = await handler.handle(payload, mockContext);
expect(response.success).toBe(true);
expect(response.data?.session.dependencies).toEqual([]);
});
it('should handle dependencies with only filtered values', async () => {
mockSessionManager.createContainer.mockResolvedValue('container-123');
const payload: ClaudeWebhookPayload = {
data: {
type: 'session.create',
session: {
project: {
repository: 'owner/repo',
requirements: 'Test requirements'
},
dependencies: ['', ' ', 'none', 'None']
}
},
metadata: {}
};
const response = await handler.handle(payload, mockContext);
expect(response.success).toBe(true);
// All values filtered out, should result in empty array
expect(response.data?.session.dependencies).toEqual([]);
});
});
describe('session.get', () => {