Serveur TypeScript (Fastify 5) permettant de déposer des fichiers médias
dans des dossiers nommés, via une page web de glisser-déposer.
- Authentification OpenID Connect gérée côté serveur (Authorization Code +
PKCE, client confidentiel, openid-client) ; session via cookie chiffré
(@fastify/secure-session).
- Configuration dans un fichier JSON (schéma fourni) ; l'environnement ne
porte que le pointeur MEDIADROP_CONFIG.
- Cibles de dépôt nommées : liste { name, label, dir }, sélection par
?target=, première cible par défaut.
- Upload multipart en streaming : nom de fichier dérivé côté serveur (pas
de path traversal), liste blanche de types MIME, plafond de taille.
- TypeScript strict, ESLint + Prettier sans warning, 46 tests Vitest.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
30 lines
1.1 KiB
TypeScript
30 lines
1.1 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { DEFAULT_ALLOWED_MIME, extensionForMime, isAllowedMedia } from '../src/lib/media-types.js';
|
|
|
|
describe('isAllowedMedia', () => {
|
|
it('accepte un type présent dans la liste blanche', () => {
|
|
expect(isAllowedMedia('image/png', DEFAULT_ALLOWED_MIME)).toBe(true);
|
|
expect(isAllowedMedia('video/mp4', DEFAULT_ALLOWED_MIME)).toBe(true);
|
|
});
|
|
|
|
it('refuse un type absent de la liste blanche', () => {
|
|
expect(isAllowedMedia('application/zip', DEFAULT_ALLOWED_MIME)).toBe(false);
|
|
expect(isAllowedMedia('image/png', ['image/jpeg'])).toBe(false);
|
|
});
|
|
|
|
it('accepte tout avec la politique "all"', () => {
|
|
expect(isAllowedMedia('application/x-msdownload', 'all')).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('extensionForMime', () => {
|
|
it('renvoie une extension sûre pour un type connu', () => {
|
|
expect(extensionForMime('image/jpeg')).toBe('.jpg');
|
|
expect(extensionForMime('video/quicktime')).toBe('.mov');
|
|
});
|
|
|
|
it('renvoie null pour un type inconnu', () => {
|
|
expect(extensionForMime('application/x-unknown')).toBeNull();
|
|
});
|
|
});
|