whiteboards.spec.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import { expect } from '@playwright/test'
  2. import { test } from './fixtures'
  3. import { IsMac } from './utils'
  4. test('enable whiteboards', async ({ page }) => {
  5. await page.evaluate(() => {
  6. window.localStorage.setItem('ls-onboarding-whiteboard?', "true")
  7. })
  8. await expect(page.locator('.nav-header .whiteboard')).toBeHidden()
  9. await page.click('#head .toolbar-dots-btn')
  10. await page.click('#head .dropdown-wrapper >> text=Settings')
  11. await page.click('.settings-modal a[data-id=features]')
  12. await page.click('text=Whiteboards >> .. >> .ui__toggle')
  13. await page.waitForTimeout(1000)
  14. await page.keyboard.press('Escape')
  15. await expect(page.locator('.nav-header .whiteboard')).toBeVisible()
  16. })
  17. test('create new whiteboard', async ({ page }) => {
  18. await page.click('.nav-header .whiteboard')
  19. await page.click('#tl-create-whiteboard')
  20. await page.waitForTimeout(1500)
  21. await expect(page.locator('.logseq-tldraw')).toBeVisible()
  22. })
  23. test('can right click title to show context menu', async ({ page }) => {
  24. await page.click('.whiteboard-page-title', {
  25. button: 'right',
  26. })
  27. await expect(page.locator('#custom-context-menu')).toBeVisible()
  28. await page.keyboard.press('Escape')
  29. await expect(page.locator('#custom-context-menu')).toHaveCount(0)
  30. })
  31. test('newly created whiteboard should have a default title', async ({ page }) => {
  32. await expect(page.locator('.whiteboard-page-title .title')).toContainText(
  33. 'Untitled'
  34. )
  35. })
  36. test('set whiteboard title', async ({ page }) => {
  37. const title = 'my-whiteboard'
  38. await page.click('.whiteboard-page-title')
  39. await page.fill('.whiteboard-page-title input', title)
  40. const canvas = await page.waitForSelector('.logseq-tldraw')
  41. await canvas.click({
  42. position: {
  43. x: 100,
  44. y: 100,
  45. },
  46. })
  47. await expect(page.locator('.whiteboard-page-title .title')).toContainText(
  48. title
  49. )
  50. })
  51. test('update whiteboard title', async ({ page }) => {
  52. const title = 'my-whiteboard'
  53. await page.click('.whiteboard-page-title')
  54. await page.fill('.whiteboard-page-title input', title + '-2')
  55. const canvas = await page.waitForSelector('.logseq-tldraw')
  56. await canvas.click({
  57. position: {
  58. x: 100,
  59. y: 100,
  60. },
  61. })
  62. // Updating non-default title should pop up a confirmation dialog
  63. await expect(page.locator('.ui__confirm-modal >> .headline')).toContainText(
  64. `Do you really want to change the page name to “${title}-2”?`
  65. )
  66. await page.click('.ui__confirm-modal button')
  67. await expect(page.locator('.whiteboard-page-title .title')).toContainText(
  68. title + '-2'
  69. )
  70. })
  71. test('draw a rectangle', async ({ page }) => {
  72. const canvas = await page.waitForSelector('.logseq-tldraw')
  73. const bounds = (await canvas.boundingBox())!
  74. await page.keyboard.press('r')
  75. await page.mouse.move(bounds.x + 5, bounds.y + 5)
  76. await page.mouse.down()
  77. await page.mouse.move(
  78. bounds.x + bounds.width / 2,
  79. bounds.y + bounds.height / 2
  80. )
  81. await page.mouse.up()
  82. await expect(
  83. page.locator('.logseq-tldraw .tl-positioned-svg rect')
  84. ).not.toHaveCount(0)
  85. })
  86. test('cleanup the shapes', async ({ page }) => {
  87. if (IsMac) {
  88. await page.keyboard.press('Meta+a')
  89. } else {
  90. await page.keyboard.press('Control+a')
  91. }
  92. await page.keyboard.press('Delete')
  93. await expect(page.locator('[data-type=Shape]')).toHaveCount(0)
  94. })
  95. test('zoom in', async ({ page }) => {
  96. await page.keyboard.press('Shift+0') // reset zoom
  97. await page.waitForTimeout(1500) // wait for the zoom animation to finish
  98. await page.click('#tl-zoom-in')
  99. await expect(page.locator('#tl-zoom')).toContainText('125%')
  100. })
  101. test('zoom out', async ({ page }) => {
  102. await page.keyboard.press('Shift+0')
  103. await page.waitForTimeout(1500)
  104. await page.click('#tl-zoom-out')
  105. await expect(page.locator('#tl-zoom')).toContainText('80%')
  106. })
  107. test('open context menu', async ({ page }) => {
  108. await page.locator('.logseq-tldraw').click({ button: 'right' })
  109. await expect(page.locator('.tl-context-menu')).toBeVisible()
  110. })
  111. test('close context menu on esc', async ({ page }) => {
  112. await page.keyboard.press('Escape')
  113. await expect(page.locator('.tl-context-menu')).toBeHidden()
  114. })
  115. test('quick add another whiteboard', async ({ page }) => {
  116. // create a new board first
  117. await page.click('.nav-header .whiteboard')
  118. await page.click('#tl-create-whiteboard')
  119. await page.click('.whiteboard-page-title')
  120. await page.fill('.whiteboard-page-title input', 'my-whiteboard-3')
  121. const canvas = await page.waitForSelector('.logseq-tldraw')
  122. await canvas.click({
  123. position: {
  124. x: 100,
  125. y: 100,
  126. },
  127. })
  128. await canvas.dblclick({
  129. position: {
  130. x: 100,
  131. y: 100,
  132. },
  133. })
  134. const quickAdd$ = page.locator('.tl-quick-search')
  135. await expect(quickAdd$).toBeVisible()
  136. await page.fill('.tl-quick-search input', 'my-whiteboard')
  137. await quickAdd$
  138. .locator('.tl-quick-search-option >> text=my-whiteboard-2')
  139. .first()
  140. .click()
  141. await expect(quickAdd$).toBeHidden()
  142. await expect(
  143. page.locator('.tl-logseq-portal-container >> text=my-whiteboard-2')
  144. ).toBeVisible()
  145. })
  146. test('go to another board and check reference', async ({ page }) => {
  147. await page
  148. .locator('.tl-logseq-portal-container >> text=my-whiteboard-2')
  149. .click()
  150. await expect(page.locator('.whiteboard-page-title .title')).toContainText(
  151. 'my-whiteboard-2'
  152. )
  153. const pageRefCount$ = page.locator('.whiteboard-page-refs-count')
  154. await expect(pageRefCount$.locator('.open-page-ref-link')).toContainText('1')
  155. })