import { describe, expect, it } from 'vitest'; import { InvalidSearchQueryError, MAX_QUERY_LENGTH, assertValidSearchQuery, } from '../src/services/searchQuery.js'; describe('assertValidSearchQuery', () => { it.each([ ['une requête simple', 'speed climbing', 'speed climbing'], ['des espaces superflus', ' speed climbing ', 'speed climbing'], ['des accents et de l’unicode', 'escalade été 日本語', 'escalade été 日本語'], ['des symboles courants', 'c++ "tutoriel" -débutant #1', 'c++ "tutoriel" -débutant #1'], ['un tiret en tête (jamais pris pour une option)', '--exec=rm', '--exec=rm'], ['une longueur maximale exacte', 'a'.repeat(MAX_QUERY_LENGTH), 'a'.repeat(MAX_QUERY_LENGTH)], ])('accepte %s', (_label, input, expected) => { expect(assertValidSearchQuery(input)).toBe(expected); }); it.each([ ['vide', ''], ['faite d’espaces', ' '], ['trop longue', 'a'.repeat(MAX_QUERY_LENGTH + 1)], ['avec un retour à la ligne', 'speed\nclimbing'], ['avec un retour chariot', 'speed\rclimbing'], ['avec une tabulation', 'speed\tclimbing'], ['avec un caractère NUL', 'speedclimbing'], ['avec DEL', 'speedclimbing'], ])('rejette une requête %s', (_label, input) => { expect(() => assertValidSearchQuery(input)).toThrow(InvalidSearchQueryError); }); });