feat(tests): integrate Vitest for testing framework and add test scripts

- Added Vitest as a dependency for improved testing capabilities.
- Updated package.json with new test scripts for running tests, watching, and coverage reporting.
- Configured ESLint to recognize test runner scripts and included them in the linting process.
- Modified tsconfig.json to include Vitest types for better TypeScript support in tests.
This commit is contained in:
Julien Froidefond
2025-11-21 10:40:30 +01:00
parent 31f9855a3c
commit 8bdd3a8253
10 changed files with 1216 additions and 2 deletions

View File

@@ -0,0 +1,9 @@
/**
* Configuration de setup pour les tests Vitest
* Désactive PostCSS pour éviter les erreurs de chargement
*/
// Désactiver PostCSS pendant les tests
process.env.VITE_DISABLE_POSTCSS = 'true';
// Note: NODE_ENV est géré automatiquement par Vitest

View File

@@ -0,0 +1,171 @@
/**
* Tests unitaires pour la synchronisation Jira
*/
import { describe, it, expect } from 'vitest';
import { buildSyncUpdateData } from '@/services/task-management/readonly-fields';
describe('Synchronisation Jira - Logique de préservation des champs', () => {
describe('buildSyncUpdateData pour Jira', () => {
it('devrait préserver title si modifié localement', () => {
const existingTask = {
title: 'Titre modifié localement',
description: 'Description locale',
status: 'todo',
priority: 'high',
dueDate: new Date('2024-01-01'),
};
const syncData = {
title: 'Titre original Jira',
description: 'Description Jira',
status: 'in_progress',
priority: 'medium',
dueDate: new Date('2024-01-02'),
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
expect(result.title).toBe('Titre modifié localement');
expect(result.description).toBe('Description Jira'); // Écrasé
expect(result.status).toBe('in_progress'); // Écrasé
expect(result.priority).toBe('high'); // Préservé
expect(result.dueDate).toEqual(new Date('2024-01-02')); // Écrasé
});
it('devrait préserver priority si modifié localement', () => {
const existingTask = {
title: 'Même titre',
description: 'Description locale',
status: 'todo',
priority: 'low', // Modifié localement
dueDate: new Date('2024-01-01'),
};
const syncData = {
title: 'Même titre',
description: 'Description Jira',
status: 'done',
priority: 'high', // Valeur Jira
dueDate: null,
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
expect(result.priority).toBe('low'); // Préservé car modifié localement
});
it('devrait préserver status archived même si Jira dit done', () => {
const existingTask = {
title: 'Tâche archivée',
description: 'Description',
status: 'archived', // Archivé localement
priority: 'medium',
dueDate: null,
};
const syncData = {
title: 'Tâche archivée',
description: 'Description Jira',
status: 'done', // Jira dit done
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
expect(result.status).toBe('archived'); // Préservé car archived
});
it('devrait écraser status si pas archived', () => {
const existingTask = {
title: 'Tâche',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const syncData = {
title: 'Tâche',
description: 'Description Jira',
status: 'in_progress', // Jira dit in_progress
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
expect(result.status).toBe('in_progress'); // Écrasé
});
it('devrait toujours écraser description', () => {
const existingTask = {
title: 'Tâche',
description: 'Description locale modifiée',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const syncData = {
title: 'Tâche',
description: 'Description Jira',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
expect(result.description).toBe('Description Jira'); // Toujours écrasé
});
it('devrait toujours écraser dueDate', () => {
const existingTask = {
title: 'Tâche',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: new Date('2024-01-01'), // Date locale
};
const syncData = {
title: 'Tâche',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: new Date('2024-12-31'), // Date Jira
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
expect(result.dueDate).toEqual(new Date('2024-12-31')); // Toujours écrasé
});
it('devrait préserver priority même si title identique', () => {
const existingTask = {
title: 'Titre identique',
description: 'Description locale',
status: 'todo',
priority: 'medium', // Modifié localement
dueDate: null,
};
const syncData = {
title: 'Titre identique', // Même titre
description: 'Description Jira',
status: 'done',
priority: 'high', // Valeur Jira différente
dueDate: new Date('2024-01-01'),
};
const result = buildSyncUpdateData('jira', existingTask, syncData);
// Title identique → utilise syncData
expect(result.title).toBe('Titre identique');
// Priority différente → préservée même si title identique
expect(result.priority).toBe('medium'); // Préservé car modifié localement
});
});
});

View File

@@ -0,0 +1,147 @@
/**
* Tests unitaires pour la synchronisation TFS
*/
import { describe, it, expect } from 'vitest';
import { buildSyncUpdateData } from '@/services/task-management/readonly-fields';
describe("Synchronisation TFS - Logique d'écrasement des champs", () => {
describe('buildSyncUpdateData pour TFS', () => {
it('devrait écraser tous les champs même si modifiés localement', () => {
const existingTask = {
title: 'Titre modifié localement',
description: 'Description locale modifiée',
status: 'todo',
priority: 'high',
dueDate: new Date('2024-01-01'),
};
const syncData = {
title: 'PR: Nouvelle Pull Request',
description: 'Description TFS',
status: 'done',
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('tfs', existingTask, syncData);
// Tous les champs doivent être écrasés
expect(result.title).toBe('PR: Nouvelle Pull Request');
expect(result.description).toBe('Description TFS');
expect(result.status).toBe('done');
expect(result.priority).toBe('medium');
expect(result.dueDate).toBeNull();
});
it('devrait écraser title même si différent', () => {
const existingTask = {
title: 'Ancien titre',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const syncData = {
title: 'PR: Nouveau titre',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('tfs', existingTask, syncData);
expect(result.title).toBe('PR: Nouveau titre'); // Écrasé
});
it('devrait écraser priority même si modifié localement', () => {
const existingTask = {
title: 'PR: Tâche',
description: 'Description',
status: 'todo',
priority: 'low', // Modifié localement
dueDate: null,
};
const syncData = {
title: 'PR: Tâche',
description: 'Description',
status: 'todo',
priority: 'high', // Valeur TFS
dueDate: null,
};
const result = buildSyncUpdateData('tfs', existingTask, syncData);
expect(result.priority).toBe('high'); // Écrasé
});
it('devrait écraser status même si archived localement', () => {
const existingTask = {
title: 'PR: Tâche',
description: 'Description',
status: 'archived', // Archivé localement
priority: 'medium',
dueDate: null,
};
const syncData = {
title: 'PR: Tâche',
description: 'Description',
status: 'done', // TFS dit done
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('tfs', existingTask, syncData);
expect(result.status).toBe('done'); // Écrasé même si archived
});
it('devrait écraser description même si modifiée localement', () => {
const existingTask = {
title: 'PR: Tâche',
description: 'Description locale modifiée',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const syncData = {
title: 'PR: Tâche',
description: 'Description TFS',
status: 'todo',
priority: 'medium',
dueDate: null,
};
const result = buildSyncUpdateData('tfs', existingTask, syncData);
expect(result.description).toBe('Description TFS'); // Écrasé
});
it('devrait écraser dueDate même si défini localement', () => {
const existingTask = {
title: 'PR: Tâche',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: new Date('2024-01-01'), // Date locale
};
const syncData = {
title: 'PR: Tâche',
description: 'Description',
status: 'todo',
priority: 'medium',
dueDate: null, // TFS n'a pas de dueDate
};
const result = buildSyncUpdateData('tfs', existingTask, syncData);
expect(result.dueDate).toBeNull(); // Écrasé
});
});
});