- Fix tests using ES Module best practices instead of complex mocking - Replace Commander.js mocking with direct action handler testing - Resolve ES Module import/mock issues and function redeclaration errors - Fix circular reference issues with console.log spies - Properly setup mock functions with jest.fn() for method access - Improve parse-prd command functionality - Add default PRD path support (scripts/prd.txt) so you can just run `task-master parse-prd` and it will use the default PRD if it exists. - Improve error handling and user feedback - Enhance help text with more detailed information - Fix detectCamelCaseFlags implementation in utils.js yet again with more tests this time - Improve regex pattern to correctly detect camelCase flags - Skip flags already in kebab-case format - Enhance tests with proper test-specific implementations - Document testing best practices - Add comprehensive "Common Testing Pitfalls and Solutions" section to tests.mdc - Provide clear examples of correct testing patterns for ES modules - Document techniques for test isolation and mock organization
118 lines
3.7 KiB
JavaScript
118 lines
3.7 KiB
JavaScript
/**
|
|
* Kebab case validation tests
|
|
*/
|
|
|
|
import { jest } from '@jest/globals';
|
|
import { toKebabCase } from '../../scripts/modules/utils.js';
|
|
|
|
// Create a test implementation of detectCamelCaseFlags
|
|
function testDetectCamelCaseFlags(args) {
|
|
const camelCaseFlags = [];
|
|
for (const arg of args) {
|
|
if (arg.startsWith('--')) {
|
|
const flagName = arg.split('=')[0].slice(2); // Remove -- and anything after =
|
|
|
|
// Skip if it's a single word (no hyphens) or already in kebab-case
|
|
if (!flagName.includes('-')) {
|
|
// Check for camelCase pattern (lowercase followed by uppercase)
|
|
if (/[a-z][A-Z]/.test(flagName)) {
|
|
const kebabVersion = toKebabCase(flagName);
|
|
if (kebabVersion !== flagName) {
|
|
camelCaseFlags.push({
|
|
original: flagName,
|
|
kebabCase: kebabVersion
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return camelCaseFlags;
|
|
}
|
|
|
|
describe('Kebab Case Validation', () => {
|
|
describe('toKebabCase', () => {
|
|
test('should convert camelCase to kebab-case', () => {
|
|
expect(toKebabCase('promptText')).toBe('prompt-text');
|
|
expect(toKebabCase('userID')).toBe('user-id');
|
|
expect(toKebabCase('numTasks')).toBe('num-tasks');
|
|
});
|
|
|
|
test('should handle already kebab-case strings', () => {
|
|
expect(toKebabCase('already-kebab-case')).toBe('already-kebab-case');
|
|
expect(toKebabCase('kebab-case')).toBe('kebab-case');
|
|
});
|
|
|
|
test('should handle single words', () => {
|
|
expect(toKebabCase('single')).toBe('single');
|
|
expect(toKebabCase('file')).toBe('file');
|
|
});
|
|
});
|
|
|
|
describe('detectCamelCaseFlags', () => {
|
|
test('should properly detect camelCase flags', () => {
|
|
const args = ['node', 'task-master', 'add-task', '--promptText=test', '--userID=123'];
|
|
const flags = testDetectCamelCaseFlags(args);
|
|
|
|
expect(flags).toHaveLength(2);
|
|
expect(flags).toContainEqual({
|
|
original: 'promptText',
|
|
kebabCase: 'prompt-text'
|
|
});
|
|
expect(flags).toContainEqual({
|
|
original: 'userID',
|
|
kebabCase: 'user-id'
|
|
});
|
|
});
|
|
|
|
test('should not flag kebab-case or lowercase flags', () => {
|
|
const args = ['node', 'task-master', 'add-task', '--prompt=test', '--user-id=123'];
|
|
const flags = testDetectCamelCaseFlags(args);
|
|
|
|
expect(flags).toHaveLength(0);
|
|
});
|
|
|
|
test('should not flag any single-word flags regardless of case', () => {
|
|
const args = [
|
|
'node',
|
|
'task-master',
|
|
'add-task',
|
|
'--prompt=test', // lowercase
|
|
'--PROMPT=test', // uppercase
|
|
'--Prompt=test', // mixed case
|
|
'--file=test', // lowercase
|
|
'--FILE=test', // uppercase
|
|
'--File=test' // mixed case
|
|
];
|
|
const flags = testDetectCamelCaseFlags(args);
|
|
|
|
expect(flags).toHaveLength(0);
|
|
});
|
|
|
|
test('should handle mixed case flags correctly', () => {
|
|
const args = [
|
|
'node',
|
|
'task-master',
|
|
'add-task',
|
|
'--prompt=test', // single word, should pass
|
|
'--promptText=test', // camelCase, should flag
|
|
'--prompt-text=test', // kebab-case, should pass
|
|
'--ID=123', // single word, should pass
|
|
'--userId=123', // camelCase, should flag
|
|
'--user-id=123' // kebab-case, should pass
|
|
];
|
|
|
|
const flags = testDetectCamelCaseFlags(args);
|
|
|
|
expect(flags).toHaveLength(2);
|
|
expect(flags).toContainEqual({
|
|
original: 'promptText',
|
|
kebabCase: 'prompt-text'
|
|
});
|
|
expect(flags).toContainEqual({
|
|
original: 'userId',
|
|
kebabCase: 'user-id'
|
|
});
|
|
});
|
|
});
|
|
});
|