Files
logseq/e2e-tests/logseq-api.spec.ts
2024-09-26 09:57:48 +08:00

231 lines
6.9 KiB
TypeScript

import { test } from './fixtures'
import { expect } from '@playwright/test'
import { callPageAPI } from './utils'
import { Page } from 'playwright'
async function createDBGraph(page: Page) {
await page.locator(`a.cp__repos-select-trigger`).click()
await page.click('text="Create db graph"')
await page.waitForSelector('.new-graph')
const name = `e2e-db-${Date.now()}`
await page.waitForTimeout(100)
await page.keyboard.type(name)
await page.locator('.new-graph > .ui__button').click()
return name
}
test.skip('test db graph', async ({ page }) => {
const name = await createDBGraph(page)
await page.waitForSelector(`a[title="logseq_db_${name}"]`)
await page.pause()
})
test('(File graph): block related apis',
async ({ page }) => {
const callAPI = callPageAPI.bind(null, page)
const bPageName = 'block-test-page'
await callAPI('create_page', bPageName, null, { createFirstBlock: false })
await callAPI('create_page', bPageName, null, { createFirstBlock: false })
await page.waitForSelector(`body[data-page="${bPageName}"]`)
let p = await callAPI('get_current_page')
const bp = await callAPI('append_block_in_page', bPageName, 'tests')
expect(p.name).toBe(bPageName)
p = await callAPI('get_page', bPageName)
expect(p.name).toBe(bPageName)
await callAPI('edit_block', bp.uuid)
const b = (await callAPI('get_current_block'))
expect(Object.keys(b)).toContain('uuid')
await page.waitForSelector('.block-editor > textarea')
await page.locator('.block-editor > textarea').fill('')
const content = 'test api'
await page.type('.block-editor > textarea', content)
const editingContent = await callAPI('get_editing_block_content')
expect(editingContent).toBe(content)
// create
let b1 = await callAPI('insert_block', b.uuid, content)
b1 = await callAPI('get_block', b1.uuid)
expect(b1.parent.id).toBe(b.id)
// update
const content1 = content + '+ update!'
await callAPI('update_block', b1.uuid, content1)
b1 = await callAPI('get_block', b1.uuid)
expect(b1.content).toBe(content1)
// remove
await callAPI('remove_block', b1.uuid)
b1 = await callAPI('get_block', b1.uuid)
expect(b1).toBeNull()
// traverse
b1 = await callAPI('insert_block', b.uuid, content1, { sibling: true })
const nb = await callAPI('get_next_sibling_block', b.uuid)
const pb = await callAPI('get_previous_sibling_block', b1.uuid)
expect(nb.uuid).toBe(b1.uuid)
expect(pb.uuid).toBe(b.uuid)
// move
await callAPI('move_block', b.uuid, b1.uuid)
const mb = await callAPI('get_next_sibling_block', b1.uuid)
expect(mb.uuid).toBe(b.uuid)
// properties
await callAPI('upsert_block_property', b1.uuid, 'a', 1)
let prop1 = await callAPI('get_block_property', b1.uuid, 'a')
expect(prop1).toBe(1)
await callAPI('upsert_block_property', b1.uuid, 'a', 2)
prop1 = await callAPI('get_block_property', b1.uuid, 'a')
expect(prop1).toBe(2)
await callAPI('remove_block_property', b1.uuid, 'a')
prop1 = await callAPI('get_block_property', b1.uuid, 'a')
expect(prop1).toBeNull()
await callAPI('upsert_block_property', b1.uuid, 'a', 1)
await callAPI('upsert_block_property', b1.uuid, 'b', 1)
prop1 = await callAPI('get_block_properties', b1.uuid)
expect(prop1).toEqual({ a: 1, b: 1 })
// await page.pause()
})
test('(DB graph): block related apis',
async ({ page }) => {
const name = await createDBGraph(page)
await page.waitForSelector(`a[title="logseq_db_${name}"]`)
const callAPI = callPageAPI.bind(null, page)
const bPageName = 'block-test-page'
await callAPI('create_page', bPageName, null, { createFirstBlock: false })
await callAPI('create_page', bPageName, null, { createFirstBlock: false })
await page.waitForSelector(`body[data-page="${bPageName}"]`)
let p = await callAPI('get_current_page')
const bp = await callAPI('append_block_in_page', bPageName, 'tests')
expect(p.name).toBe(bPageName)
p = await callAPI('get_page', bPageName)
expect(p.name).toBe(bPageName)
await callAPI('edit_block', bp.uuid)
const b = (await callAPI('get_current_block'))
expect(Object.keys(b)).toContain('uuid')
await page.waitForSelector('.block-editor > textarea')
await page.locator('.block-editor > textarea').fill('')
const content = 'test api'
await page.type('.block-editor > textarea', content)
const editingContent = await callAPI('get_editing_block_content')
expect(editingContent).toBe(content)
// create
let b1 = await callAPI('insert_block', b.uuid, content)
b1 = await callAPI('get_block', b1.uuid)
expect(b1.parent.id).toBe(b.id)
// update
const content1 = content + '+ update!'
await callAPI('update_block', b1.uuid, content1)
b1 = await callAPI('get_block', b1.uuid)
expect(b1.content).toBe(content1)
// remove
await callAPI('remove_block', b1.uuid)
b1 = await callAPI('get_block', b1.uuid)
expect(b1).toBeNull()
// traverse
b1 = await callAPI('insert_block', b.uuid, content1, { sibling: true })
const nb = await callAPI('get_next_sibling_block', b.uuid)
const pb = await callAPI('get_previous_sibling_block', b1.uuid)
expect(nb.uuid).toBe(b1.uuid)
expect(pb.uuid).toBe(b.uuid)
// move
await callAPI('move_block', b.uuid, b1.uuid)
const mb = await callAPI('get_next_sibling_block', b1.uuid)
expect(mb.uuid).toBe(b.uuid)
// properties
await callAPI('upsert_block_property', b1.uuid, 'a', 'a')
let prop1 = await callAPI('get_block_property', b1.uuid, 'a')
expect(prop1.title).toBe('a')
await callAPI('upsert_block_property', b1.uuid, 'a', 'b')
prop1 = await callAPI('get_block_property', b1.uuid, 'a')
expect(prop1.title).toBe('b')
await callAPI('remove_block_property', b1.uuid, 'a')
prop1 = await callAPI('get_block_property', b1.uuid, 'a')
expect(prop1).toBeNull()
await callAPI('upsert_block_property', b1.uuid, 'a', 'a')
await callAPI('upsert_block_property', b1.uuid, 'b', 'b')
prop1 = await callAPI('get_block_properties', b1.uuid)
expect(prop1).toEqual({ ':plugin.property/a': 'a', ':plugin.property/b': 'b' })
// await page.pause()
})
/**
* load local tests plugin
*/
export async function loadLocalE2eTestsPlugin(page) {
const pid = 'a-logseq-plugin-for-e2e-tests'
const hasLoaded = await page.evaluate(async ([pid]) => {
// @ts-ignore
const p = window.LSPluginCore.registeredPlugins.get(pid)
// @ts-ignore
await window.LSPluginCore.enable(pid)
return p != null
}, [pid])
if (hasLoaded) return true
await callPageAPI(page, 'set_state_from_store',
'ui/developer-mode?', true)
await page.keyboard.press('t+p')
await page.locator('text=Load unpacked plugin')
await callPageAPI(page, 'set_state_from_store',
'plugin/selected-unpacked-pkg', `${__dirname}/plugin`)
await page.keyboard.press('Escape')
await page.keyboard.press('Escape')
}