page-search.spec.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { expect, Page } from '@playwright/test'
  2. import { test } from './fixtures'
  3. import { Block } from './types'
  4. import { IsMac, createRandomPage, newBlock, newInnerBlock, randomString, lastBlock, enterNextBlock } from './utils'
  5. /***
  6. * Test alias features
  7. * Test search refering features
  8. * Consider diacritics
  9. ***/
  10. let hotkeyOpenLink = 'Control+o'
  11. let hotkeyBack = 'Control+['
  12. if (IsMac) {
  13. hotkeyOpenLink = 'Meta+o'
  14. hotkeyBack = 'Meta+['
  15. }
  16. test('Search page and blocks (diacritics)', async ({ page, block }) => {
  17. const rand = randomString(20)
  18. // diacritic opening test
  19. await createRandomPage(page)
  20. await block.mustType('[[Einführung in die Allgemeine Sprachwissenschaft' + rand + ']] diacritic-block-1', { delay: 10 })
  21. await page.keyboard.press(hotkeyOpenLink)
  22. const pageTitle = page.locator('.page-title').first()
  23. expect(await pageTitle.innerText()).toEqual('Einführung in die Allgemeine Sprachwissenschaft' + rand)
  24. await page.waitForTimeout(500)
  25. // build target Page with diacritics
  26. await block.activeEditing(0)
  27. await block.mustType('Diacritic title test content', { delay: 10 })
  28. await block.enterNext()
  29. await block.mustType('[[Einführung in die Allgemeine Sprachwissenschaft' + rand + ']] diacritic-block-2', { delay: 10 })
  30. await page.keyboard.press(hotkeyBack)
  31. // check if diacritics are indexed
  32. await page.click('#search-button')
  33. await page.waitForSelector('[placeholder="Search or create page"]')
  34. await page.type('[placeholder="Search or create page"]', 'Einführung in die Allgemeine Sprachwissenschaft' + rand, { delay: 10 })
  35. await page.waitForTimeout(2000) // wait longer for search contents to render
  36. // 2 blocks + 1 page + 1 page content
  37. const searchResults = page.locator('#ui__ac-inner>div')
  38. await expect(searchResults).toHaveCount(5) // 1 page + 2 block + 2 page content
  39. await page.keyboard.press("Escape") // escape search box typing
  40. await page.waitForTimeout(500)
  41. await page.keyboard.press("Escape") // escape modal
  42. })
  43. test('Search CJK', async ({ page, block }) => {
  44. const rand = randomString(20)
  45. // diacritic opening test
  46. await createRandomPage(page)
  47. await block.mustType('[[今日daytime进度条' + rand + ']] diacritic-block-1', { delay: 10 })
  48. await page.keyboard.press(hotkeyOpenLink)
  49. const pageTitle = page.locator('.page-title').first()
  50. expect(await pageTitle.innerText()).toEqual('今日daytime进度条' + rand)
  51. await page.waitForTimeout(500)
  52. // check if diacritics are indexed
  53. await page.click('#search-button')
  54. await page.waitForSelector('[placeholder="Search or create page"]')
  55. await page.type('[placeholder="Search or create page"]', '进度', { delay: 10 })
  56. await page.waitForTimeout(2000) // wait longer for search contents to render
  57. // 2 blocks + 1 page + 1 page content
  58. const searchResults = page.locator('#ui__ac-inner>div')
  59. await expect(searchResults).toHaveCount(4) // 1 new page + 1 page + 1 block + 1 page content
  60. await page.keyboard.press("Escape") // escape search box typing
  61. await page.waitForTimeout(500)
  62. await page.keyboard.press("Escape") // escape modal
  63. })
  64. async function alias_test( block: Block, page: Page, page_name: string, search_kws: string[] ) {
  65. await createRandomPage(page)
  66. const rand = randomString(10)
  67. let target_name = page_name + ' target ' + rand
  68. let alias_name = page_name + ' alias ' + rand
  69. let alias_test_content_1 = randomString(20)
  70. let alias_test_content_2 = randomString(20)
  71. let alias_test_content_3 = randomString(20)
  72. await page.type('textarea >> nth=0', '[[' + target_name)
  73. await page.keyboard.press(hotkeyOpenLink)
  74. await lastBlock(page)
  75. // build target Page with alias
  76. // the target page will contains the content in
  77. // alias_test_content_1,
  78. // alias_test_content_2, and
  79. // alias_test_content_3 sequentialy, to validate the target page state
  80. await page.type('textarea >> nth=0', 'alias:: [[' + alias_name, {delay: 10})
  81. await page.keyboard.press('Enter', {delay: 200}) // Enter for finishing selection
  82. await page.keyboard.press('Enter', {delay: 200}) // double Enter for exit property editing
  83. await page.keyboard.press('Enter', {delay: 200}) // double Enter for exit property editing
  84. await page.waitForTimeout(200)
  85. await block.activeEditing(1)
  86. await page.type('textarea >> nth=0', alias_test_content_1)
  87. await lastBlock(page)
  88. page.keyboard.press(hotkeyBack)
  89. await page.waitForNavigation()
  90. await block.escapeEditing()
  91. // create alias ref in origin Page
  92. await block.activeEditing(0)
  93. await block.enterNext()
  94. await page.type('textarea >> nth=0', '[[' + alias_name, {delay: 20})
  95. await page.keyboard.press('Enter') // Enter for finishing selection
  96. await page.waitForTimeout(100)
  97. page.keyboard.press(hotkeyOpenLink)
  98. await page.waitForNavigation()
  99. await block.escapeEditing()
  100. // shortcut opening test
  101. await block.activeEditing(1)
  102. expect(await page.inputValue('textarea >> nth=0')).toBe(alias_test_content_1)
  103. await enterNextBlock(page)
  104. await page.type('textarea >> nth=0', alias_test_content_2)
  105. page.keyboard.press(hotkeyBack)
  106. await page.waitForNavigation()
  107. await block.escapeEditing()
  108. // pressing enter on alias opening test
  109. await block.activeEditing(1)
  110. await page.press('textarea >> nth=0', 'ArrowLeft')
  111. await page.press('textarea >> nth=0', 'ArrowLeft')
  112. await page.press('textarea >> nth=0', 'ArrowLeft')
  113. page.press('textarea >> nth=0', 'Enter')
  114. await page.waitForNavigation()
  115. await block.escapeEditing()
  116. await block.activeEditing(2)
  117. expect(await page.inputValue('textarea >> nth=0')).toBe(alias_test_content_2)
  118. await newInnerBlock(page)
  119. await page.type('textarea >> nth=0', alias_test_content_3)
  120. page.keyboard.press(hotkeyBack)
  121. await page.waitForNavigation()
  122. await block.escapeEditing()
  123. // clicking alias ref opening test
  124. await block.activeEditing(1)
  125. await block.enterNext()
  126. await page.waitForSelector('.page-blocks-inner .ls-block .page-ref >> nth=-1')
  127. await page.click('.page-blocks-inner .ls-block .page-ref >> nth=-1')
  128. await lastBlock(page)
  129. expect(await page.inputValue('textarea >> nth=0')).toBe(alias_test_content_3)
  130. // TODO: test alias from graph clicking
  131. // test alias from search
  132. for (let kw of search_kws) {
  133. let kw_name = kw + ' alias ' + rand
  134. await page.click('#search-button')
  135. await page.waitForSelector('[placeholder="Search or create page"]')
  136. await page.type('[placeholder="Search or create page"]', kw_name)
  137. await page.waitForTimeout(500)
  138. const results = await page.$$('#ui__ac-inner>div')
  139. expect(results.length).toEqual(5) // page + block + alias property + page content
  140. // test search results
  141. expect(await results[0].innerText()).toContain("Alias -> " + target_name)
  142. expect(await results[0].innerText()).toContain(alias_name)
  143. expect(await results[1].innerText()).toContain("[[" + alias_name + "]]")
  144. expect(await results[2].innerText()).toContain("[[" + alias_name + "]]")
  145. // test search entering (page)
  146. page.keyboard.press("Enter")
  147. await page.waitForNavigation()
  148. await page.waitForSelector('.ls-block span.inline')
  149. expect(await page.locator('.ls-block span.inline >> nth=2').innerHTML()).toBe(alias_test_content_3)
  150. // test search clicking (block)
  151. await page.click('#search-button')
  152. await page.waitForSelector('[placeholder="Search or create page"]')
  153. await page.type('[placeholder="Search or create page"]', kw_name)
  154. await page.waitForTimeout(500)
  155. page.click(":nth-match(.search-result, 3)")
  156. await page.waitForNavigation()
  157. await page.waitForSelector('.selected a.page-ref')
  158. expect(await page.locator('.selected a.page-ref').innerHTML()).toBe(alias_name)
  159. await page.keyboard.press(hotkeyBack)
  160. }
  161. // TODO: search clicking (alias property)
  162. }
  163. test('page diacritic alias', async ({ block, page }) => {
  164. await alias_test(block, page, "ü", ["ü", "ü", "Ü"])
  165. })