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:
9
src/services/__tests__/setup.ts
Normal file
9
src/services/__tests__/setup.ts
Normal 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
|
||||
171
src/services/integrations/jira/__tests__/sync.test.ts
Normal file
171
src/services/integrations/jira/__tests__/sync.test.ts
Normal 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
|
||||
});
|
||||
});
|
||||
});
|
||||
147
src/services/integrations/tfs/__tests__/sync.test.ts
Normal file
147
src/services/integrations/tfs/__tests__/sync.test.ts
Normal 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é
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user