refactor: normalize IDs once when loading JSON instead of scattered calls

- Normalize all tags' data when creating _rawTaggedData in readJSON
- Add support for handling malformed dotted subtask IDs (e.g., "5.1" -> 1)
- Remove redundant normalizeTaskIds calls from set-task-status, add-task, and move-task
- Add comprehensive test for mixed ID formats (string IDs and dotted notation)
- Cleaner, more maintainable solution that normalizes IDs at load time

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Carl Mercier
2025-07-26 01:17:51 -05:00
committed by Ralph Khreish
parent 3f31c34f8d
commit 8f97b6aead

View File

@@ -24,14 +24,17 @@ describe('Task Finder', () => {
});
test('should find tasks when JSON contains string IDs (normalized to numbers)', () => {
// Simulate tasks loaded from JSON with string IDs
// Simulate tasks loaded from JSON with string IDs and mixed subtask notations
const tasksWithStringIds = [
{ id: "1", title: 'First Task' },
{ id: "2", title: 'Second Task', subtasks: [
{ id: "1", title: 'Subtask One' },
{ id: "2", title: 'Subtask Two' }
{ id: "2.2", title: 'Subtask Two (with dotted notation)' } // Testing dotted notation
]},
{ id: "5", title: 'Fifth Task' }
{ id: "5", title: 'Fifth Task', subtasks: [
{ id: "5.1", title: 'Subtask with dotted ID' }, // Should normalize to 1
{ id: "3", title: 'Subtask with simple ID' } // Should stay as 3
]}
];
// The readJSON function should normalize these IDs to numbers
@@ -40,7 +43,13 @@ describe('Task Finder', () => {
task.id = parseInt(task.id, 10);
if (task.subtasks) {
task.subtasks.forEach(subtask => {
subtask.id = parseInt(subtask.id, 10);
// Handle dotted notation like "5.1" -> extract the subtask part
if (typeof subtask.id === 'string' && subtask.id.includes('.')) {
const parts = subtask.id.split('.');
subtask.id = parseInt(parts[parts.length - 1], 10);
} else {
subtask.id = parseInt(subtask.id, 10);
}
});
}
});
@@ -56,12 +65,30 @@ describe('Task Finder', () => {
expect(result2.task).toBeDefined();
expect(result2.task.id).toBe(5);
// Test finding subtasks
// Test finding subtasks with normalized IDs
const result3 = findTaskById(tasksWithStringIds, '2.1');
expect(result3.task).toBeDefined();
expect(result3.task.id).toBe(1);
expect(result3.task.title).toBe('Subtask One');
expect(result3.task.isSubtask).toBe(true);
// Test subtask that was originally "2.2" (should be normalized to 2)
const result4 = findTaskById(tasksWithStringIds, '2.2');
expect(result4.task).toBeDefined();
expect(result4.task.id).toBe(2);
expect(result4.task.title).toBe('Subtask Two (with dotted notation)');
// Test subtask that was originally "5.1" (should be normalized to 1)
const result5 = findTaskById(tasksWithStringIds, '5.1');
expect(result5.task).toBeDefined();
expect(result5.task.id).toBe(1);
expect(result5.task.title).toBe('Subtask with dotted ID');
// Test subtask that was originally "3" (should stay as 3)
const result6 = findTaskById(tasksWithStringIds, '5.3');
expect(result6.task).toBeDefined();
expect(result6.task.id).toBe(3);
expect(result6.task.title).toBe('Subtask with simple ID');
});
test('should find a subtask using dot notation', () => {