Calendario: si vedono tutti gli orari validi, e il PDF ne fa una pagina ciascuno

Il popup mostrava solo l'orario del momento: chi guarda ad agosto vuole sapere
com'e' settembre per intero, e una griglia sola gli fa credere che valga per
sempre. Ora ci sono tutti quelli non ancora scaduti, ognuno con la sua etichetta
- In vigore, oppure la data da cui parte - e quelli passati spariscono da soli.

Il bottone scarica /calendario/tutti.pdf: un orario per pagina, con le giornate
fuori griglia ripetute su ognuna, perche' un foglio stampato da solo deve bastare
a se stesso. Gli id singoli restano validi per mandarne uno solo.

calendarioDaMostrare (uno) diventa calendariDaMostrare (tutti): una funzione
sola, non due che dicono cose simili - e' lo stesso difetto dei due link della
pagina servizi, che erano due espressioni per lo stesso indirizzo e sono
divergute.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-17 17:22:22 +02:00
parent d03c62641e
commit 69bd17a296
7 changed files with 207 additions and 147 deletions
+31 -32
View File
@@ -1,48 +1,47 @@
import { describe, it, expect } from 'vitest';
import { avvisi, avvisiAttivi, calendari, calendarioDaMostrare, DISCIPLINE, GIORNI, type Giorno } from '../src/data/calendari';
import { avvisi, avvisiAttivi, calendari, calendariDaMostrare, DISCIPLINE, GIORNI, type Giorno } from '../src/data/calendari';
const d = (iso: string) => new Date(iso);
describe('calendarioDaMostrare', () => {
it('in vigore: mostra quello del periodo', () => {
expect(calendarioDaMostrare(d('2026-09-05T10:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-1-18' }, futuro: false,
});
expect(calendarioDaMostrare(d('2026-09-25T10:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-21-in-poi' }, futuro: false,
});
// `to: null` = a tempo indeterminato: fra un anno vale ancora quello.
expect(calendarioDaMostrare(d('2027-03-01T10:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-21-in-poi' }, futuro: false,
});
describe('calendariDaMostrare', () => {
const idDi = (quando: string) => calendariDaMostrare(d(quando)).map((m) => `${m.cal.id}:${m.stato}`);
// Si vedono tutti insieme, non solo quello del momento: chi guarda ad agosto vuole sapere
// com'è settembre per intero, e una griglia sola gli farebbe credere che valga per sempre.
it('prima dell\'inizio: entrambi, marcati futuri', () => {
expect(idDi('2026-08-17T10:00:00+02:00'))
.toEqual(['settembre-1-18:futuro', 'settembre-21-in-poi:futuro']);
});
// Il link esiste prima che il primo orario cominci: ad agosto deve mostrare gli orari di
// settembre dichiarando che entrano dopo, non un "nessun calendario" che non dice niente.
it('prima dell\'inizio: mostra il prossimo, marcato come futuro', () => {
expect(calendarioDaMostrare(d('2026-08-17T10:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-1-18' }, futuro: true,
});
it('durante il primo periodo: il primo è in corso, il secondo resta annunciato', () => {
expect(idDi('2026-09-05T10:00:00+02:00'))
.toEqual(['settembre-1-18:in-corso', 'settembre-21-in-poi:futuro']);
});
// Un orario scaduto non deve restare in pagina: farebbe cercare lezioni che non ci sono più.
it('finito il primo periodo, il primo orario sparisce', () => {
expect(idDi('2026-09-25T10:00:00+02:00')).toEqual(['settembre-21-in-poi:in-corso']);
expect(idDi('2027-03-01T10:00:00+02:00')).toEqual(['settembre-21-in-poi:in-corso']);
});
// 19 e 20 settembre non stanno in nessuna griglia perché quei due giorni non hanno class:
// il 19 c'è la presentazione della nuova apertura, il 20 si sta chiusi (Adriano, 17/08).
// La griglia mostrata è quindi quella del 21, marcata futura, e l'informazione sui due
// giorni arriva dagli avvisi qui sotto.
it('nei due giorni fuori griglia (19-20 settembre) mostra il prossimo', () => {
expect(calendarioDaMostrare(d('2026-09-19T10:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-21-in-poi' }, futuro: true,
});
expect(calendarioDaMostrare(d('2026-09-20T23:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-21-in-poi' }, futuro: true,
});
it('nei due giorni fuori griglia resta il solo orario del 21, annunciato', () => {
expect(idDi('2026-09-19T10:00:00+02:00')).toEqual(['settembre-21-in-poi:futuro']);
expect(idDi('2026-09-20T23:00:00+02:00')).toEqual(['settembre-21-in-poi:futuro']);
});
it('confini al secondo, in ora italiana', () => {
expect(calendarioDaMostrare(d('2026-09-18T23:59:59+02:00'))?.cal.id).toBe('settembre-1-18');
expect(calendarioDaMostrare(d('2026-09-21T00:00:00+02:00'))).toMatchObject({
cal: { id: 'settembre-21-in-poi' }, futuro: false,
});
expect(idDi('2026-09-18T23:59:59+02:00'))
.toEqual(['settembre-1-18:in-corso', 'settembre-21-in-poi:futuro']);
expect(idDi('2026-09-19T00:00:00+02:00')).toEqual(['settembre-21-in-poi:futuro']);
expect(idDi('2026-09-21T00:00:00+02:00')).toEqual(['settembre-21-in-poi:in-corso']);
});
it('l\'ordine dell\'elenco di partenza non cambia il risultato', () => {
const rovescio = [...calendari].reverse();
expect(calendariDaMostrare(d('2026-09-05T10:00:00+02:00'), rovescio).map((m) => m.cal.id))
.toEqual(['settembre-1-18', 'settembre-21-in-poi']);
});
});