UNPKG

scriptable-testlab

Version:

A lightweight, efficient tool designed to manage and update scripts for Scriptable.

405 lines (342 loc) 12.5 kB
import {AbsReminder} from 'scriptable-abstract'; interface ReminderState { identifier: string; title: string; notes: string; dueDate: Date | null; dueDateIncludesTime: boolean; isCompleted: boolean; isOverdue: boolean; priority: number; calendar: Calendar | null; recurrenceRules: RecurrenceRule[]; completionDate: Date | null; creationDate: Date; } const DEFAULT_STATE: ReminderState = { identifier: '', title: '', notes: '', dueDate: null, dueDateIncludesTime: false, isCompleted: false, isOverdue: false, priority: 0, calendar: null, recurrenceRules: [], completionDate: null, creationDate: new Date(), }; /** * Mock implementation of Scriptable's Reminder. * Provides functionality for managing reminders. * @implements Reminder */ export class MockReminder extends AbsReminder<ReminderState> { private static _instance: MockReminder | null = null; private static _reminders: MockReminder[] = []; static get instance(): MockReminder { if (!this._instance) { this._instance = new MockReminder(); } return this._instance; } constructor() { super(DEFAULT_STATE); } // Basic properties get identifier(): string { return this.state.identifier; } get title(): string { return this.state.title; } set title(value: string) { this.setState({title: value}); } get notes(): string { return this.state.notes; } set notes(value: string) { this.setState({notes: value}); } get dueDate(): Date | null { return this.state.dueDate ? new Date(this.state.dueDate) : null; } set dueDate(value: Date | null) { this.setState({ dueDate: value ? new Date(value) : null, }); } get dueDateIncludesTime(): boolean { return this.state.dueDateIncludesTime; } set dueDateIncludesTime(value: boolean) { this.setState({dueDateIncludesTime: value}); } get isCompleted(): boolean { return this.state.isCompleted; } set isCompleted(value: boolean) { this.setState({ isCompleted: value, completionDate: value ? new Date() : null, }); } get isOverdue(): boolean { if (!this.dueDate) return false; return this.dueDate < new Date() && !this.isCompleted; } get priority(): number { return this.state.priority; } set priority(value: number) { this.setState({priority: value}); } get calendar(): Calendar | null { return this.state.calendar; } set calendar(value: Calendar | null) { this.setState({calendar: value}); } get completionDate(): Date | null { return this.state.completionDate ? new Date(this.state.completionDate) : null; } get creationDate(): Date { return new Date(this.state.creationDate); } // Recurrence rules addRecurrenceRule(recurrenceRule: RecurrenceRule): void { this.setState(state => ({ recurrenceRules: [...state.recurrenceRules, recurrenceRule], })); } removeAllRecurrenceRules(): void { this.setState({recurrenceRules: []}); } // Save and remove save(): void { MockReminder._reminders.push(this); } remove(): void { const index = MockReminder._reminders.indexOf(this); if (index > -1) { MockReminder._reminders.splice(index, 1); } } // Static methods for fetching reminders private static async filterReminders( calendars: readonly Calendar[] | undefined, predicate: (reminder: MockReminder) => boolean, ): Promise<Reminder[]> { const reminders = this._reminders.filter(reminder => { if (calendars && calendars.length > 0) { return calendars.includes(reminder.calendar as Calendar) && predicate(reminder); } return predicate(reminder); }); return reminders as unknown as Reminder[]; } // Due Today static async allDueToday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= today && dueDate < tomorrow; }); } static async completedDueToday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= today && dueDate < tomorrow && reminder.isCompleted; }); } static async incompleteDueToday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= today && dueDate < tomorrow && !reminder.isCompleted; }); } // Due Tomorrow static async allDueTomorrow(calendars?: readonly Calendar[]): Promise<Reminder[]> { const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); tomorrow.setHours(0, 0, 0, 0); const dayAfter = new Date(tomorrow); dayAfter.setDate(dayAfter.getDate() + 1); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= tomorrow && dueDate < dayAfter; }); } static async completedDueTomorrow(calendars?: readonly Calendar[]): Promise<Reminder[]> { const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); tomorrow.setHours(0, 0, 0, 0); const dayAfter = new Date(tomorrow); dayAfter.setDate(dayAfter.getDate() + 1); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= tomorrow && dueDate < dayAfter && reminder.isCompleted; }); } static async incompleteDueTomorrow(calendars?: readonly Calendar[]): Promise<Reminder[]> { const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); tomorrow.setHours(0, 0, 0, 0); const dayAfter = new Date(tomorrow); dayAfter.setDate(dayAfter.getDate() + 1); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= tomorrow && dueDate < dayAfter && !reminder.isCompleted; }); } // Due Yesterday static async allDueYesterday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); yesterday.setHours(0, 0, 0, 0); const today = new Date(); today.setHours(0, 0, 0, 0); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= yesterday && dueDate < today; }); } static async completedDueYesterday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); yesterday.setHours(0, 0, 0, 0); const today = new Date(); today.setHours(0, 0, 0, 0); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= yesterday && dueDate < today && reminder.isCompleted; }); } static async incompleteDueYesterday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); yesterday.setHours(0, 0, 0, 0); const today = new Date(); today.setHours(0, 0, 0, 0); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= yesterday && dueDate < today && !reminder.isCompleted; }); } // Due This Week static async allDueThisWeek(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const startOfWeek = new Date(today); startOfWeek.setDate(today.getDate() - today.getDay()); const endOfWeek = new Date(startOfWeek); endOfWeek.setDate(endOfWeek.getDate() + 7); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= startOfWeek && dueDate < endOfWeek; }); } static async completedDueThisWeek(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const startOfWeek = new Date(today); startOfWeek.setDate(today.getDate() - today.getDay()); const endOfWeek = new Date(startOfWeek); endOfWeek.setDate(endOfWeek.getDate() + 7); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= startOfWeek && dueDate < endOfWeek && reminder.isCompleted; }); } static async incompleteDueThisWeek(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const startOfWeek = new Date(today); startOfWeek.setDate(today.getDate() - today.getDay()); const endOfWeek = new Date(startOfWeek); endOfWeek.setDate(endOfWeek.getDate() + 7); return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= startOfWeek && dueDate < endOfWeek && !reminder.isCompleted; }); } // Due Between static async allDueBetween(startDate: Date, endDate: Date, calendars?: readonly Calendar[]): Promise<Reminder[]> { return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= startDate && dueDate < endDate; }); } static async completedDueBetween( startDate: Date, endDate: Date, calendars?: readonly Calendar[], ): Promise<Reminder[]> { return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= startDate && dueDate < endDate && reminder.isCompleted; }); } static async incompleteDueBetween( startDate: Date, endDate: Date, calendars?: readonly Calendar[], ): Promise<Reminder[]> { return this.filterReminders(calendars, reminder => { const dueDate = reminder.dueDate; return dueDate !== null && dueDate >= startDate && dueDate < endDate && !reminder.isCompleted; }); } // Completed static async completedToday(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); return this.filterReminders(calendars, reminder => { const completionDate = reminder.completionDate; return completionDate !== null && completionDate >= today && completionDate < tomorrow; }); } static async completedThisWeek(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const startOfWeek = new Date(today); startOfWeek.setDate(today.getDate() - today.getDay()); const endOfWeek = new Date(startOfWeek); endOfWeek.setDate(endOfWeek.getDate() + 7); return this.filterReminders(calendars, reminder => { const completionDate = reminder.completionDate; return completionDate !== null && completionDate >= startOfWeek && completionDate < endOfWeek; }); } static async completedLastWeek(calendars?: readonly Calendar[]): Promise<Reminder[]> { const today = new Date(); today.setHours(0, 0, 0, 0); const endOfLastWeek = new Date(today); endOfLastWeek.setDate(today.getDate() - today.getDay()); const startOfLastWeek = new Date(endOfLastWeek); startOfLastWeek.setDate(endOfLastWeek.getDate() - 7); return this.filterReminders(calendars, reminder => { const completionDate = reminder.completionDate; return completionDate !== null && completionDate >= startOfLastWeek && completionDate < endOfLastWeek; }); } // Helper method to clear all reminders (for testing) static clearAll(): void { this._reminders = []; } }