ObsiViewer/e2e/frontmatter-quicklinks.spec.ts

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