183 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
#!/usr/bin/env node
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests unitaires pour markdown-frontmatter.mjs
 | 
						|
 * Valide toutes les règles métier YAML
 | 
						|
 */
 | 
						|
 | 
						|
import assert from 'assert';
 | 
						|
import { rewriteTagsFrontmatter, extractTagsFromFrontmatter } from './markdown-frontmatter.mjs';
 | 
						|
 | 
						|
function test(name, fn) {
 | 
						|
  try {
 | 
						|
    fn();
 | 
						|
    console.log(`✅ ${name}`);
 | 
						|
  } catch (error) {
 | 
						|
    console.error(`❌ ${name}`);
 | 
						|
    console.error(error);
 | 
						|
    process.exit(1);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
console.log('🧪 Tests markdown-frontmatter\n');
 | 
						|
 | 
						|
// Test 1: Création de front-matter si absent
 | 
						|
test('Crée front-matter avec tags si absent', () => {
 | 
						|
  const input = 'Hello world';
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['tag1', 'tag2']);
 | 
						|
  assert.ok(result.includes('---'));
 | 
						|
  assert.ok(result.includes('tags:'));
 | 
						|
  assert.ok(result.includes('  - tag1'));
 | 
						|
  assert.ok(result.includes('  - tag2'));
 | 
						|
  assert.ok(result.includes('Hello world'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 2: Pas de front-matter si tags vide
 | 
						|
test('Ne crée pas de front-matter si tags vide et pas de FM existant', () => {
 | 
						|
  const input = 'Hello world';
 | 
						|
  const result = rewriteTagsFrontmatter(input, []);
 | 
						|
  assert.strictEqual(result, 'Hello world');
 | 
						|
});
 | 
						|
 | 
						|
// Test 3: Suppression de la clé tags si liste vide
 | 
						|
test('Supprime la clé tags si liste vide', () => {
 | 
						|
  const input = `---
 | 
						|
title: Test
 | 
						|
tags:
 | 
						|
  - old-tag
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const result = rewriteTagsFrontmatter(input, []);
 | 
						|
  assert.ok(result.includes('title: Test'));
 | 
						|
  assert.ok(!result.includes('tags:'));
 | 
						|
  assert.ok(!result.includes('old-tag'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 4: Déduplique les tags (case-insensitive)
 | 
						|
test('Déduplique les tags (case-insensitive)', () => {
 | 
						|
  const input = 'Hello';
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['Tag', 'tag', 'TAG', 'other']);
 | 
						|
  const tags = extractTagsFromFrontmatter(result);
 | 
						|
  assert.strictEqual(tags.length, 2);
 | 
						|
  assert.ok(tags.includes('Tag')); // Première occurrence préservée
 | 
						|
  assert.ok(tags.includes('other'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 5: Normalise les espaces
 | 
						|
test('Normalise les espaces dans les tags', () => {
 | 
						|
  const input = 'Hello';
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['  tag  with   spaces  ']);
 | 
						|
  const tags = extractTagsFromFrontmatter(result);
 | 
						|
  assert.strictEqual(tags.length, 1);
 | 
						|
  assert.strictEqual(tags[0], 'tag with spaces');
 | 
						|
});
 | 
						|
 | 
						|
// Test 6: Préserve les autres propriétés
 | 
						|
test('Préserve les autres propriétés du front-matter', () => {
 | 
						|
  const input = `---
 | 
						|
title: My Note
 | 
						|
author: John
 | 
						|
date: 2024-01-01
 | 
						|
tags:
 | 
						|
  - old
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['new']);
 | 
						|
  assert.ok(result.includes('title: My Note'));
 | 
						|
  assert.ok(result.includes('author: John'));
 | 
						|
  assert.ok(result.includes('date: 2024-01-01'));
 | 
						|
  assert.ok(result.includes('  - new'));
 | 
						|
  assert.ok(!result.includes('  - old'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 7: Pas de lignes vides dans le front-matter
 | 
						|
test('Pas de lignes vides dans le front-matter', () => {
 | 
						|
  const input = `---
 | 
						|
title: Test
 | 
						|
 | 
						|
 | 
						|
tags:
 | 
						|
  - old
 | 
						|
 | 
						|
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['new']);
 | 
						|
  const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
 | 
						|
  assert.ok(fmMatch);
 | 
						|
  const fm = fmMatch[1];
 | 
						|
  assert.ok(!fm.includes('\n\n')); // Pas de double saut de ligne
 | 
						|
});
 | 
						|
 | 
						|
// Test 8: Supprime le front-matter si vide après suppression des tags
 | 
						|
test('Supprime le front-matter si vide après suppression des tags', () => {
 | 
						|
  const input = `---
 | 
						|
tags:
 | 
						|
  - only-tag
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const result = rewriteTagsFrontmatter(input, []);
 | 
						|
  assert.strictEqual(result, 'Content');
 | 
						|
  assert.ok(!result.includes('---'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 9: Gère les tags inline (format [tag1, tag2])
 | 
						|
test('Remplace les tags inline par format liste', () => {
 | 
						|
  const input = `---
 | 
						|
title: Test
 | 
						|
tags: [old1, old2]
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['new1', 'new2']);
 | 
						|
  assert.ok(result.includes('  - new1'));
 | 
						|
  assert.ok(result.includes('  - new2'));
 | 
						|
  assert.ok(!result.includes('[old1, old2]'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 10: Extraction des tags
 | 
						|
test('Extrait correctement les tags du front-matter', () => {
 | 
						|
  const input = `---
 | 
						|
title: Test
 | 
						|
tags:
 | 
						|
  - tag1
 | 
						|
  - tag2
 | 
						|
  - tag3
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const tags = extractTagsFromFrontmatter(input);
 | 
						|
  assert.strictEqual(tags.length, 3);
 | 
						|
  assert.deepStrictEqual(tags, ['tag1', 'tag2', 'tag3']);
 | 
						|
});
 | 
						|
 | 
						|
// Test 11: Extraction des tags inline
 | 
						|
test('Extrait les tags inline', () => {
 | 
						|
  const input = `---
 | 
						|
tags: [tag1, tag2, tag3]
 | 
						|
---
 | 
						|
Content`;
 | 
						|
  const tags = extractTagsFromFrontmatter(input);
 | 
						|
  assert.strictEqual(tags.length, 3);
 | 
						|
  assert.deepStrictEqual(tags, ['tag1', 'tag2', 'tag3']);
 | 
						|
});
 | 
						|
 | 
						|
// Test 12: Gère les caractères spéciaux
 | 
						|
test('Gère les tags avec caractères spéciaux', () => {
 | 
						|
  const input = 'Content';
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['tag-with-dash', 'tag_with_underscore', 'tag/with/slash']);
 | 
						|
  const tags = extractTagsFromFrontmatter(result);
 | 
						|
  assert.strictEqual(tags.length, 3);
 | 
						|
  assert.ok(tags.includes('tag-with-dash'));
 | 
						|
  assert.ok(tags.includes('tag_with_underscore'));
 | 
						|
  assert.ok(tags.includes('tag/with/slash'));
 | 
						|
});
 | 
						|
 | 
						|
// Test 13: Gère les BOM et line endings
 | 
						|
test('Normalise BOM et line endings', () => {
 | 
						|
  const input = '\uFEFFContent\r\nwith\r\nCRLF';
 | 
						|
  const result = rewriteTagsFrontmatter(input, ['tag']);
 | 
						|
  assert.ok(!result.includes('\uFEFF'));
 | 
						|
  assert.ok(!result.includes('\r'));
 | 
						|
});
 | 
						|
 | 
						|
console.log('\n✅ Tous les tests passent !');
 |