vim-keymap.spec.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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('Insert mode should persist while typing multiple characters', async ({
  33. page,
  34. }) => {
  35. const testText = 'Hello World';
  36. // Change to Vim keymap
  37. await changeKeymap(page, 'vim');
  38. // Focus the editor
  39. await page.locator('.cm-content').click();
  40. // Enter insert mode
  41. await page.keyboard.type('i');
  42. // Append text
  43. await appendTextToEditorUntilContains(page, testText);
  44. });
  45. test('Write command (:w) should save the page successfully', async ({
  46. page,
  47. }) => {
  48. // Enter normal mode
  49. await page.keyboard.press('Escape');
  50. // Enter command mode
  51. await page.keyboard.press('Shift+Semicolon');
  52. await expect(page.locator('.cm-vim-panel')).toBeVisible();
  53. // Type write command and execute
  54. await page.keyboard.type('w');
  55. await page.keyboard.press('Enter');
  56. // Expect a success toaster to be displayed
  57. await expect(page.locator('.Toastify__toast--success')).toBeVisible();
  58. // Restore keymap to default
  59. await changeKeymap(page, 'default');
  60. });
  61. });