feat: enhance CI workflow and update webapp styles
Some checks failed
CI / lint-and-test (push) Failing after 45s
Some checks failed
CI / lint-and-test (push) Failing after 45s
- Added Node.js setup and webapp testing steps to the CI workflow for improved integration. - Updated HTML to link multiple CSS files for better modularity and organization of styles. - Removed deprecated `style.css` and introduced new CSS files for base styles, calendar, day detail, hints, markers, states, and duty list to enhance maintainability and readability. - Implemented new styles for improved presentation of duty information and user interactions. - Added unit tests for new API functions and contact link rendering to ensure functionality and reliability.
This commit is contained in:
@@ -10,6 +10,10 @@ import {
|
||||
dutyOverlapsLocalRange,
|
||||
getMonday,
|
||||
formatHHMM,
|
||||
firstDayOfMonth,
|
||||
lastDayOfMonth,
|
||||
formatDateKey,
|
||||
dateKeyToDDMM,
|
||||
} from "./dateUtils.js";
|
||||
|
||||
describe("localDateString", () => {
|
||||
@@ -157,3 +161,70 @@ describe("formatHHMM", () => {
|
||||
expect(result).toMatch(/^\d{2}:\d{2}$/);
|
||||
});
|
||||
});
|
||||
|
||||
describe("firstDayOfMonth", () => {
|
||||
it("returns first day of month", () => {
|
||||
const d = new Date(2025, 5, 15);
|
||||
const result = firstDayOfMonth(d);
|
||||
expect(result.getFullYear()).toBe(2025);
|
||||
expect(result.getMonth()).toBe(5);
|
||||
expect(result.getDate()).toBe(1);
|
||||
});
|
||||
|
||||
it("handles January", () => {
|
||||
const d = new Date(2025, 0, 31);
|
||||
const result = firstDayOfMonth(d);
|
||||
expect(result.getDate()).toBe(1);
|
||||
expect(result.getMonth()).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe("lastDayOfMonth", () => {
|
||||
it("returns last day of month", () => {
|
||||
const d = new Date(2025, 0, 15);
|
||||
const result = lastDayOfMonth(d);
|
||||
expect(result.getFullYear()).toBe(2025);
|
||||
expect(result.getMonth()).toBe(0);
|
||||
expect(result.getDate()).toBe(31);
|
||||
});
|
||||
|
||||
it("returns 28 for non-leap February", () => {
|
||||
const d = new Date(2023, 1, 1);
|
||||
const result = lastDayOfMonth(d);
|
||||
expect(result.getDate()).toBe(28);
|
||||
expect(result.getMonth()).toBe(1);
|
||||
});
|
||||
|
||||
it("returns 29 for leap February", () => {
|
||||
const d = new Date(2024, 1, 1);
|
||||
const result = lastDayOfMonth(d);
|
||||
expect(result.getDate()).toBe(29);
|
||||
});
|
||||
});
|
||||
|
||||
describe("formatDateKey", () => {
|
||||
it("formats ISO date string as DD.MM (local time)", () => {
|
||||
const result = formatDateKey("2025-02-25T00:00:00Z");
|
||||
expect(result).toMatch(/^\d{2}\.\d{2}$/);
|
||||
const [day, month] = result.split(".");
|
||||
expect(Number(day)).toBeGreaterThanOrEqual(1);
|
||||
expect(Number(day)).toBeLessThanOrEqual(31);
|
||||
expect(Number(month)).toBeGreaterThanOrEqual(1);
|
||||
expect(Number(month)).toBeLessThanOrEqual(12);
|
||||
});
|
||||
|
||||
it("returns DD.MM format with zero-padding", () => {
|
||||
const result = formatDateKey("2025-01-05T12:00:00Z");
|
||||
expect(result).toMatch(/^\d{2}\.\d{2}$/);
|
||||
});
|
||||
});
|
||||
|
||||
describe("dateKeyToDDMM", () => {
|
||||
it("converts YYYY-MM-DD to DD.MM", () => {
|
||||
expect(dateKeyToDDMM("2025-02-25")).toBe("25.02");
|
||||
});
|
||||
|
||||
it("handles single-digit day and month", () => {
|
||||
expect(dateKeyToDDMM("2025-01-09")).toBe("09.01");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user