- schéma zod : tags normalisés (trim + minuscules + dédupe), 3 max par carte - couche générique : findTags (MySQL + Mongo), service tags() - API GET /api/tags + cardsApi.tags() pour les suggestions - formulaire : saisie + ajout (Entrée/bouton), suggestions des tags existants, chips supprimables, compteur n/3, blocage au-delà de 3 - tests : schémas, repositories, service, route, api-client, formulaire
77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
// @vitest-environment node
|
|
import { describe, expect, it } from 'vitest'
|
|
import { createCardSchema, updateCardSchema } from './card-schemas'
|
|
|
|
describe('createCardSchema', () => {
|
|
it('accepte une entrée valide et normalise les champs', () => {
|
|
const result = createCardSchema.parse({
|
|
question: ' Question ? ',
|
|
response: 'Réponse',
|
|
theme: ' javascript ',
|
|
tags: ['scope'],
|
|
})
|
|
expect(result.question).toBe('Question ?')
|
|
expect(result.theme).toBe('javascript')
|
|
})
|
|
|
|
it('accepte une entrée sans tags', () => {
|
|
expect(
|
|
createCardSchema.parse({ question: 'Q', response: 'R', theme: 'git' }).tags,
|
|
).toBeUndefined()
|
|
})
|
|
|
|
it('rejette une question vide', () => {
|
|
expect(() => createCardSchema.parse({ question: ' ', response: 'R', theme: 'git' })).toThrow()
|
|
})
|
|
|
|
it('rejette un thème manquant', () => {
|
|
expect(() => createCardSchema.parse({ question: 'Q', response: 'R' })).toThrow()
|
|
})
|
|
|
|
it('normalise les tags (trim + minuscules) et supprime les doublons', () => {
|
|
const result = createCardSchema.parse({
|
|
question: 'Q',
|
|
response: 'R',
|
|
theme: 'git',
|
|
tags: [' Git ', 'git', 'HOOK', 'hook'],
|
|
})
|
|
expect(result.tags).toEqual(['git', 'hook'])
|
|
})
|
|
|
|
it('rejette plus de 3 tags', () => {
|
|
expect(() =>
|
|
createCardSchema.parse({
|
|
question: 'Q',
|
|
response: 'R',
|
|
theme: 'git',
|
|
tags: ['a', 'b', 'c', 'd'],
|
|
}),
|
|
).toThrow()
|
|
})
|
|
|
|
it('rejette un tag vide ou trop long', () => {
|
|
expect(() =>
|
|
createCardSchema.parse({ question: 'Q', response: 'R', theme: 'git', tags: [' '] }),
|
|
).toThrow()
|
|
expect(() =>
|
|
createCardSchema.parse({
|
|
question: 'Q',
|
|
response: 'R',
|
|
theme: 'git',
|
|
tags: ['x'.repeat(31)],
|
|
}),
|
|
).toThrow()
|
|
})
|
|
})
|
|
|
|
describe('updateCardSchema', () => {
|
|
it('accepte une mise à jour partielle', () => {
|
|
const result = updateCardSchema.parse({ response: 'Nouvelle réponse' })
|
|
expect(result).toEqual({ response: 'Nouvelle réponse' })
|
|
})
|
|
|
|
it('rejette un champ vide lors d une mise à jour', () => {
|
|
expect(() => updateCardSchema.parse({ theme: '' })).toThrow()
|
|
})
|
|
})
|