logseq/e2e-tests/fs.spec.ts

142 lines
5.2 KiB
TypeScript

import fsp from 'fs/promises';
import path from 'path';
import { expect } from '@playwright/test'
import { test } from './fixtures';
import { searchPage, captureConsoleWithPrefix, closeSearchBox, createPage, IsWindows, randomString } from './utils';
test('create file on disk then delete', async ({ page, block, graphDir }) => {
// Since have to wait for file watchers
test.slow();
// Special page names: namespaced, chars require escaping, chars require unicode normalization, "%" chars, "%" with 2 hexdigests
const testCases = [
{pageTitle: "User:John", fileName: "User%3AJohn"},
// invalid url decode escaping as %ff is not parsable but match the common URL encode regex
{pageTitle: "#%ff", fileName: "#%ff"},
// valid url decode escaping
{pageTitle: "#%23", fileName: "#%2523"},
{pageTitle: "@!#%", fileName: "@!#%"},
{pageTitle: "aàáâ", fileName: "aàáâ"},
{pageTitle: "#%gggg", fileName: "#%gggg"}
]
if (!IsWindows)
testCases.push({pageTitle: "User:Bob", fileName: "User:Bob"})
function getFullPath(fileName: string) {
return path.join(graphDir, "pages", `${fileName}.md`);
}
// Test putting files on disk
for (const {pageTitle, fileName} of testCases) {
// Put the file on disk
const filePath = getFullPath(fileName);
await fsp.writeFile(filePath, `- content for ${pageTitle}`);
await captureConsoleWithPrefix(page, "Parsing finished:", 5000)
// Check that the page is created
const results = await searchPage(page, pageTitle);
const firstResultRow = await results[0].innerText()
expect(firstResultRow).toContain(pageTitle);
expect(firstResultRow).not.toContain("Create");
await closeSearchBox(page);
}
// Test removing files on disk
for (const {pageTitle, fileName} of testCases) {
// Remove the file on disk
const filePath = getFullPath(fileName);
await fsp.unlink(filePath);
await captureConsoleWithPrefix(page, "Delete page:", 5000);
// Test that the page is deleted
const results = await searchPage(page, pageTitle);
const firstResultRow = await results[0].innerText()
// expect(firstResultRow).toContain("Create");
await closeSearchBox(page);
}
});
test("Rename file on disk", async ({ page, block, graphDir }) => {
// Since have to wait for file watchers
test.slow();
const testCases = [
// Normal -> NameSpace
{pageTitle: "User:John", fileName: "User%3AJohn",
newPageTitle: "User/John", newFileName: "User___John"},
// NameSpace -> Normal
{pageTitle: "#/%23", fileName: "#___%2523",
newPageTitle: "#%23", newFileName: "#%2523"}
]
if (!IsWindows)
testCases.push({pageTitle: "User:Bob", fileName: "User:Bob",
newPageTitle: "User/Bob", newFileName: "User___Bob"})
function getFullPath(fileName: string) {
return path.join(graphDir, "pages", `${fileName}.md`);
}
// Test putting files on disk
for (const {pageTitle, fileName} of testCases) {
// Put the file on disk
const filePath = getFullPath(fileName);
await fsp.writeFile(filePath, `- content for ${pageTitle}`);
await captureConsoleWithPrefix(page, "Parsing finished:", 5000)
// Check that the page is created
const results = await searchPage(page, pageTitle);
const firstResultRow = await results[0].innerText()
expect(firstResultRow).toContain(pageTitle);
expect(firstResultRow).not.toContain("Create");
await closeSearchBox(page);
}
// Test renaming files on disk
for (const {pageTitle, fileName, newPageTitle, newFileName} of testCases) {
// Rename the file on disk
const filePath = getFullPath(fileName);
const newFilePath = getFullPath(newFileName);
await fsp.rename(filePath, newFilePath);
await captureConsoleWithPrefix(page, "Parsing finished:", 5000);
await page.waitForTimeout(500);
// Test that the page is renamed
const results = await searchPage(page, newPageTitle);
const firstResultRow = await results[0].innerText()
expect(firstResultRow).toContain(newPageTitle);
expect(firstResultRow).not.toContain(pageTitle);
expect(firstResultRow).not.toContain("Create");
await closeSearchBox(page);
}
})
test('special page names', async ({ page, block, graphDir }) => {
const testCases = [
{pageTitle: "User:John", fileName: "User%3AJohn"},
{pageTitle: "_#%ff", fileName: "_%23%25ff"},
{pageTitle: "@!#%", fileName: "@!%23%"},
{pageTitle: "aàáâ", fileName: "aàáâ"},
{pageTitle: "_#%gggg", fileName: "_%23%gggg"}
]
// Test putting files on disk
for (const {pageTitle, fileName} of testCases) {
const prefix = randomString(10)
const fullTitle = `${prefix}${pageTitle}`
// Create page in Logseq
await createPage(page, fullTitle)
const text = `content for ${pageTitle}`
await block.mustFill(text)
await page.keyboard.press("Enter", { delay: 50 })
await page.keyboard.press("Escape", { delay: 50 })
// Wait for the file to be created on disk
await page.waitForTimeout(2500);
// Validate that the file is created on disk with the content
const filePath = path.join(graphDir, "pages", `${prefix}${fileName}.md`);
const fileContent = await fsp.readFile(filePath, "utf8");
expect(fileContent).toContain(text);
}
});