------------------------------------------------------------------------ Publisher tests — 24 total, 24 passé, 0 échoué ------------------------------------------------------------------------ [PASS] normalizeVisibleBound: valeurs vides -> null [PASS] normalizeVisibleBound: Y-m-d -> début/fin de journée [PASS] normalizeVisibleBound: H:i et H:i:s [PASS] normalizeVisibleBound: datetime-local [PASS] normalizeVisibleBound: format invalide -> exception [PASS] normalizeVisibleBound: jour/mois inexistant -> exception [PASS] isItemVisible: aucune borne -> toujours visible [PASS] isItemVisible: bornes respectées France/Casablanca [PASS] isItemVisible: une seule borne [PASS] saveItem: rejette bornes inversées (until <= from) [PASS] saveItem: rejette titre manquant [PASS] saveItem/getMaxDisplayOrder/moveItem: ordonnancement [PASS] saveItem: display_order auto (max + 1) sans valeur fournie [PASS] moveItem: direction invalide = no-op silencieux [PASS] normalizeScreenId: nettoie les caractères interdits [PASS] remote token: généré puis validé, autre token refusé [PASS] remote token: écran inconnu refusé [PASS] tv token: rotate puis verify, ancien token révoqué [PASS] consumeScreenState: lecture consommatrice atomique [PASS] setScreenCommand: commande invalide ignorée [PASS] deleteScreen: respecte le propriétaire [PASS] designs: exposé [PASS] pairingStatus: expose fingerprint_hash quand appairé [PASS] pairingStatus: fingerprint vide pour écran non appairé ------------------------------------------------------------------------ OK