- Rebrand all user-facing text to AgendaMax - Fix sidebar scrolling: card container no longer overflows html (flex h-full min-h-0) - Fix calendar toolbar hover: active buttons keep readable contrast - Sticky calendar toolbar (month/week/day always visible on scroll) - Seed guarantees 2-4 appointments per day for current week (Mon-Sat)
3.0 KiB
3.0 KiB
Task 2 Report — scheduling.ts pure functions + unit tests
Status
✅ COMPLETE — all acceptance criteria met.
Files changed
- Created
server/lib/scheduling.ts— 15 pure exports (types + functions), zero imports. ~95 lines. - Created
server/lib/scheduling.test.ts— 15test()blocks usingnode:test+node:assert/strict. - Modified
package.json— added"test:unit": "node --import tsx --test server/lib/scheduling.test.ts"toscripts.
Verification
npm run typecheck → 0 errors
> [email protected] typecheck
> tsc -b --noEmit
(clean — no diagnostics)
allowImportingTsExtensions: true is set in tsconfig.json, so import { ... } from "./scheduling.ts" resolves correctly under tsc.
npm run test:unit → all PASS
✔ parseWorkingHours: json válido → mapa 1..7
✔ parseWorkingHours: null/invalid → null
✔ isoDayOfWeek: lunes=1, domingo=7
✔ getWorkingHoursForDate: empleado tiene prioridad sobre negocio
✔ getWorkingHoursForDate: día cerrado → null
✔ normalizeText/tokens: quita acentos y lowercase
✔ specialtyMatch: coincidencia exacta de etiqueta → 1
✔ specialtyMatch: etiqueta con acento/case → 1
✔ specialtyMatch: sin etiquetas → 0.5
✔ specialtyMatch: etiqueta no relacionada → 0.5
✔ overlaps: bordes inclusivos de no-traslape
✔ hasConflict: lista vacía → false
✔ scoreCandidate: pesos 50/30/20
✔ scoreCandidate: mayor efficiency → mayor score
✔ scoreCandidate: menor load (más disponible) → mayor score
ℹ tests 15
ℹ pass 15
ℹ fail 0
ℹ duration_ms 201.8453
Summary line: # tests 15 | # pass 15 | # fail 0 | duration 201.8 ms
Deviations from plan
- None. The plan said "≈14 tests" but the spec actually contains 15
test()blocks — all 15 are present and pass. Code is verbatim from the plan (only the pure functions; no DB imports added — those belong to Task 3).
Self-review
- All 15 tests present? ✅ Counted 15
test(calls in the file; runner reportstests 15 / pass 15. scoreCandidateverifies 50/30/20 weights? ✅ The "pesos 50/30/20" test asserts three exact points on the response surface:(1, 1, 0)→ 100 (50·1 + 30·1 + 20·1)(0, 0, 1)→ 0 (all terms zero)(0.5, 0, 1)→ 25 (only specialty term contributes: 50·0.5 = 25) These three points uniquely pin the 50/30/20 coefficients — any other weights would fail at least one assertion. The two follow-up tests ("mayor efficiency", "menor load") additionally confirm the monotonic direction of each knob.
overlapsboundary case verified? ✅ The "bordes inclusivos de no-traslape" test explicitly assertsoverlaps(100, 200, 200, 300) === false— i.e. one window ending exactly when another starts is not an overlap. Two true-overlap cases (forward and reverse order) are also covered.- No DB leakage? ✅
scheduling.tshas zeroimportstatements and does not referenceDatabaseSync,db, or any module. Task 3 can append the DB section cleanly.
Concerns
None. Ready for Task 3.