141 lines
4.7 KiB
TypeScript
141 lines
4.7 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import * as taskbuffer from '../ts/index.js';
|
|
|
|
// Note: Web components can't be tested directly in Node.js environment
|
|
// These tests verify the data structures that the web component will consume
|
|
|
|
// Test that TaskManager can provide data for web component
|
|
tap.test('TaskManager should provide metadata for web visualization', async () => {
|
|
const taskManager = new taskbuffer.TaskManager();
|
|
|
|
// Add a task with steps
|
|
const visualTask = new taskbuffer.Task({
|
|
name: 'VisualizationTest',
|
|
steps: [
|
|
{ name: 'load', description: 'Loading data', percentage: 30 },
|
|
{ name: 'process', description: 'Processing', percentage: 50 },
|
|
{ name: 'render', description: 'Rendering', percentage: 20 },
|
|
] as const,
|
|
taskFunction: async () => {
|
|
visualTask.notifyStep('load');
|
|
await new Promise(resolve => setTimeout(resolve, 50));
|
|
visualTask.notifyStep('process');
|
|
await new Promise(resolve => setTimeout(resolve, 50));
|
|
visualTask.notifyStep('render');
|
|
return 'Visualization complete';
|
|
},
|
|
});
|
|
|
|
taskManager.addTask(visualTask);
|
|
|
|
// Get metadata before execution
|
|
let metadata = taskManager.getTaskMetadata('VisualizationTest');
|
|
expect(metadata).toBeDefined();
|
|
expect(metadata!.name).toEqual('VisualizationTest');
|
|
expect(metadata!.steps).toHaveLength(3);
|
|
expect(metadata!.currentProgress).toEqual(0);
|
|
|
|
// Execute task
|
|
await visualTask.trigger();
|
|
|
|
// Get metadata after execution
|
|
metadata = taskManager.getTaskMetadata('VisualizationTest');
|
|
expect(metadata!.currentProgress).toEqual(100);
|
|
expect(metadata!.steps.every(s => s.status === 'completed')).toBeTrue();
|
|
});
|
|
|
|
// Test scheduled task metadata for web display
|
|
tap.test('Scheduled tasks should provide next run information', async () => {
|
|
const taskManager = new taskbuffer.TaskManager();
|
|
|
|
const scheduledTask = new taskbuffer.Task({
|
|
name: 'WebScheduledTask',
|
|
steps: [
|
|
{ name: 'run', description: 'Running scheduled task', percentage: 100 },
|
|
] as const,
|
|
taskFunction: async () => {
|
|
scheduledTask.notifyStep('run');
|
|
},
|
|
});
|
|
|
|
// Schedule task for every hour
|
|
taskManager.addAndScheduleTask(scheduledTask, '0 * * * *');
|
|
|
|
// Get scheduled tasks info
|
|
const scheduledTasks = taskManager.getScheduledTasks();
|
|
expect(scheduledTasks).toHaveLength(1);
|
|
expect(scheduledTasks[0].name).toEqual('WebScheduledTask');
|
|
expect(scheduledTasks[0].schedule).toEqual('0 * * * *');
|
|
expect(scheduledTasks[0].nextRun).toBeInstanceOf(Date);
|
|
expect(scheduledTasks[0].steps).toHaveLength(1);
|
|
|
|
// Clean up
|
|
taskManager.descheduleTaskByName('WebScheduledTask');
|
|
taskManager.stop();
|
|
});
|
|
|
|
// Test data structure compatibility
|
|
tap.test('Task metadata should be suitable for web component display', async () => {
|
|
const taskManager = new taskbuffer.TaskManager();
|
|
|
|
// Add various types of tasks
|
|
const simpleTask = new taskbuffer.Task({
|
|
name: 'SimpleWebTask',
|
|
taskFunction: async () => 'done',
|
|
});
|
|
|
|
const bufferedTask = new taskbuffer.Task({
|
|
name: 'BufferedWebTask',
|
|
buffered: true,
|
|
bufferMax: 3,
|
|
taskFunction: async () => 'buffered',
|
|
});
|
|
|
|
const steppedTask = new taskbuffer.Task({
|
|
name: 'SteppedWebTask',
|
|
steps: [
|
|
{ name: 'step1', description: 'First step', percentage: 50 },
|
|
{ name: 'step2', description: 'Second step', percentage: 50 },
|
|
] as const,
|
|
taskFunction: async () => {
|
|
steppedTask.notifyStep('step1');
|
|
steppedTask.notifyStep('step2');
|
|
},
|
|
});
|
|
|
|
taskManager.addTask(simpleTask);
|
|
taskManager.addTask(bufferedTask);
|
|
taskManager.addTask(steppedTask);
|
|
|
|
// Get all metadata
|
|
const allMetadata = taskManager.getAllTasksMetadata();
|
|
expect(allMetadata).toHaveLength(3);
|
|
|
|
// Verify metadata structure
|
|
allMetadata.forEach(meta => {
|
|
expect(meta.name).toBeDefined();
|
|
expect(meta.status).toBeDefined();
|
|
expect(meta.runCount).toBeDefined();
|
|
expect(meta.steps).toBeDefined();
|
|
expect(Array.isArray(meta.steps)).toBeTrue();
|
|
expect(meta.currentProgress).toBeDefined();
|
|
expect(typeof meta.currentProgress).toEqual('number');
|
|
});
|
|
|
|
// Verify buffered task metadata
|
|
const bufferedMeta = allMetadata.find(m => m.name === 'BufferedWebTask');
|
|
expect(bufferedMeta!.buffered).toBeTrue();
|
|
expect(bufferedMeta!.bufferMax).toEqual(3);
|
|
|
|
// Verify stepped task metadata
|
|
const steppedMeta = allMetadata.find(m => m.name === 'SteppedWebTask');
|
|
expect(steppedMeta!.steps).toHaveLength(2);
|
|
steppedMeta!.steps.forEach(step => {
|
|
expect(step.name).toBeDefined();
|
|
expect(step.description).toBeDefined();
|
|
expect(step.percentage).toBeDefined();
|
|
expect(step.status).toBeDefined();
|
|
});
|
|
});
|
|
|
|
export default tap.start(); |