Files
kikootwo 94dbaf073b Add backend unit test framework and modularize settings UI
Introduced a Vitest-based backend unit testing framework with supporting scripts, helpers, and GitHub Actions integration. Refactored the admin settings page to a modular architecture, splitting monolithic logic into feature-specific tabs and hooks for improved maintainability and testability. Updated documentation to reflect the new testing setup and settings architecture, and added new dependencies for testing utilities.
2026-01-28 11:41:59 -05:00

67 lines
2.8 KiB
TypeScript

/**
* Component: Cron Utilities Tests
* Documentation: documentation/backend/services/scheduler.md
*/
import { describe, expect, it } from 'vitest';
import { cronToHuman, isValidCron, customScheduleToCron, cronToCustomSchedule } from '@/lib/utils/cron';
describe('cron utilities', () => {
it('converts known presets to human text', () => {
expect(cronToHuman('*/15 * * * *')).toBe('Every 15 minutes');
expect(cronToHuman('0 */6 * * *')).toBe('Every 6 hours');
expect(cronToHuman('0 * * * *')).toBe('Every hour');
});
it('converts daily schedule to human text', () => {
expect(cronToHuman('30 14 * * *')).toBe('Daily at 2:30 PM');
expect(cronToHuman('*/1 * * * *')).toBe('Every 1 minute');
});
it('converts weekly and monthly schedules to human text', () => {
expect(cronToHuman('15 9 * * 1')).toBe('Weekly on Monday at 9:15 AM');
expect(cronToHuman('0 0 15 * *')).toBe('Monthly on day 15 at 12:00 AM');
});
it('returns raw cron for invalid expressions', () => {
expect(cronToHuman('bad cron')).toBe('bad cron');
});
it('validates cron expressions', () => {
expect(isValidCron('*/5 * * * *')).toBe(true);
expect(isValidCron('invalid')).toBe(false);
expect(isValidCron('0 0 0 * *')).toBe(false);
expect(isValidCron('0 0 1-5 * *')).toBe(true);
expect(isValidCron('0 0 1,15 * *')).toBe(true);
expect(isValidCron('*/0 * * * *')).toBe(false);
});
it('converts custom schedules to cron', () => {
expect(customScheduleToCron({ type: 'minutes', interval: 10 })).toBe('*/10 * * * *');
expect(customScheduleToCron({ type: 'hours', interval: 24 })).toBe('0 0 * * *');
expect(customScheduleToCron({ type: 'daily', time: { hour: 9, minute: 15 } })).toBe('15 9 * * *');
expect(customScheduleToCron({ type: 'weekly', time: { hour: 6, minute: 30 }, dayOfWeek: 2 })).toBe('30 6 * * 2');
expect(customScheduleToCron({ type: 'monthly', time: { hour: 5, minute: 0 }, dayOfMonth: 10 })).toBe('0 5 10 * *');
expect(customScheduleToCron({ type: 'custom', customCron: '5 4 * * *' })).toBe('5 4 * * *');
});
it('parses cron into custom schedules', () => {
expect(cronToCustomSchedule('*/15 * * * *')).toEqual({ type: 'minutes', interval: 15 });
expect(cronToCustomSchedule('0 */3 * * *')).toEqual({ type: 'hours', interval: 3 });
expect(cronToCustomSchedule('0 7 * * *')).toEqual({ type: 'daily', time: { hour: 7, minute: 0 } });
expect(cronToCustomSchedule('0 6 * * 2')).toEqual({
type: 'weekly',
time: { hour: 6, minute: 0 },
dayOfWeek: 2,
});
expect(cronToCustomSchedule('0 2 12 * *')).toEqual({
type: 'monthly',
time: { hour: 2, minute: 0 },
dayOfMonth: 12,
});
expect(cronToCustomSchedule('bad')).toEqual({ type: 'custom', customCron: 'bad' });
});
});