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
|
|
}
|
|
}
|
|
});
|
|
});
|