teqo/tests/unit/activityAgendaPeriodLabel.unit.spec.ts
Francisco Solla 51fb715ec7 feat(C101): agenda mobile com cara de app nativo — contexto no header, swipe, filtro sticky, dia na hora atual
- toolbar do FullCalendar some no mobile; título do header mostra o período
  ("9 Agosto", "3–9 Agosto", "Agosto", "Agenda") e tap volta ao hoje
- navegação por arrasto horizontal (useAgendaSwipeNavigation): limiar 48px,
  claim 12px com preventDefault, touchcancel sintético contra o long-press
  do FC, dateClick do dia suprimido (C91/C15 intactos)
- filtro vira strip edge-to-edge sem rótulo, sticky sob a barra do app
  (containing block via :has no padding do scroll container)
- visão de dia com scroll interno (height fixa), 08:00 na abertura,
  cabeçalho do dia fixo, scroll preservado ao trocar de dia
- desktop inalterado; impl plan + plano pós-critique (C101-ux)
2026-08-09 22:09:47 -03:00

125 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from 'vitest'
import { activityAgendaPeriodLabel, activityAgendaViewFromFcId } from '@/utilities/activityUi'
describe('activityAgendaPeriodLabel', () => {
it('rotula o dia pelo dia e mês', () => {
expect(
activityAgendaPeriodLabel(
'day',
'2026-08-09T00:00:00-03:00',
'2026-08-10T00:00:00-03:00',
'2026-08-09T00:00:00-03:00',
),
).toBe('9 Agosto')
})
it('rotula a semana pelo intervalo visível (segunda a domingo) no mesmo mês', () => {
expect(
activityAgendaPeriodLabel(
'week',
'2026-08-03T00:00:00-03:00',
'2026-08-10T00:00:00-03:00',
'2026-08-03T00:00:00-03:00',
),
).toBe('3–9 Agosto')
})
it('escreve os dois meses quando a semana cruza o limite do mês', () => {
expect(
activityAgendaPeriodLabel(
'week',
'2026-07-27T00:00:00-03:00',
'2026-08-03T00:00:00-03:00',
'2026-07-27T00:00:00-03:00',
),
).toBe('27 Julho – 2 Agosto')
})
it('cruza o ano sem omitir o dia final', () => {
expect(
activityAgendaPeriodLabel(
'week',
'2026-12-28T00:00:00-03:00',
'2027-01-04T00:00:00-03:00',
'2026-12-28T00:00:00-03:00',
),
).toBe('28 Dezembro – 3 Janeiro')
})
it('rotula o mês pelo mês ativo, não pelo início do grid (domingo antecedente)', () => {
expect(
activityAgendaPeriodLabel(
'month',
'2026-07-26T00:00:00-03:00',
'2026-09-01T00:00:00-03:00',
'2026-08-01',
),
).toBe('Agosto')
})
it('aceita o anchor como data civil pura (a forma do runtime, sem timezone)', () => {
// O runtime passa `formatBahiaCivilDate(getDate())` — "2026-09-01" sem
// offset. Parsear como instante UTC a deslocaria para 31 de agosto na
// Bahia (meia-noite UTC = 21:00 do dia anterior).
expect(
activityAgendaPeriodLabel(
'month',
'2026-08-31T00:00:00-03:00',
'2026-10-01T00:00:00-03:00',
'2026-09-01',
),
).toBe('Setembro')
})
it('mantém "Agenda" na lista, onde os dias aparecem no corpo', () => {
expect(
activityAgendaPeriodLabel(
'list',
'2026-08-01T00:00:00-03:00',
'2026-09-01T00:00:00-03:00',
'2026-08-01T00:00:00-03:00',
),
).toBe('Agenda')
})
it('retorna null para intervalo ilegível', () => {
expect(
activityAgendaPeriodLabel(
'day',
'não-é-data',
'2026-08-10T00:00:00-03:00',
'2026-08-09T00:00:00-03:00',
),
).toBeNull()
expect(
activityAgendaPeriodLabel(
'week',
'2026-08-03T00:00:00-03:00',
'não-é-data',
'2026-08-03T00:00:00-03:00',
),
).toBeNull()
expect(
activityAgendaPeriodLabel(
'month',
'2026-08-01T00:00:00-03:00',
'2026-09-01T00:00:00-03:00',
'não-é-data',
),
).toBeNull()
})
})
describe('activityAgendaViewFromFcId', () => {
it('espelha activityAgendaViewFcId para as quatro vistas', () => {
expect(activityAgendaViewFromFcId('timeGridWeek')).toBe('week')
expect(activityAgendaViewFromFcId('timeGridDay')).toBe('day')
expect(activityAgendaViewFromFcId('dayGridMonth')).toBe('month')
expect(activityAgendaViewFromFcId('listMonth')).toBe('list')
})
it('retorna null para um view id desconhecido', () => {
expect(activityAgendaViewFromFcId('multiMonthYear')).toBeNull()
})
})