vim-keymap.spec.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { expect, type Page, test } from '@playwright/test';
  2. import { appendTextToEditorUntilContains } from '../utils/AppendTextToEditorUntilContains';
  3. /**
  4. * Tests for Vim keymap functionality in the editor
  5. * @see https://github.com/growilabs/growi/issues/8814
  6. * @see https://github.com/growilabs/growi/issues/10701
  7. */
  8. const changeKeymap = async (page: Page, keymap: string) => {
  9. // Open OptionsSelector
  10. await expect(page.getByTestId('options-selector-btn')).toBeVisible();
  11. await page.getByTestId('options-selector-btn').click();
  12. await expect(page.getByTestId('options-selector-menu')).toBeVisible();
  13. // Click keymap selection button to navigate to keymap selector
  14. await expect(page.getByTestId('keymap_current_selection')).toBeVisible();
  15. await page.getByTestId('keymap_current_selection').click();
  16. // Select Vim keymap
  17. await expect(page.getByTestId(`keymap_radio_item_${keymap}`)).toBeVisible();
  18. await page.getByTestId(`keymap_radio_item_${keymap}`).click();
  19. // Close OptionsSelector
  20. await page.getByTestId('options-selector-btn').click();
  21. await expect(page.getByTestId('options-selector-menu')).not.toBeVisible();
  22. };
  23. test.describe
  24. .serial('Vim keymap mode', () => {
  25. test.beforeEach(async ({ page }) => {
  26. await page.goto('/Sandbox/vim-keymap-test-page');
  27. // Open Editor
  28. await expect(page.getByTestId('editor-button')).toBeVisible();
  29. await page.getByTestId('editor-button').click();
  30. await expect(page.getByTestId('grw-editor-navbar-bottom')).toBeVisible();
  31. });
  32. test.afterAll(async ({ page }) => {
  33. // Restore keymap to default
  34. await changeKeymap(page, 'default');
  35. });
  36. test('Insert mode should persist while typing multiple characters', async ({
  37. page,
  38. }) => {
  39. const testText = 'Hello World';
  40. // Change to Vim keymap
  41. await changeKeymap(page, 'vim');
  42. // Focus the editor
  43. await page.locator('.cm-content').click();
  44. // Enter insert mode
  45. await page.keyboard.type('i');
  46. // Append text
  47. await appendTextToEditorUntilContains(page, testText);
  48. });
  49. test('Write command (:w) should save the page successfully', async ({
  50. page,
  51. }) => {
  52. // Enter normal mode
  53. await page.keyboard.press('Escape');
  54. // Enter command mode
  55. await page.keyboard.type(':');
  56. await expect(page.locator('.cm-vim-panel')).toBeVisible();
  57. // Type write command and execute
  58. await page.keyboard.type('w');
  59. await page.keyboard.press('Enter');
  60. // Expect a success toaster to be displayed
  61. await expect(page.locator('.Toastify__toast--success')).toBeVisible();
  62. });
  63. });