Nooloom - Tests unitaires

Started: 2026-10-25 15:42:01
Suites (59)
59 passed
0 failed
0 pending
Tests (606)
606 passed
0 failed
0 pending
buildRefinementPlans
assertion-kb : spec depuis le prompt de la destination (priorité au defaultPrompt)
passed
0.008s
buildRefinementPlans
assertion-kb : le prompt explicite de la destination écrase le defaultPrompt
passed
0.001s
buildRefinementPlans
assertion-kb : le prompt de la destination prime, quel que soit promptMode (plus de repli workflow)
passed
0.001s
buildRefinementPlans
assertion-kb : sans prompt de destination → defaultPrompt de la KB (pas de defaults.instruction)
passed
0.001s
buildRefinementPlans
assertion-kb : sans prompt ni defaultPrompt → instruction vide (aucun repli workflow)
passed
0.001s
buildRefinementPlans
aucun repli workflow : defaults.mode/spec/instruction sont ignorés
passed
0.001s
buildRefinementPlans
data-kb : spec = schéma de la KB
passed
0.001s
buildRefinementPlans
api : raffinage explicite (assertion)
passed
0.001s
buildRefinementPlans
api : raffinage data sans spec → schéma par défaut
passed
0.001s
buildRefinementPlans
déduplication : 2 assertion-kb avec le même prompt → 1 seul plan, 2 targets
passed
0.008s
buildRefinementPlans
pas de dédup : prompts différents → plans distincts
passed
0.001s
buildRefinementPlans
destination inconnue → erreur explicite
passed
0.055s
buildRefinementPlans
KB assertion utilisée en data-kb → erreur
passed
0.002s
buildRefinementPlans
type de destination invalide → erreur
passed
0.002s
buildRefinementPlans
destination sans id (type avec cible) → erreur
passed
0.001s
buildRefinementPlans
destination sans type → erreur
passed
0.001s
buildRefinementPlans
display : plan sans target, raffinage depuis le bloc
passed
0.001s
buildRefinementPlans
display : id absent accepté, aucun fetch KB/API ; refinement sans spec → spec vide cohérent
passed
0.003s
buildRefinementPlans
display : sans refinement → erreur explicite (plus de repli workflow)
passed
0.002s
buildRefinementPlans
display : refinement vide {} → erreur explicite
passed
0.001s
buildRefinementPlans
display : déduplication de deux blocs identiques → 1 plan sans target
passed
0.001s
buildRefinementPlans
llmModel : propagé dans le plan (assertion-kb)
passed
0.007s
buildRefinementPlans
llmModel : propagé dans le plan (api)
passed
0.001s
buildRefinementPlans
déduplication : même spec mais modèles différents → 2 plans
passed
0.015s
buildRefinementPlans
déduplication : même spec et même modèle → 1 plan, 2 targets
passed
0.001s
buildRefinementPlans
assertion-kb : refinement.spec de la destination écrase le prompt de la KB
passed
0.001s
buildRefinementPlans
data-kb : refinement.mode=data + spec honorés
passed
0s
buildRefinementPlans
data-kb : refinement.mode=assertion honoré (override du type KB)
passed
0s
buildRefinementPlans
api : refinement.mode=fact normalisé en assertion
passed
0.001s
buildRefinementPlans
destinations vides → aucun plan
passed
0s
buildRefinementPlans
destination unique (objet non-tableau) → un plan
passed
0.001s
buildRefinementPlans
mélange display + assertion-kb → 2 plans, le display sans target
passed
0.001s
buildRefinementPlans
semantic-kb : plan mode semantic, target kbId, spec = { kbId } (sans instruction)
passed
0.001s
buildRefinementPlans
semantic-kb : l'ontologie + SHACL suffisent (prompt destination ignoré)
passed
0s
buildRefinementPlans
semantic-kb : KB non sémantique → erreur
passed
0s
buildRefinementPlans
semantic-kb : deux KB distinctes ne sont pas fusionnées (kbId dans le spec)
passed
0.001s
buildRefinementPlans
display : refinement.mode=semantic conservé (instruction seule, sans cible)
passed
0.001s
buildRefinementPlans
display : mode semantic sans spec → {} (pas d'instruction)
passed
0.001s
buildRefinementPlans
api : refinement.mode=semantic + instruction
passed
0s
buildRefinementPlans
plan transmis au worker : { mode, spec, maxItems, llmModel, targets }
passed
0s
reconcile — groupEntities
construit une phrase par prédicat LITTÉRAL (rdf:type et relations exclus)
passed
0.008s
reconcile — groupEntities
ignore les relations : objet IRI, blank node, OU littéral ressemblant à une référence
passed
0.001s
reconcile — groupEntities
utilise le libellé du prédicat (ontologie) et le nom du sujet
passed
0.001s
reconcile — groupEntities
un sujet blank (`_:`) est une entité réconciliable (isBlank), pas ignoré
passed
0.001s
reconcile — groupEntities
mono-valué : une seule valeur conservée par prédicat (dédup intra-lot)
passed
0.001s
reconcile — groupEntities
functionalDuplicateKeys : clés des valeurs supplémentaires (on garde la 1re)
passed
0.001s
reconcile — groupEntities
mono-valué : une valeur par LANGUE conservée
passed
0.001s
reconcile — groupEntities
functionalDuplicateKeys : une valeur par langue
passed
0.001s
reconcile — groupEntities
tronque à MAX_VECTORS prédicats
passed
0.003s
reconcile — decideEntity
score fort → linked
passed
0.001s
reconcile — decideEntity
score moyen → proposed
passed
0s
reconcile — decideEntity
score faible ou aucun candidat → new
passed
0.001s
reconcile — decideEntity
borne forte incluse
passed
0s
reconcile — decideEntity
aliasMatch → linked même si score faible
passed
0.008s
reconcile — classifyPredicates
prédicat absent → add
passed
0s
reconcile — classifyPredicates
valeur identique → duplicate
passed
0s
reconcile — classifyPredicates
mono-valué divergent → conflict (mono-valué fourni par l'ontologie)
passed
0.001s
reconcile — classifyPredicates
langue (détection LLM) : contenu non taggé fr vs @fr différent → conflit
passed
0s
reconcile — classifyPredicates
langue (détection LLM) : contenu non taggé fr vs @en → conservé
passed
0.001s
reconcile — classifyPredicates
joker de langue : même texte, l'un sans langue → doublon
passed
0s
reconcile — classifyPredicates
langues différentes → valeur CONSERVÉE (pas un doublon)
passed
0.001s
reconcile — classifyPredicates
mono-valué : conflit uniquement dans la MÊME langue
passed
0s
reconcile — classifyPredicates
valeurs identiques à l'espacement près → duplicate
passed
0s
reconcile — classifyPredicates
multi-valué divergent → add
passed
0.001s
reconcile — remap global
réécrit sujets ET objets (références croisées)
passed
0s
reconcile — remap global
mapping vide → quads inchangés
passed
0.001s
reconcile — remap global
remap des blank nodes (sujet et objet) vers les IRI générées
passed
0s
reconcile — normalisation de langue (avant opérations)
isTextualLiteral : texte seul
passed
0.002s
reconcile — normalisation de langue (avant opérations)
untaggedTextValues (prédicats à range textuel) + applyLanguageTags
passed
0.001s
reconcile — blankEntityIri
stable et dépend du nom/type
passed
0s
reconcile — buildMapping
mappe les liens et les doublons nouveaux
passed
0.001s
reconcile — dedupeNew
deux nouveaux identiques → unifiés
passed
0s
reconcile — dedupeNew
deux nouveaux distincts → conservés
passed
0.001s
reconcile — objectText & entityToJsonLd
objectText : littéral, IRI (label local) et type inconnu
passed
0.01s
reconcile — objectText & entityToJsonLd
entityToJsonLd : types multiples + valeurs multiples
passed
0.001s
reconcile — objectText & entityToJsonLd
sujets blank inclus ; prédicats à objet référence (blank) exclus
passed
0.001s
reconcile — resolveEntities (deps injectées)
associe les vecteurs et classe les candidats (moyenne, 1 prédicat)
passed
0.001s
reconcile — resolveEntities (deps injectées)
moyenne : un candidat ne matchant qu'une partie des prédicats est pénalisé
passed
0.001s
reconcile — resolveEntities (deps injectées)
A. couverture : un prédicat absent du candidat ne pénalise plus
passed
0.005s
reconcile — resolveEntities (deps injectées)
A. couverture : candidat trop peu couvert écarté (< minOverlap)
passed
0s
reconcile — resolveEntities (deps injectées)
B. alias : nom entrant = alternateName du candidat
passed
0s
reconcile — resolveEntities (deps injectées)
B'. signal fort : même schema:url → aliasMatch
passed
0.001s
reconcile — resolveEntities (deps injectées)
garde la valeur IRI-like d'un prédicat localisateur (url)
passed
0s
reconcile — resolveEntities (deps injectées)
B. alias : signal fort sur TOUS les prédicats de nommage (dcterms:title, skos:prefLabel)
passed
0.001s
reconcile — resolveEntities (deps injectées)
verify : filtre les candidats avant confirmation
passed
0.001s
reconcile — resolveEntities (deps injectées)
mode dégradé si les embeddings sont indisponibles
passed
0s
reconcile — resolveEntities (deps injectées)
agents sans prédicat : pas d'appel de recherche
passed
0.001s
reconcile — buildEntityRecord
vecteurs alignés 1:1 et jsonld compact
passed
0.001s
configuration
isEnabled = true si issuer + clientId
passed
0.002s
createPkcePair
produit un challenge = sha256(verifier) en base64url
passed
0s
state signé
signe et vérifie un payload
passed
0.007s
state signé
rejette un state altéré
passed
0.008s
start
construit l'URL d'autorisation avec PKCE + state + nonce
passed
0.006s
finish
échange le code et renvoie les claims (happy path)
passed
0.02s
finish
erreur fournisseur (access_denied)
passed
0.002s
finish
cookie absent → invalid_state
passed
0.001s
finish
state incohérent → invalid_state
passed
0.003s
finish
échec de l’échange du code → exchange_failed
passed
0.003s
verifyIdToken
accepte un token valide
passed
0.003s
verifyIdToken
rejette une signature invalide
passed
0.8s
verifyIdToken
rejette un aud incorrect
passed
0.004s
verifyIdToken
rejette un iss incorrect
passed
0.005s
verifyIdToken
rejette un nonce différent
passed
0.004s
verifyIdToken
rejette une clé JWKS introuvable
passed
0.003s
normalizeClaims
normalise email/nom/picture
passed
0s
normalizeClaims
repli sur preferred_username quand email absent
passed
0.001s
normalizeClaims
erreur no_email si aucun identifiant
passed
0s
parseCookies
parse un en-tête cookie multiple
passed
0s
job-polling / normalizeJobStatus
normalise COMPLETED → completed
passed
0.002s
job-polling / normalizeJobStatus
normalise completed → completed
passed
0.001s
job-polling / normalizeJobStatus
normalise succeeded → completed
passed
0s
job-polling / normalizeJobStatus
normalise FAILED → failed
passed
0s
job-polling / normalizeJobStatus
normalise error → failed
passed
0.001s
job-polling / normalizeJobStatus
normalise CANCELED → canceled
passed
0s
job-polling / normalizeJobStatus
normalise cancelled → canceled
passed
0s
job-polling / normalizeJobStatus
normalise TERMINATED → terminated
passed
0s
job-polling / normalizeJobStatus
normalise TIMED_OUT → timed_out
passed
0.001s
job-polling / normalizeJobStatus
normalise timeout → timed_out
passed
0s
job-polling / normalizeJobStatus
normalise RUNNING → running
passed
0s
job-polling / normalizeJobStatus
normalise pending → running
passed
0s
job-polling / normalizeJobStatus
normalise not_found → not_found
passed
0.001s
job-polling / normalizeJobStatus
statut absent → unknown
passed
0s
job-polling / isTerminalStatus
statuts terminaux
passed
0.001s
job-polling / isTerminalStatus
statuts non terminaux
passed
0s
job-polling / pollUntilTerminal
s'arrête au premier poll si terminal (aucun sleep)
passed
0.002s
job-polling / pollUntilTerminal
boucle puis s'arrête sur statut terminal (sleeps = polls - 1)
passed
0.001s
job-polling / pollUntilTerminal
s'arrête aussi sur un statut terminal en échec
passed
0.001s
job-polling / pollUntilTerminal
borne globale respectée : jamais plus de maxPolls appels, timedOut=true
passed
0s
job-polling / pollUntilTerminal
le prédicat isTerminal personnalisé peut arrêter la boucle
passed
0s
job-polling / pollUntilTerminal
bornes métier cohérentes (60 min extraction / 10 min synthèse à 5 s)
passed
0.002s
job-polling / formatExtractionJobResult
completed : réécrit localhost:9090 vers MinIO et préfère md/html
passed
0.001s
job-polling / formatExtractionJobResult
completed sans output exploitable : contentUrl null mais success
passed
0s
job-polling / formatExtractionJobResult
failed : success=false + message
passed
0s
job-polling / formatExtractionJobResult
running : success=false, pas de sortie, non terminal
passed
0.001s
job-polling / formatExtractionJobResult
not_found reste non terminal (le workflow continue d'attendre)
passed
0s
job-polling / formatSynthesisJobResult
completed : compte les assertions et collecte les destinations dispatchées
passed
0.001s
job-polling / formatSynthesisJobResult
completed sans assertion ni destination
passed
0.001s
job-polling / formatSynthesisJobResult
failed : success=false
passed
0s
job-polling / formatSynthesisJobResult
running : non terminal
passed
0s
GraphView3D — données transmises
copie les nœuds et les liens (la simulation mute les objets)
passed
0.044s
GraphView3D — données transmises
conserve les données quand le parent renvoie des tableaux de même contenu
passed
0.007s
GraphView3D — données transmises
préserve les positions des nœuds déjà calculées lors d’une expansion
passed
0.007s
GraphView3D — données transmises
ignore les liens dont une extrémité manque
passed
0.004s
GraphView3D — données transmises
expose les constantes de simulation alignées sur la 2D
passed
0.01s
GraphView3D — données transmises
applique les forces une seule fois (pas de re-démarrage à chaque rendu)
passed
0.005s
GraphView3D — données transmises
affiche le message d’état vide sans monter la scène
passed
0.018s
GraphView3D — couleurs et surlignage
garde la couleur de classe pour la sélection et grise le hors-classe
passed
0.004s
GraphView3D — couleurs et surlignage
se replie sur la couleur du type de terme
passed
0.005s
GraphView3D — couleurs et surlignage
n’atténue rien sans classe surlignée
passed
0.006s
GraphView3D — couleurs et surlignage
atténue les liens hors de la classe surlignée
passed
0.017s
GraphView3D — libellés
libelle uniquement la sélection et son voisinage 1
passed
0.01s
GraphView3D — libellés
ajoute un contour à la sélection et un simple libellé aux voisins
passed
0.011s
GraphView3D — libellés
n’affiche aucun libellé permanent sans sélection
passed
0.003s
GraphView3D — libellés
transmet un libellé tronqué à 24 caractères et marque la sélection
passed
0.004s
GraphView3D — libellés
tronque le tooltip à 80 caractères et ajoute la classe préfixée
passed
0.003s
GraphView3D — libellés
échappe le HTML du libellé (données de la KB)
passed
0.002s
GraphView3D — libellés
affiche le prédicat préfixé au survol d’un lien
passed
0.003s
GraphView3D — interactions
transmet l’id du nœud cliqué
passed
0.005s
GraphView3D — interactions
ne casse pas au clic sans callback
passed
0.002s
GraphView3D — interactions
recentre la cible d’orbite et cadre la caméra
passed
0.104s
extractVectors (US-3)
null / absent → []
passed
0.003s
extractVectors (US-3)
vecteur unique (number[]) → [[...]]
passed
0.001s
extractVectors (US-3)
multi-vecteurs (number[][]) → inchangé
passed
0s
extractVectors (US-3)
forme Meilisearch { embeddings } → normalisée
passed
0.001s
extractVectors (US-3)
valeur non-array → []
passed
0s
similarityOf (US-1)
priorité vectorSort.similarity
passed
0.001s
similarityOf (US-1)
repli _semanticScore puis _rankingScore
passed
0.001s
isNearDuplicate (US-1 — borne exacte)
seuil inclus
passed
0.001s
isNearDuplicate (US-1 — borne exacte)
seuil par défaut = 0.95
passed
0.001s
buildMergeMessages (US-2)
contient les deux payloads
passed
0.002s
parseMergedJson (US-2)
JSON nu
passed
0.001s
parseMergedJson (US-2)
clôture Markdown ```json
passed
0.015s
parseMergedJson (US-2)
invalide / vide / tableau → null
passed
0.001s
planMerge (US-3 — id réutilisé, vecteurs cumulés)
score sous le seuil → pas de fusion
passed
0.001s
planMerge (US-3 — id réutilisé, vecteurs cumulés)
fusion : id du hit + vecteurs existants + nouveau
passed
0.001s
planMerge (US-3 — id réutilisé, vecteurs cumulés)
sans vecteur existant → un seul vecteur (entrant)
passed
0s
planMerge (US-3 — id réutilisé, vecteurs cumulés)
id absent → pas de fusion
passed
0s
mergeRecords (US-2 / US-4 — LLM sans raisonnement)
appel sans raisonnement + modèle par défaut + fusion
passed
0.001s
mergeRecords (US-2 / US-4 — LLM sans raisonnement)
réponse non-JSON → null (repli)
passed
0.001s
mergeRecords (US-2 / US-4 — LLM sans raisonnement)
sans clé API → null sans appel
passed
0.001s
mergeRecords (US-2 / US-4 — LLM sans raisonnement)
erreur HTTP → null (repli)
passed
0.02s
searchNearDuplicate (US-1)
hit ≥ seuil → { hit, score }
passed
0.001s
searchNearDuplicate (US-1)
hit < seuil → null
passed
0s
searchNearDuplicate (US-1)
aucun vecteur → null sans appel
passed
0.014s
fetchExistingVectors (US-3)
GET ?retrieveVectors=true → vecteurs normalisés
passed
0.001s
fetchExistingVectors (US-3)
id absent → [] sans appel
passed
0s
Request interceptor
ajoute le header Authorization Bearer si un jeton est présent
passed
0.003s
Request interceptor
préfixe l’url avec l’orgId pour une route org-scopée
passed
0.001s
Request interceptor
ne préfixe pas les routes globales (auth, organizations, admin, users, plans)
passed
0.002s
Request interceptor
ne préfixe pas si l’url commence déjà par un orgId
passed
0s
Request interceptor
ne préfixe pas les routes single-resource (/workflows/:id)
passed
0s
Request interceptor
ne préfixe pas les POST (sauf /config/test/)
passed
0s
Request interceptor
ne préfixe pas si aucun orgId n’est résolu
passed
0.001s
Response interceptor
sur 401 non-public : supprime le jeton et rejette (redirection /login couverte en E2E)
passed
0.015s
Response interceptor
sur 401 route publique (/agents/, /sessions/) : ne supprime pas le jeton
passed
0.007s
Response interceptor
sur erreur non-401 : rejette sans effet de bord
passed
0s
Response interceptor
l’intercepteur succès renvoie la réponse telle quelle
passed
0.01s
workflowAPI
extract : lève une erreur si workflowId manquant
passed
0.049s
workflowAPI
extract : string source → { url }
passed
0.001s
workflowAPI
extract : objet source avec url → fusionné
passed
0.001s
workflowAPI
extract : source invalide → erreur
passed
0.001s
workflowAPI
extractGeneric : URL fichier → fileUrl
passed
0.001s
workflowAPI
extractGeneric : URL web → url
passed
0.001s
workflowAPI
extractGeneric : objet avec fileId → fileId
passed
0.001s
sendStreamMessage
retourne le reader si la réponse est ok
passed
0.001s
sendStreamMessage
lève une erreur avec le message API si !ok
passed
0.001s
sendStreamMessage
ajoute le jeton dans les headers si présent
passed
0s
migration 20260916_009
detect : true si un crawlerconfig porte un extractPrompt non vide
passed
0.001s
migration 20260916_009
detect : false si extractPrompt absent ou vide
passed
0s
migration 20260916_009
up (a) : config sans destination → destination display créée + extractPrompt retiré
passed
0.002s
migration 20260916_009
up (a) : maxAssertions/maxItems/maxFacts absents → 50 et modèle par défaut
passed
0.001s
migration 20260916_009
up (b) : destinations sans instruction → instruction renseignée, KB avec prompt et data-kb intactes
passed
0.001s
migration 20260916_009
up (c) : destination avec instruction ou prompt déjà présent → non modifiée, extractPrompt retiré
passed
0.001s
migration 20260916_009
up (d) : aucun extractPrompt → aucun update
passed
0.001s
migration 20260916_009
up : extractPrompt vide → pas de destination créée mais champ retiré
passed
0.001s
migration 20260916_009
up est idempotent : detect() repasse à false après exécution
passed
0s
organizationAdminSummary.percentOf
arrondit la consommation au pourcentage entier
passed
0.002s
organizationAdminSummary.percentOf
retourne null sans quota (ou quota nul)
passed
0.001s
organizationAdminSummary.percentOf
tolère une consommation absente ou invalide
passed
0.001s
organizationAdminSummary.mapMembers
place le propriétaire en premier puis trie par date d’arrivée
passed
0.001s
organizationAdminSummary.mapMembers
classe les membres sans date d’arrivée en dernier, sans casser l’ordre
passed
0s
organizationAdminSummary.mapMembers
affiche « Inconnu » pour un utilisateur supprimé
passed
0.001s
organizationAdminSummary.mapMembers
retourne une liste vide si aucune membership
passed
0s
organizationAdminSummary.buildUsageSummary
calcule used / limit / percent pour les trois ressources
passed
0.002s
organizationAdminSummary.buildUsageSummary
priorise le plan effectif sur le snapshot de la période
passed
0.013s
organizationAdminSummary.buildUsageSummary
retombe sur le snapshot seulement quand aucun plan n’est résoluble
passed
0.001s
organizationAdminSummary.buildUsageSummary
conserve un quota illimité (null) du plan effectif
passed
0.001s
organizationAdminSummary.buildUsageSummary
affiche ∞ (limit null) quand aucun quota n’est défini
passed
0.001s
organizationAdminSummary.buildUsageSummary
retombe sur le snapshot KB et zéro sans période
passed
0.001s
organizationAdminSummary.buildUsageSummary
marque les dépassements sans plafonner le pourcentage
passed
0s
organizationAdminSummary.mapWithConcurrency
conserve l’ordre des résultats
passed
0.005s
organizationAdminSummary.mapWithConcurrency
borne la concurrence au maximum demandé
passed
0.022s
organizationAdminSummary.mapWithConcurrency
gère les listes vides et les limites aberrantes
passed
0.001s
sparql — garde-fous de lecture (§8.1.1)
accepte une lecture simple
passed
0.003s
sparql — garde-fous de lecture (§8.1.1)
rejette les requêtes vides
passed
0.033s
sparql — garde-fous de lecture (§8.1.1)
rejette les mises à jour (INSERT/DELETE/LOAD/DROP...)
passed
0.004s
sparql — garde-fous de lecture (§8.1.1)
rejette GRAPH / FROM / SERVICE (isolation multi-tenant)
passed
0.002s
sparql — garde-fous de lecture (§8.1.1)
rejette une requête sans mot-clé de lecture
passed
0.001s
sparql — scoping aux graphs de la KB
injecte les FROM avant WHERE
passed
0.001s
sparql — scoping aux graphs de la KB
injecte les FROM avant le bloc `{` (SELECT sans WHERE)
passed
0.001s
sparql — scoping aux graphs de la KB
conserve les PREFIX
passed
0s
sparql — scoping aux graphs de la KB
échoue si aucun graph
passed
0.001s
sparql — filtrage temporel (PRD §17)
valide une fenêtre temporelle
passed
0.016s
sparql — filtrage temporel (PRD §17)
rejette les dates invalides et x-from > x-to
passed
0.002s
sparql — filtrage temporel (PRD §17)
sans from/to : comportement identique au scoping simple
passed
0.007s
sparql — filtrage temporel (PRD §17)
avec from/to : injecte FROM + FILTER EXISTS sur la période de validité
passed
0.001s
sparql — filtrage temporel (PRD §17)
uniquement x-from : borne la fin de validité
passed
0.001s
sparql — filtrage temporel (PRD §17)
respecte les garde-fous (GRAPH interdit)
passed
0.001s
sparql — métadonnées de triplet (PRD §18)
scopé au graphe :data, jointure :time, projection métadonnées
passed
0.001s
sparql — métadonnées de triplet (PRD §18)
filtre de chevauchement avec from/to (jointure requise)
passed
0.002s
sparql — métadonnées de triplet (PRD §18)
filtre par sujet + limite bornée
passed
0.001s
sparql — métadonnées de triplet (PRD §18)
dates invalides → SparqlError ; graphes requis
passed
0.003s
measureNodes
calcule le centre et la plus grande dimension
passed
0.002s
measureNodes
ignore les nœuds sans position (simulation pas encore initialisée)
passed
0.001s
measureNodes
renvoie null si aucune position valide
passed
0.001s
createGizmo
construit un axe par dimension plus un anneau
passed
0.001s
createGizmo
exclut le repère du picking (raycast neutralisé)
passed
0.004s
updateGizmo
suit la cible d’orbite avec une taille d’écran constante
passed
0.003s
updateGizmo
se rabat sur une taille fixe sans caméra
passed
0s
updateGizmo
ne fait rien sans cible (graphe non monté)
passed
0s
disposeGizmo
libère géométries et matériaux puis retire le repère
passed
0.001s
disposeGizmo
tolère un repère absent
passed
0.001s
fitDistanceForNodes
place la caméra assez loin pour contenir tous les nœuds
passed
0.001s
fitDistanceForNodes
tient compte de la perspective : un nœud en arrière-plan exige plus de recul
passed
0.001s
fitDistanceForNodes
respecte un champ de vision étroit (écran portrait)
passed
0.001s
fitDistanceForNodes
renvoie null sans position valide
passed
0s
focusCamera
place la cible sur le nœud en conservant direction et distance
passed
0.001s
focusCamera
utilise la distance courante si elle n’est pas fournie
passed
0.001s
focusCamera
borne la distance (garde-fous)
passed
0s
focusCamera
renvoie null si le nœud n’a pas de position
passed
0s
semantic-core — prompt (D4)
injecte OWL + SHACL + document et demande du JSON-LD
passed
0.003s
semantic-core — prompt (D4)
plusieurs ontologies et plusieurs SHACL sont listés séparément
passed
0.003s
semantic-core — prompt (D4)
mentionne (none provided) sans ontologie
passed
0s
semantic-core — parseRdf (D10)
parse le Turtle (graphe)
passed
0.063s
semantic-core — parseRdf (D10)
parse le JSON-LD
passed
0.172s
semantic-core — parseRdf (D10)
rejette un format inconnu
passed
0.005s
semantic-core — JSON-LD standard (@id/@type)
toJsonLd produit @id / @type et conserve les relations
passed
0.004s
semantic-core — JSON-LD standard (@id/@type)
toJsonLd compacte avec un @context (préfixes)
passed
0.006s
semantic-core — JSON-LD standard (@id/@type)
extractPrefixes lit @prefix et PREFIX
passed
0.001s
semantic-core — vérification de cohérence (seul post-traitement)
ok quand toutes les classes/propriétés sont déclarées
passed
0.001s
semantic-core — vérification de cohérence (seul post-traitement)
signale les termes hors ontologie
passed
0.001s
semantic-core — vérification de cohérence (seul post-traitement)
sans ontologie → ok (rien à vérifier)
passed
0.001s
migration 20260916_008
detect : true si un workflow porte des champs legacy
passed
0.001s
migration 20260916_008
detect : true si un crawlerconfig porte config.synthetiser
passed
0.001s
migration 20260916_008
detect : false sur un état déjà migré
passed
0s
migration 20260916_008
up : workflow sans destination + spec significatif → display créée + champs legacy retirés
passed
0.001s
migration 20260916_008
up : workflow data sans destination + schéma → display mode data, modèle par défaut
passed
0.001s
migration 20260916_008
up : workflow avec destinations → aucune display créée, champs legacy retirés
passed
0.001s
migration 20260916_008
up : workflow sans destination mais spec non significatif → nettoyage seul
passed
0s
migration 20260916_008
up : crawler config.synthetiser non significatif → legacy retiré, aucune display
passed
0.001s
migration 20260916_008
up : crawler avec raffinage significatif sans destination → display + legacy retiré
passed
0.001s
migration 20260916_008
up est idempotent : detect() repasse à false après exécution
passed
0s
fetchUser
sans jeton : non authentifié, authChecked=true
passed
0.069s
fetchUser
avec jeton valide : authentifie l’utilisateur et charge les orgs
passed
0.015s
fetchUser
avec jeton rejeté en 401 : logout (jeton supprimé)
passed
0.013s
fournisseurs (authProviders)
expose oidc=true quand le SSO est configuré
passed
0.012s
fournisseurs (authProviders)
oidc=false par défaut quand non configuré
passed
0.02s
actions
logout : vide l’état et le jeton
passed
0.021s
actions
updateSettings : met à jour l’utilisateur en cas de succès
passed
0.025s
actions
deleteAccount : appelle DELETE /auth/me et se déconnecte
passed
0.017s
buildDedupKey
est déterministe et varie selon scheduleId et token
passed
0.001s
executeScheduledTrigger — idempotence au rejeu
déclenche et mémorise le jobId au premier appel
passed
0.005s
executeScheduledTrigger — idempotence au rejeu
rejoue (même runId) : réutilise le jobId sans second POST
passed
0.002s
executeScheduledTrigger — idempotence au rejeu
un runId différent déclenche un nouveau job
passed
0.012s
executeScheduledTrigger — idempotence au rejeu
marque l'échec sans écrire de clé si le POST échoue
passed
0.001s
executeScheduledTrigger — idempotence au rejeu
ne déclenche pas si la planification est en pause
passed
0.002s
executeScheduledTrigger — idempotence au rejeu
déclenche quand même si Redis est indisponible (dédup best-effort)
passed
0.002s
makeLabelSprite
produit un sprite avec texture canvas et texte rendu
passed
0.003s
makeLabelSprite
tronque les libellés à 24 caractères
passed
0.001s
makeLabelSprite
élargit le sprite avec la longueur du libellé
passed
0.001s
makeLabelSprite
écrit le libellé sélectionné en slate-900 (norme 2D, sans pastille)
passed
0.001s
makeLabelSprite
trace un halo clair pour la lisibilité, sélectionné ou non
passed
0.001s
makeLabelSprite
renvoie null pour un libellé vide
passed
0.007s
makeLabelSprite
renvoie null si le contexte 2D est indisponible
passed
0s
makeLabelSprite
renvoie null si le rendu canvas lève
passed
0.001s
scaleLabelSprite
conserve le ratio et suit la distance caméra (taille d’écran constante)
passed
0.002s
scaleLabelSprite
ignore une distance invalide (avant le premier rendu)
passed
0s
temporal — sérialisation des termes (RDF 1.2)
IRI, blank node, littéral simple et typé
passed
0.001s
temporal — sérialisation des termes (RDF 1.2)
triple term → <<( s p o )>>
passed
0.001s
temporal — sérialisation des termes (RDF 1.2)
échappe les littéraux
passed
0s
temporal — reifier déterministe
stable pour le même triplet
passed
0.001s
temporal — reifier déterministe
différent pour un triplet différent
passed
0.001s
temporal — reifier déterministe
timeGraphIri dérivé du dataset
passed
0s
temporal — buildAnnotations (US-1)
annotation complète : reifies + création + provenance + validité
passed
0.002s
temporal — buildAnnotations (US-1)
validité absente → début = date du jour, pas de fin
passed
0.007s
temporal — buildAnnotations (US-1)
provenance dégradée sans jobId → pas de wasGeneratedBy
passed
0s
temporal — buildAnnotations (US-1)
idempotence : deux appels produisent le même N-Quads
passed
0.001s
temporal — buildAnnotations (US-1)
validité invalide → ignorée, fallback date du jour
passed
0s
temporal — buildAnnotations (US-1)
datasetIri requis
passed
0.058s
temporal — toIsoDate
normalise ISO et date nue
passed
0.001s
labels — noms
localName
passed
0.007s
labels — noms
predicateLabel préfère le libellé, sinon le nom local
passed
0.001s
labels — noms
nameOfEntity suit la liste fournie
passed
0.001s
labels — extraction des métadonnées
parsePredicateLabels (turtle)
passed
0.005s
labels — extraction des métadonnées
parsePredicateLabels : contenu invalide → {} (pas d'exception)
passed
0.001s
labels — extraction des métadonnées
buildPredicateLabels fusionne plusieurs sources
passed
0.11s
labels — extraction des métadonnées
extractTextPredicates : prédicats à range schema:Text / rdf:langString
passed
0.002s
labels — extraction des métadonnées
extractFunctionalPredicates (OWL + SHACL, aucune liste en code)
passed
0.001s
labels — extraction des métadonnées
buildOntologyMeta : libellés + prédicats mono-valués
passed
0.009s
labels — extraction des métadonnées
buildOntologyMeta : sources vides → valeurs neutres
passed
0.007s
AdminOrganizations
affiche la consommation face aux quotas pour chaque organisation
passed
0.188s
AdminOrganizations
ouvre la modale des utilisateurs et ferme avec Échap
passed
0.232s
AdminOrganizations
affiche un état vide dans la modale sans membre
passed
0.085s
AdminOrganizations
affiche un bandeau d’erreur si l’API échoue
passed
0.015s
AdminOrganizations
bascule une organisation en plan sur mesure et rafraîchit le tableau
passed
0.198s
AdminOrganizations
repasse une organisation sur mesure en gratuit avec conversion des centimes
passed
0.214s
stableItemId
is deterministic: same (jobId, planIndex, index) → same id
passed
0.001s
stableItemId
changes when planIndex or item index changes
passed
0.001s
stableItemId
defaults a missing planIndex to 0
passed
0s
stableItemId
sanitizes ids to Meilisearch-compatible characters
passed
0s
stableItemId
returns undefined without a jobId (backward compatible)
passed
0.001s
toAssertionPayload
produces identical ids across two calls with the same inputs (replay = upsert)
passed
0.001s
toAssertionPayload
does not add an id when no jobId is provided
passed
0s
toAssertionPayload
preserves the item data (text, source, url, confidence)
passed
0.001s
toDocumentPayload
produces identical ids across two calls with the same inputs
passed
0.001s
toDocumentPayload
does not add an id when no jobId is provided
passed
0s
toDocumentPayload
preserves the item data and source
passed
0s
non-array refined output (LLM shape tolerance)
toAssertionPayload wraps a single object into one assertion
passed
0s
non-array refined output (LLM shape tolerance)
toDocumentPayload wraps a single object into one document
passed
0.001s
non-array refined output (LLM shape tolerance)
treats null and undefined as empty arrays
passed
0.007s
verifyInternalToken
accepts a freshly created token and returns its payload
passed
0.002s
verifyInternalToken
rejects a token with an invalid signature
passed
0s
verifyInternalToken
rejects a token with a tampered payload
passed
0.001s
verifyInternalToken
rejects a token with a malformed signature (wrong length)
passed
0.001s
verifyInternalToken
rejects an expired token
passed
0.001s
verifyInternalToken
rejects a token whose iat is too far in the future
passed
0s
verifyInternalToken
rejects missing or malformed tokens
passed
0.001s
requireInternalKey
rejects a request with no internal token (401)
passed
0s
requireInternalKey
rejects a request with an invalid internal token (401)
passed
0s
requireInternalKey
accepts a request with a valid internal token and exposes req.internalSvc
passed
0.001s
SemanticGraphViewer — mode d’affichage
affiche la vue 2D par défaut
passed
0.172s
SemanticGraphViewer — mode d’affichage
bascule en 3D au clic et mémorise le choix
passed
0.098s
SemanticGraphViewer — mode d’affichage
revient en 2D sans recharger les données
passed
0.156s
SemanticGraphViewer — mode d’affichage
restaure le mode 3d enregistré quand WebGL est disponible
passed
0.03s
SemanticGraphViewer — mode d’affichage
force la 2D et désactive le bouton quand WebGL est absent
passed
0.082s
SemanticGraphViewer — mode d’affichage
remonte le compteur de sujets et liens dans les deux modes
passed
0.07s
fetchOrganizations
charge les organisations en cas de succès
passed
0.002s
fetchOrganizations
gère l’échec du fetch
passed
0.001s
createOrganization
crée l’organisation et la définit courante
passed
0.002s
createOrganization
gère l’échec de création
passed
0s
switchOrganization
ne fait rien si l’org n’existe pas
passed
0.006s
switchOrganization
définit l’org courante et persiste la préférence serveur
passed
0.001s
switchOrganization
reste fonctionnel si l’appel échoue
passed
0s
DestinationsEditor — raffinage sémantique (affichage / API)
coupleToDestination : semantic + display -> spec avec sources
passed
0.002s
DestinationsEditor — raffinage sémantique (affichage / API)
coupleToDestination : semantic + api -> id + spec
passed
0.001s
DestinationsEditor — raffinage sémantique (affichage / API)
coupleToDestination : semantic + semantic-kb -> kbId dans le spec
passed
0.002s
DestinationsEditor — raffinage sémantique (affichage / API)
destinationToCouple : api + mode semantic restaure les sources
passed
0.007s
DestinationsEditor — raffinage sémantique (affichage / API)
destinationToCouple : display + mode semantic
passed
0s
DestinationsEditor — raffinage sémantique (affichage / API)
isCoupleValid : règles sémantiques (pas d'instruction requise)
passed
0.001s
DestinationsEditor — raffinage sémantique (affichage / API)
raisonnement activé par défaut : absent du spec
passed
0.001s
DestinationsEditor — raffinage sémantique (affichage / API)
raisonnement désactivé + budget : présents dans le spec, restaurés
passed
0.001s
terminateObsoleteWorkflows
termine uniquement les types obsolètes et épargne les types courants
passed
0.002s
terminateObsoleteWorkflows
parcourt toutes les pages de résultats
passed
0.001s
terminateObsoleteWorkflows
ne fait rien quand aucun workflow ne tourne
passed
0.001s
terminateObsoleteWorkflows
poursuit le nettoyage si une terminaison échoue
passed
0s
terminateObsoleteWorkflows
expose la liste des types obsolètes connus
passed
0.001s
Schedule Model
should create a valid schedule
passed
0.03s
Schedule Model
should reject missing organizationId
passed
0.016s
Schedule Model
should reject missing cronExpression
passed
0.001s
Schedule Model
should reject invalid lastRunStatus
passed
0.002s
Schedule Model
should accept valid lastRunStatus values
passed
0.003s
Schedule Model
should default isActive to true
passed
0.001s
Schedule Model
should default runCount to 0
passed
0.001s
Schedule Model
should default timezone to UTC
passed
0.001s
Schedule Model
should default type to crawler
passed
0.009s
Schedule Model
should store the crawler id as targetId
passed
0.001s
Cron Expression Validation
should accept valid cron expressions
passed
0.002s
Cron Expression Validation
should reject invalid cron expressions
passed
0.005s
OwnerRoute
affiche le contenu si l’utilisateur est owner
passed
0.066s
OwnerRoute
redirige vers le frontoffice si l’utilisateur est simple membre
passed
0.011s
OwnerRoute
redirige vers /login si non authentifié
passed
0.008s
OwnerRoute
affiche un spinner tant que l’organisation n’est pas chargée
passed
0.013s
Activités — heartbeat
importe Context depuis @temporalio/activity
passed
0.001s
Activités — heartbeat
appelle Context.current().heartbeat dans un helper
passed
0s
Activités — heartbeat
evaluatePage (LLM) heartbeat pendant l'appel bloquant
passed
0.001s
Découpage trigger / wait — activités exportées
expose triggerExtraction + waitForExtractionJob
passed
0s
Découpage trigger / wait — activités exportées
expose triggerSynthesis + waitForSynthesisJob
passed
0.001s
Découpage trigger / wait — activités exportées
les anciennes activités bloquantes ne sont plus exportées
passed
0s
Workflow — boucle d'attente durable
utilise le helper pur pollUntilTerminal
passed
0.001s
Workflow — boucle d'attente durable
borne l'attente extraction et synthèse (timeouts métier)
passed
0s
Workflow — boucle d'attente durable
heartbeatTimeout sur les activités waitFor / evaluatePage
passed
0s
Workflow — boucle d'attente durable
plus aucune activité à 60m ni « triggerExtractorWorkflow » dans le workflow
passed
0s
QuotaBar — variant compact
affiche la consommation et une barre proportionnelle
passed
0.015s
QuotaBar — variant compact
signale un dépassement et plafonne la barre à 100 %
passed
0.004s
QuotaBar — variant compact
affiche ∞ sans quota et une barre vide
passed
0.004s
QuotaBar — variant compact
ajoute l’unité demandée
passed
0.003s
QuotaBar — variant full
affiche la valeur et le libellé sans alerte sous 90 %
passed
0.019s
QuotaBar — variant full
affiche l’alerte et l’action à partir de 90 %
passed
0.104s
QuotaBar — variant full
distingue le dépassement du simple seuil d’alerte
passed
0.019s
QuotaBar — variant full
reste neutre et sans alerte quand le quota est illimité
passed
0.004s
EntitySidebar
renders the title
passed
0.059s
EntitySidebar
renders items as real links with their href
passed
0.059s
EntitySidebar
filters items via the search input
passed
0.019s
EntitySidebar
renders the backoffice button with create label in createOnly mode (owner)
passed
0.027s
EntitySidebar
masque le bouton backoffice pour un simple membre
passed
0.039s
EntitySidebar
renders the collapse handle and hides items when collapsed
passed
0.005s
EntitySidebar
shows the empty message when there are no items
passed
0.004s
classColor — couleurs distinctes par index (US-1)
angle d’or : teintes consécutives nettement espacées (≥ 120°)
passed
0.012s
classColor — couleurs distinctes par index (US-1)
format HSL
passed
0.001s
classColor — couleurs distinctes par index (US-1)
buildClassColors : classes uniques triées, distinctes, déterministes
passed
0.002s
classColor — couleurs distinctes par index (US-1)
sujet sans classe → couleur par défaut
passed
0.001s
classColor — couleurs distinctes par index (US-1)
colorForClass déterministe (repli)
passed
0.001s
classColor — couleurs distinctes par index (US-1)
GOLDEN_ANGLE ≈ 137,5
passed
0.001s
classColor — libellé de classe
dernier segment (# ou /)
passed
0.006s
classColor — légende (US-2)
une entrée par classe unique, triée, couleur = buildClassColors
passed
0.001s
classColor — légende (US-2)
aucune classe → légende vide
passed
0s
getGuideHref
retourne null sans orgId
passed
0.002s
getGuideHref
mappe les fonctionnalités frontoffice vers les pages du guide
passed
0.001s
getGuideHref
mappe les fonctionnalités backoffice vers les pages du guide
passed
0.007s
getGuideHref
retombe sur la page des fonctionnalités si pas de correspondance
passed
0s
chatCompletion — repli « sans raisonnement »
retourne la réponse dès que le contenu est présent (un seul appel)
passed
0.002s
chatCompletion — repli « sans raisonnement »
rejoue avec reasoning.enabled=false quand finish_reason=length et content null
passed
0.002s
chatCompletion — repli « sans raisonnement »
ne rejoue pas si content null sans finish_reason=length
passed
0.001s
chatCompletion — repli « sans raisonnement »
reasoning=false : un seul appel, avec reasoning désactivé
passed
0.001s
chatCompletion — repli « sans raisonnement »
maxTokens fourni → envoyé en max_tokens ; absent → non envoyé
passed
0.001s
metadata — mapping bindings → triplets + métadonnées (US-3)
triplet annoté complet
passed
0.007s
metadata — mapping bindings → triplets + métadonnées (US-3)
triplet non annoté → pas de clé metadata
passed
0.001s
metadata — mapping bindings → triplets + métadonnées (US-3)
littéral avec langue et datatype
passed
0.001s
metadata — mapping bindings → triplets + métadonnées (US-3)
validité sans fin (seul validFrom)
passed
0.001s
metadata — mapping bindings → triplets + métadonnées (US-3)
entrée vide → []
passed
0s
metadata — lastSegment
extrait le dernier segment (#, /, :)
passed
0.001s
buildVariants — chaîne de replis
raisonnement on + maxTokens : [avec max, sans max, sans raisonnement]
passed
0.008s
buildVariants — chaîne de replis
raisonnement off + maxTokens : [avec max, sans max] (raisonnement déjà off)
passed
0.001s
buildVariants — chaîne de replis
raisonnement on sans maxTokens : [normal, sans raisonnement]
passed
0s
chatCompletion — replis sur finish_reason=length
retombe sans max_tokens quand le modèle coupe (max fourni mais non respecté)
passed
0.001s
chatCompletion — replis sur finish_reason=length
sans maxTokens, retombe sur raisonnement désactivé si tronqué
passed
0.001s
chatCompletion — replis sur finish_reason=length
un seul appel si la réponse est correcte
passed
0.001s
quotaLimits.effectiveLimit
priorise le plan effectif sur le snapshot de période
passed
0.008s
quotaLimits.effectiveLimit
ne remplace jamais un quota illimité (null) par le snapshot
passed
0.011s
quotaLimits.effectiveLimit
traite une clé absente du plan comme illimitée
passed
0.001s
quotaLimits.effectiveLimit
retombe sur le snapshot quand aucun plan n’est résoluble
passed
0.001s
quotaLimits.effectiveLimit
retourne null sans plan ni snapshot
passed
0.001s
quotaLimits.effectiveLimit
normalise les valeurs non numériques
passed
0s
quotaLimits.resolveQuotaLimits
résout les trois ressources avec le plan effectif
passed
0s
quotaLimits.resolveQuotaLimits
retombe intégralement sur le snapshot sans plan
passed
0s
quotaLimits.resolveQuotaLimits
renvoie des clés nulles sans plan ni snapshot
passed
0s
handleApiError
renvoie le message d’erreur de validation (crawler error: JSON)
passed
0.002s
handleApiError
parse une erreur crawler avec detail JSON valide (clé message)
passed
0.001s
handleApiError
gère une erreur de validation (type validation_error) avec plusieurs champs
passed
0.001s
handleApiError
gère une erreur de validation sans message par champ
passed
0s
handleApiError
renvoie le detail string simple
passed
0s
handleApiError
renvoie le message du detail objet
passed
0.001s
handleApiError
renvoie error.message du detail objet quand pas de message
passed
0s
handleApiError
renvoie response.data.message
passed
0s
handleApiError
fallback : Erreur de sauvegarde
passed
0.001s
handleApiError
detail crawler non parseable → garde le detail brut
passed
0.001s
workflows Temporal — déclarations de variables (règle webpack)
trouve bien les fichiers de workflows bundlés
passed
0s
workflows Temporal — déclarations de variables (règle webpack)
aucune déclaration `let` dans un workflow (utiliser `var` — scope hoisting webpack)
passed
0.002s
Login — fournisseurs
affiche Google et Les Communs quand les deux sont activés
passed
0.017s
Login — fournisseurs
masque le bouton Les Communs si oidc=false
passed
0.01s
Login — fournisseurs
masque le bouton Google si google=false
passed
0.004s
Login — erreurs
affiche un message pour access_denied
passed
0.012s
Login — erreurs
affiche un message pour oidc_invalid_token
passed
0.014s
linkDistance
ajoute la largeur des libellés à la distance de base
passed
0.001s
linkDistance
tolère des extrémités non résolues (ids bruts)
passed
0.001s
nodeRadius / nodeExtent
réduit la pastille des littéraux
passed
0.001s
nodeRadius / nodeExtent
inclut la pastille, le libellé et une marge
passed
0s
applyForces
applique répulsion, ressorts et collision
passed
0.022s
applyForces
accepte des accesseurs surchargés
passed
0.005s
applyForces
ne casse pas si le graphe ou ses forces sont absents
passed
0.001s
usagePercent
arrondit la consommation au pourcentage entier
passed
0.001s
usagePercent
retourne null sans quota exploitable
passed
0.001s
usagePercent
tolère une consommation absente
passed
0s
formatUsageValue
formate les compteurs
passed
0s
formatUsageValue
formate les très grands quotas (milliards, téra)
passed
0.006s
formatUsageValue
affiche ∞ pour un quota absent
passed
0s
formatUsageValue
formate les coûts selon la référence (€ au-delà de 1 €)
passed
0.001s
usageTone
applique les seuils 60 / 90
passed
0.001s
usageTone
reste neutre sans quota
passed
0s
ontologies — catalogue sur étagère
liste le catalogue
passed
0.002s
ontologies — catalogue sur étagère
lit une ontologie builtin
passed
0.001s
ontologies — catalogue sur étagère
builtin inconnu → erreur
passed
0.003s
ontologies — résolution de sources multiples
resolveSourceList : une entrée par source (builtin + sauvegardée)
passed
0.004s
ontologies — résolution de sources multiples
rétrocompat : sources {type:"builtin"}/{type:"file"}
passed
0.001s
ontologies — résolution de sources multiples
ignore une source fichier absente
passed
0.001s
ontologies — résolution de sources multiples
normalizeSources : legacy key → source
passed
0.001s
shared requireAuth (JWT)
pose userId/email/role depuis le jeton vérifié
passed
0.006s
shared requireAuth (JWT)
ne pose AUCUN organizationId (le JWT n’est plus porteur d’org)
passed
0.003s
shared requireAuth (JWT)
refuse un jeton expiré (401)
passed
0.003s
shared requireAuth (JWT)
refuse une signature invalide (403)
passed
0.003s
Navigation
déplie automatiquement la section contenant l’item actif
passed
0.024s
Navigation
garde repliée la section sans item actif
passed
0.013s
Navigation
la racine (Accueil) est active sur la route racine uniquement
passed
0.021s
Navigation
la racine (Accueil) ne reste pas active sur une sous-route
passed
0.03s
hasWebGL
renvoie true quand webgl2 est disponible
passed
0.002s
hasWebGL
se replie sur webgl quand webgl2 est absent
passed
0.001s
hasWebGL
renvoie false quand aucun contexte n’est disponible
passed
0s
hasWebGL
renvoie false quand getContext lève (navigateur durci)
passed
0s
hasWebGL
mémoïse le résultat (un seul canvas créé)
passed
0.001s
hasWebGL
recalcule après resetWebGLCache
passed
0.001s
Workflow & Synthetiser stores
addSynthesis ajoute une synthèse
passed
0.002s
Workflow & Synthetiser stores
updateSynthesis met à jour une synthèse existante
passed
0s
Workflow & Synthetiser stores
removeSynthesis supprime une synthèse
passed
0s
Workflow & Synthetiser stores
getSynthesis renvoie la synthèse demandée
passed
0.001s
Workflow & Synthetiser stores
clearCompleted garde les synthèses en cours
passed
0.001s
Workflow & Synthetiser stores
clearAll vide la liste
passed
0.001s
KnowledgeBaseFilterStore
default baseType = real
passed
0s
KnowledgeBaseFilterStore
setBaseType met à jour le type
passed
0.001s
shortIri
extrait le dernier segment après # ou /
passed
0.001s
shortIri
renvoie la valeur brute quand aucun séparateur
passed
0s
prefixedIri
préfixe les vocabulaires connus
passed
0s
prefixedIri
se replie sur le dernier segment du namespace
passed
0.001s
prefixedIri
renvoie la valeur brute sans séparateur
passed
0s
truncate
laisse intact un texte plus court que la limite
passed
0.001s
truncate
tronque avec des points de suspension compris dans la limite
passed
0s
truncate
gère null/undefined et une limite invalide
passed
0.008s
escapeHtml
neutralise le balisage provenant de la KB
passed
0.002s
EntityPage
renders children
passed
0.008s
EntityPage
passes collapsed=true to the sidebar when an item is selected
passed
0.004s
EntityPage
replie la sidebar mobile à la sélection d'un item (comme desktop)
passed
0.036s
EntityPage
ouvre la sidebar mobile quand aucun item n'est sélectionné
passed
0.003s
EntityPage
passes collapsed=false when no item is selected
passed
0.003s
graph — voisinage SPARQL → { nodes, edges }
crée un nœud par terme (IRI + littéral) et une arête par triplet
passed
0.003s
graph — voisinage SPARQL → { nodes, edges }
place le nœud central en premier
passed
0.014s
graph — voisinage SPARQL → { nodes, edges }
déduplique les nœuds
passed
0.001s
graph — voisinage SPARQL → { nodes, edges }
tolère une entrée vide
passed
0s
graph — voisinage SPARQL → { nodes, edges }
shortLabel
passed
0s
Graph3DErrorBoundary
affiche les enfants quand tout va bien
passed
0.006s
Graph3DErrorBoundary
affiche un message non bloquant quand le chunk échoue
passed
0.035s
Graph3DErrorBoundary
prévient le parent pour revenir en 2D
passed
0.016s
Graph3DErrorBoundary
trace l’erreur pour le diagnostic
passed
0.005s
computeHash
returns same hash for same string input
passed
0.001s
computeHash
returns different hash for different inputs
passed
0s
computeHash
handles empty string
passed
0s
computeHash
handles null and undefined
passed
0.001s
computeHash
handles objects
passed
0s
computeHash
produces SHA-256 length (64 hex chars)
passed
0s
buildKey
builds key with level and parts
passed
0.001s
buildKey
builds key with single part
passed
0s
buildKey
handles multiple parts
passed
0.001s
buildKey
filters out falsy parts
passed
0s
buildKey
converts numbers to strings
passed
0.001s
BackofficeEntityPage
renders children
passed
0.007s
BackofficeEntityPage
replie la sidebar (bande repliée) à la sélection d'un item
passed
0.008s
BackofficeEntityPage
ouvre la sidebar (drawer mobile + inline) quand aucun item n'est sélectionné
passed
0.017s
BackofficeEntityPage
fournit le gestionnaire de repli à la sidebar
passed
0.003s
rdf — parsing Turtle / JSON-LD (D10)
parse le Turtle
passed
0.004s
rdf — parsing Turtle / JSON-LD (D10)
parse le JSON-LD
passed
0.093s
rdf — parsing Turtle / JSON-LD (D10)
parité Turtle ↔ JSON-LD (mêmes triplets)
passed
0.002s
rdf — parsing Turtle / JSON-LD (D10)
rejette un format inconnu
passed
0.007s
rdf — parsing Turtle / JSON-LD (D10)
rejette un JSON-LD invalide
passed
0.001s
rdf — parsing Turtle / JSON-LD (D10)
rejette un Turtle invalide
passed
0.014s
rdf — parsing Turtle / JSON-LD (D10)
normalise les formats
passed
0s
graphViewMode
renvoie 2d par défaut
passed
0.001s
graphViewMode
relit 3d quand la valeur enregistrée est 3d
passed
0.001s
graphViewMode
ignore une valeur inconnue
passed
0.002s
graphViewMode
écrit le mode sélectionné
passed
0.001s
graphViewMode
normalise une valeur inattendue en 2d
passed
0.001s
graphViewMode
renvoie 2d si la lecture lève (navigation privée)
passed
0.001s
graphViewMode
n’échoue pas si l’écriture lève (quota)
passed
0s
getOrganizationId
renvoie l’id du store courant s’il est défini
passed
0.003s
getOrganizationId
fallback : extrait l’orgId depuis l’URL (premier segment hexa 24)
passed
0.001s
getOrganizationId
retourne null si le premier segment URL n’est pas un orgId hexa
passed
0.001s
getOrganizationId
retourne null si rien n’est résolu
passed
0.001s
sparqlResultToRows
convertit les bindings SPARQL en lignes
passed
0.015s
sparqlResultToRows
gère les valeurs manquantes (OPTIONAL) par une chaîne vide
passed
0.001s
sparqlResultToRows
tolère une réponse vide / nulle
passed
0.001s
ItemRecap
renders name and description
passed
0.006s
ItemRecap
renders meta content
passed
0.002s
ItemRecap
renders actions at the far right
passed
0.01s
ItemRecap
does not render description when absent
passed
0.002s
llm — mergeValues
sans clé API → null (non bloquant)
passed
0s
llm — mergeValues
valeurs identiques → renvoie la valeur sans appel LLM
passed
0s
llm — mergeValues
modèle de fusion par défaut exposé
passed
0.001s
syntaxe JS des services (node --check)
parcourt un nombre significatif de fichiers
passed
0.001s
syntaxe JS des services (node --check)
aucun fichier ne contient d’erreur de syntaxe
passed
5.758s