add block duration and test
All checks were successful
Check / Lint and Check (push) Successful in 33s
All checks were successful
Check / Lint and Check (push) Successful in 33s
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"eventDates": ["2025-09-05", "2025-10-25", "2025-12-06", "1999-01-01"],
|
"eventDates": ["2025-09-05", "2025-10-25", "2025-12-06", "1999-01-01"],
|
||||||
"cutoffTime": "23:00",
|
"cutoffTime": "23:00",
|
||||||
|
"blockDurationHours": 6,
|
||||||
"message": "Sign-ups are closed for today's event. Please come back tomorrow.",
|
"message": "Sign-ups are closed for today's event. Please come back tomorrow.",
|
||||||
|
|
||||||
"internalComment": "Add event dates in YYYY-MM-DD format. Signups will be disabled after 11pm (23:00) on these dates by default."
|
"internalComment": "Add event dates in YYYY-MM-DD format. Signups will be disabled after cutoffTime (23:00) for blockDurationHours (6 hours)."
|
||||||
}
|
}
|
||||||
|
|||||||
40
lib/signup-time-check.test.ts
Normal file
40
lib/signup-time-check.test.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { isSignupBlocked } from "./signup-time-check";
|
||||||
|
|
||||||
|
// Test helper to check different scenarios
|
||||||
|
function testScenario(description: string, date: Date, expected: boolean) {
|
||||||
|
const result = isSignupBlocked(date);
|
||||||
|
const status = result.blocked === expected ? "✅ PASS" : "❌ FAIL";
|
||||||
|
console.log(`${status} ${description}`);
|
||||||
|
console.log(` Expected blocked: ${expected}, Got: ${result.blocked}`);
|
||||||
|
if (result.message) {
|
||||||
|
console.log(` Message: ${result.message}`);
|
||||||
|
}
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run tests
|
||||||
|
console.log("Testing signup blocking logic...\n");
|
||||||
|
|
||||||
|
// October 25, 2025 at 22:00 (before cutoff)
|
||||||
|
testScenario("Oct 25 at 22:00 - Before cutoff", new Date("2025-10-25T22:00:00"), false);
|
||||||
|
|
||||||
|
// October 25, 2025 at 23:00 (exactly at cutoff)
|
||||||
|
testScenario("Oct 25 at 23:00 - At cutoff time", new Date("2025-10-25T23:00:00"), true);
|
||||||
|
|
||||||
|
// October 25, 2025 at 23:30 (during block period)
|
||||||
|
testScenario("Oct 25 at 23:30 - During block period", new Date("2025-10-25T23:30:00"), true);
|
||||||
|
|
||||||
|
// October 26, 2025 at 02:00 (3 hours into block)
|
||||||
|
testScenario("Oct 26 at 02:00 - 3 hours into block", new Date("2025-10-26T02:00:00"), true);
|
||||||
|
|
||||||
|
// October 26, 2025 at 04:59 (just before block ends)
|
||||||
|
testScenario("Oct 26 at 04:59:59 - Just before block ends", new Date("2025-10-26T04:59:59"), true);
|
||||||
|
|
||||||
|
// October 26, 2025 at 05:00 (block period over)
|
||||||
|
testScenario("Oct 26 at 05:00 - Block period ended", new Date("2025-10-26T05:00:00"), false);
|
||||||
|
|
||||||
|
// October 26, 2025 at 12:00 (well after block)
|
||||||
|
testScenario("Oct 26 at 12:00 - Well after block", new Date("2025-10-26T12:00:00"), false);
|
||||||
|
|
||||||
|
// Random non-event date
|
||||||
|
testScenario("Oct 20 at 23:00 - Non-event date", new Date("2025-10-20T23:00:00"), false);
|
||||||
@@ -1,17 +1,23 @@
|
|||||||
import eventConfig from "@/event-dates.json";
|
import eventConfig from "@/event-dates.json";
|
||||||
|
|
||||||
export function isSignupBlocked(): { blocked: boolean; message?: string } {
|
export function isSignupBlocked(currentTime?: Date): { blocked: boolean; message?: string } {
|
||||||
const now = new Date();
|
const now = currentTime || new Date();
|
||||||
const currentDate = now.toISOString().split("T")[0]; // YYYY-MM-DD format
|
const cutoffTime = eventConfig.cutoffTime || "15:00";
|
||||||
const currentTime = now.toTimeString().slice(0, 5); // HH:MM format
|
const blockDurationHours = eventConfig.blockDurationHours || 6;
|
||||||
|
|
||||||
// Check if today is an event date
|
// Check each event date to see if we're in a block period
|
||||||
const isEventDay = eventConfig.eventDates.includes(currentDate);
|
for (const eventDate of eventConfig.eventDates) {
|
||||||
|
// Parse the event date and cutoff time in local timezone
|
||||||
|
const [year, month, day] = eventDate.split("-").map(Number);
|
||||||
|
const [hours, minutes] = cutoffTime.split(":").map(Number);
|
||||||
|
const blockStart = new Date(year, month - 1, day, hours, minutes, 0, 0);
|
||||||
|
|
||||||
if (isEventDay) {
|
// Calculate when the block period ends (using wall-clock hours to handle DST correctly)
|
||||||
// Check if current time is after the cutoff time (default 15:00 / 3pm)
|
const blockEnd = new Date(blockStart);
|
||||||
const cutoffTime = eventConfig.cutoffTime || "15:00";
|
blockEnd.setHours(blockStart.getHours() + blockDurationHours);
|
||||||
if (currentTime >= cutoffTime) {
|
|
||||||
|
// Check if current time is within the block period
|
||||||
|
if (now >= blockStart && now < blockEnd) {
|
||||||
return {
|
return {
|
||||||
blocked: true,
|
blocked: true,
|
||||||
message: eventConfig.message,
|
message: eventConfig.message,
|
||||||
|
|||||||
Reference in New Issue
Block a user