style: format test files with consistent spacing

Apply consistent code formatting to integration test files
This commit is contained in:
Quorafind 2025-12-17 14:52:19 +08:00
parent b1caa05209
commit 4d3116cfca
2 changed files with 183 additions and 86 deletions

View file

@ -1,6 +1,6 @@
/**
* Enhanced Time Parsing Integration Tests
*
*
* Tests for cross-component functionality including:
* - End-to-end flow from task creation to timeline display
* - Time component preservation across task updates
@ -8,7 +8,10 @@
* - ICS event integration with enhanced time parsing
*/
import { TimeParsingService, DEFAULT_TIME_PARSING_CONFIG } from "../services/time-parsing-service";
import {
TimeParsingService,
DEFAULT_TIME_PARSING_CONFIG,
} from "../services/time-parsing-service";
import { FileTaskManagerImpl } from "../managers/file-task-manager";
import { IcsManager } from "../managers/ics-manager";
import { IcsParser } from "../parsers/ics-parser";
@ -69,7 +72,10 @@ interface MockBasesEntry {
};
lazyEvalCache: Record<string, any>;
properties: Record<string, any>;
getValue(prop: { type: "property" | "file" | "formula"; name: string }): any;
getValue(prop: {
type: "property" | "file" | "formula";
name: string;
}): any;
updateProperty(key: string, value: any): void;
getFormulaValue(formula: string): any;
getPropertyKeys(): string[];
@ -118,7 +124,11 @@ describe("Enhanced Time Parsing Integration Tests", () => {
};
timeParsingService = new TimeParsingService(enhancedConfig);
fileTaskManager = new FileTaskManagerImpl(mockApp, undefined, timeParsingService);
fileTaskManager = new FileTaskManagerImpl(
mockApp,
undefined,
timeParsingService,
);
migrationService = new TaskMigrationService();
// Initialize ICS manager
@ -145,7 +155,12 @@ describe("Enhanced Time Parsing Integration Tests", () => {
defaultEventColor: "#3498db",
};
icsManager = new IcsManager(icsConfig, mockPluginSettings, undefined, timeParsingService);
icsManager = new IcsManager(
icsConfig,
mockPluginSettings,
undefined,
timeParsingService,
);
});
describe("End-to-End Flow: Task Creation to Timeline Display", () => {
@ -178,7 +193,8 @@ describe("Enhanced Time Parsing Integration Tests", () => {
due: "2025-08-25",
},
getValue: jest.fn((prop: any) => {
if (prop.name === "title") return "Team meeting 14:00-16:00 tomorrow";
if (prop.name === "title")
return "Team meeting 14:00-16:00 tomorrow";
if (prop.name === "status") return " ";
if (prop.name === "completed") return false;
if (prop.name === "due") return "2025-08-25";
@ -186,18 +202,25 @@ describe("Enhanced Time Parsing Integration Tests", () => {
}),
updateProperty: jest.fn(),
getFormulaValue: jest.fn(),
getPropertyKeys: jest.fn(() => ["title", "status", "completed", "due"]),
getPropertyKeys: jest.fn(() => [
"title",
"status",
"completed",
"due",
]),
};
// Step 2: Convert to file task (simulates task parsing)
const fileTask = fileTaskManager.entryToFileTask(mockEntry);
// Verify task has enhanced metadata
expect(fileTask.content).toBe("Team meeting 14:00-16:00 tomorrow");
expect(fileTask.metadata.timeComponents).toBeDefined();
expect(fileTask.metadata.timeComponents?.startTime?.hour).toBe(14);
expect(fileTask.metadata.timeComponents?.endTime?.hour).toBe(16);
expect(fileTask.metadata.enhancedDates?.startDateTime).toBeDefined();
expect(
fileTask.metadata.enhancedDates?.startDateTime,
).toBeDefined();
expect(fileTask.metadata.enhancedDates?.endDateTime).toBeDefined();
// Step 3: Create timeline event from task (simulates timeline view processing)
@ -207,7 +230,8 @@ describe("Enhanced Time Parsing Integration Tests", () => {
date: new Date(fileTask.metadata.dueDate!),
task: fileTask as any,
timeInfo: {
primaryTime: fileTask.metadata.enhancedDates!.startDateTime!,
primaryTime:
fileTask.metadata.enhancedDates!.startDateTime!,
endTime: fileTask.metadata.enhancedDates!.endDateTime,
isRange: true,
timeComponent: fileTask.metadata.timeComponents!.startTime,
@ -233,8 +257,10 @@ describe("Enhanced Time Parsing Integration Tests", () => {
},
};
const events = [timelineEvent, anotherEvent].sort((a, b) =>
a.timeInfo!.primaryTime.getTime() - b.timeInfo!.primaryTime.getTime()
const events = [timelineEvent, anotherEvent].sort(
(a, b) =>
a.timeInfo!.primaryTime.getTime() -
b.timeInfo!.primaryTime.getTime(),
);
expect(events[0].title).toBe("Earlier meeting");
@ -244,10 +270,12 @@ describe("Enhanced Time Parsing Integration Tests", () => {
test("should handle inline task creation with time components", () => {
// Simulate inline task parsing
const inlineTaskText = "- [ ] Call client at 3:30 PM 📅 2025-08-25";
// Parse time components from inline task
const parseResult = timeParsingService.parseTimeExpressions(inlineTaskText) as EnhancedParsedTimeResult;
const parseResult = timeParsingService.parseTimeExpressions(
inlineTaskText,
) as EnhancedParsedTimeResult;
expect(parseResult.timeComponents.scheduledTime).toBeDefined();
expect(parseResult.timeComponents.scheduledTime?.hour).toBe(15);
expect(parseResult.timeComponents.scheduledTime?.minute).toBe(30);
@ -273,9 +301,15 @@ describe("Enhanced Time Parsing Integration Tests", () => {
};
// Verify enhanced metadata
expect(inlineTask.metadata.timeComponents?.scheduledTime?.hour).toBe(15);
expect(inlineTask.metadata.enhancedDates?.dueDateTime?.getHours()).toBe(15);
expect(inlineTask.metadata.enhancedDates?.dueDateTime?.getMinutes()).toBe(30);
expect(
inlineTask.metadata.timeComponents?.scheduledTime?.hour,
).toBe(15);
expect(
inlineTask.metadata.enhancedDates?.dueDateTime?.getHours(),
).toBe(15);
expect(
inlineTask.metadata.enhancedDates?.dueDateTime?.getMinutes(),
).toBe(30);
// Create timeline event
const timelineEvent: MockTimelineEvent = {
@ -284,9 +318,11 @@ describe("Enhanced Time Parsing Integration Tests", () => {
date: new Date(inlineTask.metadata.dueDate!),
task: inlineTask,
timeInfo: {
primaryTime: inlineTask.metadata.enhancedDates!.dueDateTime!,
primaryTime:
inlineTask.metadata.enhancedDates!.dueDateTime!,
isRange: false,
timeComponent: inlineTask.metadata.timeComponents!.scheduledTime,
timeComponent:
inlineTask.metadata.timeComponents!.scheduledTime,
displayFormat: "date-time",
},
};
@ -325,20 +361,27 @@ describe("Enhanced Time Parsing Integration Tests", () => {
completed: false,
},
getValue: jest.fn((prop: any) => {
if (prop.name === "title") return "Doctor appointment at 2:00 PM";
if (prop.name === "title")
return "Doctor appointment at 2:00 PM";
if (prop.name === "status") return " ";
if (prop.name === "completed") return false;
return undefined;
}),
updateProperty: jest.fn(),
getFormulaValue: jest.fn(),
getPropertyKeys: jest.fn(() => ["title", "status", "completed"]),
getPropertyKeys: jest.fn(() => [
"title",
"status",
"completed",
]),
};
const originalTask = fileTaskManager.entryToFileTask(mockEntry);
// Verify original time component
expect(originalTask.metadata.timeComponents?.scheduledTime?.hour).toBe(14);
expect(
originalTask.metadata.timeComponents?.scheduledTime?.hour,
).toBe(14);
// Update task content with new time
await fileTaskManager.updateFileTask(originalTask, {
@ -346,8 +389,12 @@ describe("Enhanced Time Parsing Integration Tests", () => {
});
// Verify time component was updated
expect(originalTask.metadata.timeComponents?.scheduledTime?.hour).toBe(16);
expect(originalTask.metadata.timeComponents?.scheduledTime?.minute).toBe(30);
expect(
originalTask.metadata.timeComponents?.scheduledTime?.hour,
).toBe(16);
expect(
originalTask.metadata.timeComponents?.scheduledTime?.minute,
).toBe(30);
});
test("should preserve time components when completing tasks", () => {
@ -396,10 +443,18 @@ describe("Enhanced Time Parsing Integration Tests", () => {
};
// Verify time components are preserved
expect(completedTask.metadata.timeComponents?.startTime?.hour).toBe(9);
expect(completedTask.metadata.timeComponents?.endTime?.hour).toBe(17);
expect(completedTask.metadata.enhancedDates?.startDateTime?.getHours()).toBe(9);
expect(completedTask.metadata.enhancedDates?.endDateTime?.getHours()).toBe(17);
expect(completedTask.metadata.timeComponents?.startTime?.hour).toBe(
9,
);
expect(completedTask.metadata.timeComponents?.endTime?.hour).toBe(
17,
);
expect(
completedTask.metadata.enhancedDates?.startDateTime?.getHours(),
).toBe(9);
expect(
completedTask.metadata.enhancedDates?.endDateTime?.getHours(),
).toBe(17);
});
test("should handle task status changes while preserving time data", () => {
@ -446,9 +501,15 @@ describe("Enhanced Time Parsing Integration Tests", () => {
};
// Verify time components preserved through all status changes
expect(inProgressTask.metadata.timeComponents?.scheduledTime?.hour).toBe(15);
expect(completedTask.metadata.timeComponents?.scheduledTime?.hour).toBe(15);
expect(completedTask.metadata.enhancedDates?.scheduledDateTime?.getHours()).toBe(15);
expect(
inProgressTask.metadata.timeComponents?.scheduledTime?.hour,
).toBe(15);
expect(
completedTask.metadata.timeComponents?.scheduledTime?.hour,
).toBe(15);
expect(
completedTask.metadata.enhancedDates?.scheduledDateTime?.getHours(),
).toBe(15);
});
});
@ -471,13 +532,18 @@ describe("Enhanced Time Parsing Integration Tests", () => {
};
// Migrate to enhanced metadata
const migratedTask = migrationService.migrateTaskToEnhanced(legacyTask);
const migratedTask =
migrationService.migrateTaskToEnhanced(legacyTask);
// Should preserve all original data
expect(migratedTask.id).toBe(legacyTask.id);
expect(migratedTask.content).toBe(legacyTask.content);
expect(migratedTask.metadata.dueDate).toBe(legacyTask.metadata.dueDate);
expect(migratedTask.metadata.tags).toEqual(legacyTask.metadata.tags);
expect(migratedTask.metadata.dueDate).toBe(
legacyTask.metadata.dueDate,
);
expect(migratedTask.metadata.tags).toEqual(
legacyTask.metadata.tags,
);
// Should not have time components (no time in content)
expect(migratedTask.metadata.timeComponents).toBeUndefined();
@ -502,19 +568,28 @@ describe("Enhanced Time Parsing Integration Tests", () => {
};
// Migrate to enhanced metadata
const migratedTask = migrationService.migrateTaskToEnhanced(legacyTaskWithTime);
const migratedTask =
migrationService.migrateTaskToEnhanced(legacyTaskWithTime);
// Should preserve original data
expect(migratedTask.content).toBe(legacyTaskWithTime.content);
expect(migratedTask.metadata.dueDate).toBe(legacyTaskWithTime.metadata.dueDate);
expect(migratedTask.metadata.dueDate).toBe(
legacyTaskWithTime.metadata.dueDate,
);
// Should add time components from parsing
expect(migratedTask.metadata.timeComponents).toBeDefined();
expect(migratedTask.metadata.timeComponents?.scheduledTime?.hour).toBe(14);
expect(migratedTask.metadata.timeComponents?.scheduledTime?.minute).toBe(30);
expect(
migratedTask.metadata.timeComponents?.scheduledTime?.hour,
).toBe(14);
expect(
migratedTask.metadata.timeComponents?.scheduledTime?.minute,
).toBe(30);
// Should create enhanced datetime
expect(migratedTask.metadata.enhancedDates?.scheduledDateTime).toBeDefined();
expect(
migratedTask.metadata.enhancedDates?.scheduledDateTime,
).toBeDefined();
});
test("should handle mixed task collections (with and without time)", () => {
@ -542,15 +617,17 @@ describe("Enhanced Time Parsing Integration Tests", () => {
];
// Migrate all tasks
const migratedTasks = mixedTasks.map(task =>
migrationService.migrateTaskToEnhanced(task)
const migratedTasks = mixedTasks.map((task) =>
migrationService.migrateTaskToEnhanced(task),
);
// First task should not have time components
expect(migratedTasks[0].metadata.timeComponents).toBeUndefined();
// Second task should have time components
expect(migratedTasks[1].metadata.timeComponents?.scheduledTime?.hour).toBe(15);
expect(
migratedTasks[1].metadata.timeComponents?.scheduledTime?.hour,
).toBe(15);
// Both should be valid enhanced tasks
expect(migratedTasks[0].id).toBe("no-time-task");
@ -574,9 +651,9 @@ STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR`;
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
const parseResult = IcsParser.parse(icsData, testSource);
expect(parseResult.events).toHaveLength(1);
// Convert to tasks
@ -616,10 +693,10 @@ STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR`;
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
const parseResult = IcsParser.parse(icsData, testSource);
const tasks = icsManager.convertEventsToTasks(parseResult.events);
const task = tasks[0];
const metadata = task.metadata as EnhancedStandardTaskMetadata;
@ -629,7 +706,9 @@ END:VCALENDAR`;
// Should have time components parsed from description
expect(metadata.timeComponents).toBeDefined();
// Should find the first time mentioned (9:00 AM)
const timeComponent = metadata.timeComponents?.startTime || metadata.timeComponents?.scheduledTime;
const timeComponent =
metadata.timeComponents?.startTime ||
metadata.timeComponents?.scheduledTime;
expect(timeComponent?.hour).toBe(9);
});
@ -647,16 +726,18 @@ STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR`;
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
const parseResult = IcsParser.parse(icsData, testSource);
const tasks = icsManager.convertEventsToTasks(parseResult.events);
const task = tasks[0];
const metadata = task.metadata as EnhancedStandardTaskMetadata;
// Should parse time from location field
expect(metadata.timeComponents).toBeDefined();
const timeComponent = metadata.timeComponents?.scheduledTime || metadata.timeComponents?.dueTime;
const timeComponent =
metadata.timeComponents?.scheduledTime ||
metadata.timeComponents?.dueTime;
expect(timeComponent?.hour).toBe(19); // 7:30 PM
expect(timeComponent?.minute).toBe(30);
});
@ -675,10 +756,10 @@ STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR`;
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
const parseResult = IcsParser.parse(icsData, testSource);
const tasks = icsManager.convertEventsToTasks(parseResult.events);
const task = tasks[0];
// Should maintain all ICS properties
@ -703,7 +784,7 @@ END:VCALENDAR`;
test("should handle large numbers of tasks efficiently", () => {
const startTime = Date.now();
const taskCount = 100;
// Create many tasks with time information
const tasks: Task[] = [];
for (let i = 0; i < taskCount; i++) {
@ -721,8 +802,8 @@ END:VCALENDAR`;
}
// Migrate all tasks
const migratedTasks = tasks.map(task =>
migrationService.migrateTaskToEnhanced(task)
const migratedTasks = tasks.map((task) =>
migrationService.migrateTaskToEnhanced(task),
);
const endTime = Date.now();
@ -733,7 +814,9 @@ END:VCALENDAR`;
expect(migratedTasks).toHaveLength(taskCount);
// Verify some tasks have time components
const tasksWithTime = migratedTasks.filter(t => t.metadata.timeComponents);
const tasksWithTime = migratedTasks.filter(
(t) => t.metadata.timeComponents,
);
expect(tasksWithTime.length).toBeGreaterThan(0);
});
@ -774,17 +857,23 @@ END:VCALENDAR`;
// Should not throw errors during migration
expect(() => {
const migratedTasks = problematicTasks.map(task =>
migrationService.migrateTaskToEnhanced(task)
const migratedTasks = problematicTasks.map((task) =>
migrationService.migrateTaskToEnhanced(task),
);
// All tasks should be migrated (even if without time components)
expect(migratedTasks).toHaveLength(3);
// Tasks with invalid time should not have time components
expect(migratedTasks[0].metadata.timeComponents).toBeUndefined();
expect(migratedTasks[1].metadata.timeComponents).toBeUndefined();
expect(migratedTasks[2].metadata.timeComponents).toBeUndefined();
expect(
migratedTasks[0].metadata.timeComponents,
).toBeUndefined();
expect(
migratedTasks[1].metadata.timeComponents,
).toBeUndefined();
expect(
migratedTasks[2].metadata.timeComponents,
).toBeUndefined();
// But should preserve other metadata
expect(migratedTasks[0].id).toBe("invalid-time-1");
@ -793,4 +882,4 @@ END:VCALENDAR`;
}).not.toThrow();
});
});
});
});

View file

@ -55,7 +55,7 @@ describe("ICS Event Time Handling Integration", () => {
beforeEach(() => {
timeParsingService = new TimeParsingService(mockTimeParsingConfig);
const testSource: IcsSource = {
id: "integration-test",
name: "Integration Test Calendar",
@ -79,7 +79,12 @@ describe("ICS Event Time Handling Integration", () => {
defaultEventColor: "#3498db",
};
icsManager = new IcsManager(mockConfig, mockPluginSettings, undefined, timeParsingService);
icsManager = new IcsManager(
mockConfig,
mockPluginSettings,
undefined,
timeParsingService,
);
});
test("end-to-end ICS event with time components conversion", () => {
@ -117,9 +122,9 @@ END:VEVENT
END:VCALENDAR`;
// Parse ICS data
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
const parseResult = IcsParser.parse(icsData, testSource);
expect(parseResult.events).toHaveLength(3);
expect(parseResult.errors).toHaveLength(0);
@ -128,10 +133,11 @@ END:VCALENDAR`;
expect(tasks).toHaveLength(3);
// Test 1: Timed event with ICS time components
const timedTask = tasks.find(t => t.content === "Team Standup");
const timedTask = tasks.find((t) => t.content === "Team Standup");
expect(timedTask).toBeDefined();
const timedMetadata = timedTask!.metadata as EnhancedStandardTaskMetadata;
const timedMetadata = timedTask!
.metadata as EnhancedStandardTaskMetadata;
expect(timedMetadata.timeComponents).toBeDefined();
expect(timedMetadata.timeComponents?.startTime).toBeDefined();
expect(timedMetadata.timeComponents?.endTime).toBeDefined();
@ -140,19 +146,21 @@ END:VCALENDAR`;
expect(timedMetadata.enhancedDates?.endDateTime).toBeDefined();
// Test 2: All-day event with time parsing from description
const workshopTask = tasks.find(t => t.content === "Workshop Day");
const workshopTask = tasks.find((t) => t.content === "Workshop Day");
expect(workshopTask).toBeDefined();
const workshopMetadata = workshopTask!.metadata as EnhancedStandardTaskMetadata;
const workshopMetadata = workshopTask!
.metadata as EnhancedStandardTaskMetadata;
// Should have time components parsed from description
expect(workshopMetadata.timeComponents).toBeDefined();
expect(workshopMetadata.enhancedDates).toBeDefined();
// Test 3: Event with time in location field
const dinnerTask = tasks.find(t => t.content === "Team Dinner");
const dinnerTask = tasks.find((t) => t.content === "Team Dinner");
expect(dinnerTask).toBeDefined();
const dinnerMetadata = dinnerTask!.metadata as EnhancedStandardTaskMetadata;
const dinnerMetadata = dinnerTask!
.metadata as EnhancedStandardTaskMetadata;
// Should have time components parsed from location
expect(dinnerMetadata.timeComponents).toBeDefined();
expect(dinnerMetadata.enhancedDates).toBeDefined();
@ -171,8 +179,8 @@ END:VCALENDAR`;
});
test("ICS event time preservation with holiday detection", () => {
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
// Add holiday configuration to source
testSource.holidayConfig = {
enabled: true,
@ -206,17 +214,17 @@ END:VCALENDAR`;
// Test holiday detection directly on events
const events = parseResult.events;
const eventsWithHoliday = icsManager.convertEventsWithHolidayToTasks(
events.map(event => ({
events.map((event) => ({
...event,
isHoliday: true, // Simulate holiday detection
showInForecast: true,
}))
})),
);
expect(eventsWithHoliday).toHaveLength(1);
const task = eventsWithHoliday[0];
const metadata = task.metadata as EnhancedStandardTaskMetadata;
// Should still have time components despite holiday processing
expect(metadata.timeComponents).toBeDefined();
expect(metadata.timeComponents?.startTime).toBeDefined();
@ -225,7 +233,7 @@ END:VCALENDAR`;
});
test("error handling in time component extraction", () => {
const testSource = icsManager.getConfig().sources[0];
const testSource = icsManager.getConfig().sources[0] as IcsSource;
// ICS data with potential parsing issues
const icsData = `BEGIN:VCALENDAR
@ -248,14 +256,14 @@ END:VCALENDAR`;
expect(() => {
const tasks = icsManager.convertEventsToTasks(parseResult.events);
expect(tasks).toHaveLength(1);
const task = tasks[0];
expect(task.content).toBe("Problematic Event");
// Should handle gracefully - may or may not have time components
// but should not crash
const metadata = task.metadata as EnhancedStandardTaskMetadata;
expect(metadata).toBeDefined();
}).not.toThrow();
});
});
});