211 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { test, expect } from '@playwright/test';
 | 
						|
import { promises as fs } from 'fs';
 | 
						|
import path from 'path';
 | 
						|
 | 
						|
const VAULT_PATH = path.join(process.cwd(), 'vault');
 | 
						|
const TEST_FILES = {
 | 
						|
  favorite: 'test-favorite.md',
 | 
						|
  template: 'test-template.md',
 | 
						|
  task: 'test-task.md',
 | 
						|
  regular: 'test-regular.md'
 | 
						|
};
 | 
						|
 | 
						|
test.describe('Front-matter Enrichment & Quick Links', () => {
 | 
						|
  
 | 
						|
  test.beforeAll(async () => {
 | 
						|
    // Create test files with different front-matter configurations
 | 
						|
    await fs.mkdir(VAULT_PATH, { recursive: true });
 | 
						|
    
 | 
						|
    // File with favoris: true
 | 
						|
    await fs.writeFile(
 | 
						|
      path.join(VAULT_PATH, TEST_FILES.favorite),
 | 
						|
      `---
 | 
						|
titre: Favorite Note
 | 
						|
favoris: true
 | 
						|
---
 | 
						|
 | 
						|
# Favorite Note
 | 
						|
This is a favorite note.`,
 | 
						|
      'utf-8'
 | 
						|
    );
 | 
						|
    
 | 
						|
    // File with template: true
 | 
						|
    await fs.writeFile(
 | 
						|
      path.join(VAULT_PATH, TEST_FILES.template),
 | 
						|
      `---
 | 
						|
titre: Template Note
 | 
						|
template: true
 | 
						|
---
 | 
						|
 | 
						|
# Template Note
 | 
						|
This is a template note.`,
 | 
						|
      'utf-8'
 | 
						|
    );
 | 
						|
    
 | 
						|
    // File with task: true
 | 
						|
    await fs.writeFile(
 | 
						|
      path.join(VAULT_PATH, TEST_FILES.task),
 | 
						|
      `---
 | 
						|
titre: Task Note
 | 
						|
task: true
 | 
						|
---
 | 
						|
 | 
						|
# Task Note
 | 
						|
This is a task note.`,
 | 
						|
      'utf-8'
 | 
						|
    );
 | 
						|
    
 | 
						|
    // Regular file without special flags
 | 
						|
    await fs.writeFile(
 | 
						|
      path.join(VAULT_PATH, TEST_FILES.regular),
 | 
						|
      `# Regular Note
 | 
						|
This is a regular note without front-matter.`,
 | 
						|
      'utf-8'
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  test('should enrich front-matter on file open', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // Open the regular file (without front-matter)
 | 
						|
    await page.click(`text=${TEST_FILES.regular.replace('.md', '')}`);
 | 
						|
    await page.waitForTimeout(1000);
 | 
						|
    
 | 
						|
    // Check that the file now has front-matter
 | 
						|
    const content = await fs.readFile(path.join(VAULT_PATH, TEST_FILES.regular), 'utf-8');
 | 
						|
    
 | 
						|
    expect(content).toContain('---');
 | 
						|
    expect(content).toContain('titre: test-regular');
 | 
						|
    expect(content).toContain('auteur: Bruno Charest');
 | 
						|
    expect(content).toContain('favoris: false');
 | 
						|
    expect(content).toContain('template: false');
 | 
						|
    expect(content).toContain('task: false');
 | 
						|
  });
 | 
						|
 | 
						|
  test('should display Quick Links with correct counts', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // Wait for Quick Links to load
 | 
						|
    await page.waitForSelector('text=Quick Links', { timeout: 5000 });
 | 
						|
    
 | 
						|
    // Check if Quick Links section is visible
 | 
						|
    const quickLinksVisible = await page.isVisible('text=Quick Links');
 | 
						|
    expect(quickLinksVisible).toBeTruthy();
 | 
						|
    
 | 
						|
    // Check for Favorites count
 | 
						|
    const favoritesText = await page.textContent('text=Favorites');
 | 
						|
    expect(favoritesText).toContain('(1)'); // Should show 1 favorite
 | 
						|
    
 | 
						|
    // Check for Templates count
 | 
						|
    const templatesText = await page.textContent('text=Templates');
 | 
						|
    expect(templatesText).toContain('(1)'); // Should show 1 template
 | 
						|
    
 | 
						|
    // Check for Tasks count
 | 
						|
    const tasksText = await page.textContent('text=Tasks');
 | 
						|
    expect(tasksText).toContain('(1)'); // Should show 1 task
 | 
						|
  });
 | 
						|
 | 
						|
  test('should filter notes when clicking Favorites', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // Click on Favorites in Quick Links
 | 
						|
    await page.click('text=Favorites');
 | 
						|
    await page.waitForTimeout(500);
 | 
						|
    
 | 
						|
    // Check that only favorite notes are displayed in the list
 | 
						|
    const notesList = await page.locator('.text-sm.font-semibold').allTextContents();
 | 
						|
    
 | 
						|
    expect(notesList).toContain('Favorite Note');
 | 
						|
    expect(notesList).not.toContain('Template Note');
 | 
						|
    expect(notesList).not.toContain('Task Note');
 | 
						|
  });
 | 
						|
 | 
						|
  test('should filter notes when clicking Templates', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // Click on Templates in Quick Links
 | 
						|
    await page.click('text=Templates');
 | 
						|
    await page.waitForTimeout(500);
 | 
						|
    
 | 
						|
    // Check that only template notes are displayed in the list
 | 
						|
    const notesList = await page.locator('.text-sm.font-semibold').allTextContents();
 | 
						|
    
 | 
						|
    expect(notesList).toContain('Template Note');
 | 
						|
    expect(notesList).not.toContain('Favorite Note');
 | 
						|
    expect(notesList).not.toContain('Task Note');
 | 
						|
  });
 | 
						|
 | 
						|
  test('should filter notes when clicking Tasks', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // Click on Tasks in Quick Links
 | 
						|
    await page.click('text=Tasks');
 | 
						|
    await page.waitForTimeout(500);
 | 
						|
    
 | 
						|
    // Check that only task notes are displayed in the list
 | 
						|
    const notesList = await page.locator('.text-sm.font-semibold').allTextContents();
 | 
						|
    
 | 
						|
    expect(notesList).toContain('Task Note');
 | 
						|
    expect(notesList).not.toContain('Favorite Note');
 | 
						|
    expect(notesList).not.toContain('Template Note');
 | 
						|
  });
 | 
						|
 | 
						|
  test('should clear filters when clicking All pages', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // First, apply a filter
 | 
						|
    await page.click('text=Favorites');
 | 
						|
    await page.waitForTimeout(500);
 | 
						|
    
 | 
						|
    // Then click All pages
 | 
						|
    await page.click('text=All pages');
 | 
						|
    await page.waitForTimeout(500);
 | 
						|
    
 | 
						|
    // Check that all notes are displayed
 | 
						|
    const notesList = await page.locator('.text-sm.font-semibold').allTextContents();
 | 
						|
    
 | 
						|
    expect(notesList.length).toBeGreaterThan(1);
 | 
						|
  });
 | 
						|
 | 
						|
  test('should preserve front-matter on subsequent opens (idempotence)', async ({ page }) => {
 | 
						|
    await page.goto('http://localhost:4200');
 | 
						|
    await page.waitForLoadState('networkidle');
 | 
						|
    
 | 
						|
    // Open the favorite file
 | 
						|
    await page.click('text=Favorite Note');
 | 
						|
    await page.waitForTimeout(1000);
 | 
						|
    
 | 
						|
    // Read the file content
 | 
						|
    const content1 = await fs.readFile(path.join(VAULT_PATH, TEST_FILES.favorite), 'utf-8');
 | 
						|
    
 | 
						|
    // Close and reopen the file
 | 
						|
    await page.click('text=All pages');
 | 
						|
    await page.waitForTimeout(500);
 | 
						|
    await page.click('text=Favorite Note');
 | 
						|
    await page.waitForTimeout(1000);
 | 
						|
    
 | 
						|
    // Read the file content again
 | 
						|
    const content2 = await fs.readFile(path.join(VAULT_PATH, TEST_FILES.favorite), 'utf-8');
 | 
						|
    
 | 
						|
    // Content should be identical (idempotent)
 | 
						|
    expect(content1.trim()).toBe(content2.trim());
 | 
						|
  });
 | 
						|
 | 
						|
  test.afterAll(async () => {
 | 
						|
    // Cleanup test files
 | 
						|
    for (const file of Object.values(TEST_FILES)) {
 | 
						|
      try {
 | 
						|
        await fs.unlink(path.join(VAULT_PATH, file));
 | 
						|
      } catch (err) {
 | 
						|
        // Ignore errors
 | 
						|
      }
 | 
						|
    }
 | 
						|
  });
 | 
						|
});
 |