whiteboards.spec.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { expect } from '@playwright/test'
  2. import { test } from './fixtures'
  3. import { IsMac } from './utils'
  4. test('enable whiteboards', async ({ page }) => {
  5. await expect(page.locator('.nav-header .whiteboard')).toBeHidden()
  6. await page.click('#head .toolbar-dots-btn')
  7. await page.click('#head .dropdown-wrapper >> text=Settings')
  8. await page.click('.settings-modal a[data-id=features]')
  9. await page.click('text=Whiteboards >> .. >> .ui__toggle')
  10. await page.keyboard.press('Escape')
  11. await expect(page.locator('.nav-header .whiteboard')).toBeVisible()
  12. })
  13. test('create new whiteboard', async ({ page }) => {
  14. await page.click('.nav-header .whiteboard')
  15. await page.click('#tl-create-whiteboard')
  16. await expect(page.locator('.logseq-tldraw')).toHaveCount(1)
  17. })
  18. test('check if the page contains the onboarding whiteboard', async ({ page }) => {
  19. await expect(page.locator('.tl-text-shape-wrapper >> text=Welcome to')).toHaveCount(1)
  20. })
  21. test('cleanup the shapes', async ({ page }) => {
  22. if (IsMac) {
  23. await page.keyboard.press('Meta+a')
  24. } else {
  25. await page.keyboard.press('Control+a')
  26. }
  27. await page.keyboard.press('Delete')
  28. await expect(page.locator('[data-type=Shape]')).toHaveCount(0)
  29. })
  30. test('set whiteboard title', async ({ page }) => {
  31. const title = "my-whiteboard"
  32. // Newly created whiteboard should have a default title
  33. await expect(page.locator('.whiteboard-page-title .title')).toContainText("Untitled");
  34. await page.click('.whiteboard-page-title')
  35. await page.fill('.whiteboard-page-title input', title)
  36. await page.keyboard.press('Enter')
  37. await expect(page.locator('.whiteboard-page-title .title')).toContainText(title);
  38. await page.click('.whiteboard-page-title')
  39. await page.fill('.whiteboard-page-title input', title + "-2")
  40. await page.keyboard.press('Enter')
  41. // Updating non-default title should pop up a confirmation dialog
  42. await expect(page.locator('.ui__confirm-modal >> .headline')).toContainText(`Do you really want to change the page name to “${title}-2”?`);
  43. await page.click('.ui__confirm-modal button')
  44. await expect(page.locator('.whiteboard-page-title .title')).toContainText(title + "-2");
  45. })
  46. test('select rectangle tool', async ({ page }) => {
  47. await page.keyboard.press('8')
  48. await expect(page.locator('.tl-geometry-tools-pane-anchor [title*="Rectangle"]')).toHaveAttribute('data-selected', 'true')
  49. })
  50. test('draw a rectangle', async ({ page }) => {
  51. const canvas = await page.waitForSelector('.logseq-tldraw');
  52. const bounds = (await canvas.boundingBox())!;
  53. await page.keyboard.press('8')
  54. await page.mouse.move(bounds.x, bounds.y);
  55. await page.mouse.down();
  56. await page.mouse.move(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);
  57. await page.mouse.up();
  58. await expect(page.locator('.logseq-tldraw .tl-positioned-svg rect')).not.toHaveCount(0);
  59. })
  60. test('zoom in', async ({ page }) => {
  61. await page.click('#tl-zoom-in')
  62. await expect(page.locator('#tl-zoom')).toContainText('125%');
  63. })
  64. test('zoom out', async ({ page }) => {
  65. await page.click('#tl-zoom-out')
  66. await expect(page.locator('#tl-zoom')).toContainText('100%');
  67. })
  68. test('open context menu', async ({ page }) => {
  69. await page.locator('.logseq-tldraw').click({ button: "right" })
  70. await expect(page.locator('.tl-context-menu')).toBeVisible()
  71. })
  72. test('close context menu on esc', async ({ page }) => {
  73. await page.keyboard.press('Escape')
  74. await expect(page.locator('.tl-context-menu')).toBeHidden()
  75. })
  76. test('quick add another whiteboard', async ({ page }) => {
  77. // create a new board first
  78. await page.click('.nav-header .whiteboard')
  79. await page.click('#tl-create-whiteboard')
  80. await page.click('.whiteboard-page-title')
  81. await page.fill('.whiteboard-page-title input', "my-whiteboard-3")
  82. await page.keyboard.press('Enter')
  83. const canvas = await page.waitForSelector('.logseq-tldraw');
  84. await canvas.dblclick({
  85. position: {
  86. x: 100,
  87. y: 100
  88. }
  89. })
  90. const quickAdd$ = page.locator('.tl-quick-search')
  91. await expect(quickAdd$).toBeVisible()
  92. await page.fill('.tl-quick-search input', 'my-whiteboard')
  93. await quickAdd$.locator('.tl-quick-search-option >> text=my-whiteboard-2').first().click()
  94. await expect(quickAdd$).toBeHidden()
  95. await expect(page.locator('.tl-logseq-portal-container >> text=my-whiteboard-2')).toBeVisible()
  96. })
  97. test('go to another board and check reference', async ({ page }) => {
  98. await page.locator('.tl-logseq-portal-container >> text=my-whiteboard-2').click()
  99. await expect(page.locator('.whiteboard-page-title .title')).toContainText("my-whiteboard-2");
  100. const pageRefCount$ = page.locator('.whiteboard-page-refs-count')
  101. await expect(pageRefCount$.locator('.open-page-ref-link')).toContainText('1')
  102. await pageRefCount$.click()
  103. await expect(page.locator('.references-blocks')).toBeVisible()
  104. await expect(page.locator('.references-blocks >> .page-ref >> text=my-whiteboard-3')).toBeVisible()
  105. })