232 lines
7.2 KiB
TypeScript
232 lines
7.2 KiB
TypeScript
import { test, expect } from './mind-elixir-test'
|
|
|
|
const id = 'root-id'
|
|
const topic = 'root-topic'
|
|
const childTopic = 'child-topic'
|
|
const middleTopic = 'middle'
|
|
|
|
const data = {
|
|
nodeData: {
|
|
topic,
|
|
id,
|
|
children: [
|
|
{
|
|
id: 'middle',
|
|
topic: middleTopic,
|
|
children: [
|
|
{
|
|
id: 'child',
|
|
topic: childTopic,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
test.beforeEach(async ({ me }) => {
|
|
await me.init(data)
|
|
})
|
|
|
|
test('Undo/Redo - Add Node Operations', async ({ page, me }) => {
|
|
// Select child node and add a sibling
|
|
await me.click(childTopic)
|
|
await page.keyboard.press('Enter')
|
|
await page.keyboard.press('Enter')
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
|
|
|
// Undo the add operation using Ctrl+Z
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
|
|
|
// Redo the add operation using Ctrl+Y
|
|
await page.keyboard.press('Control+y')
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
|
|
|
// Undo again using Ctrl+Z
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
|
|
|
// Redo using Ctrl+Shift+Z (alternative redo shortcut)
|
|
await page.keyboard.press('Control+Shift+Z')
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
|
})
|
|
|
|
test('Undo/Redo - Remove Node Operations', async ({ page, me }) => {
|
|
// Remove child node
|
|
await me.click(childTopic)
|
|
await page.keyboard.press('Delete')
|
|
await expect(me.getByText(childTopic)).toBeHidden()
|
|
|
|
// Undo the remove operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
|
|
// Redo the remove operation
|
|
await page.keyboard.press('Control+y')
|
|
await expect(me.getByText(childTopic)).toBeHidden()
|
|
|
|
// Undo again to restore the node
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
})
|
|
|
|
test('Undo/Redo - Edit Node Operations', async ({ page, me }) => {
|
|
const originalText = childTopic
|
|
const newText = 'updated-child-topic'
|
|
|
|
// Edit the child node
|
|
await me.dblclick(childTopic)
|
|
await expect(page.locator('#input-box')).toBeVisible()
|
|
await page.keyboard.insertText(newText)
|
|
await page.keyboard.press('Enter')
|
|
await expect(me.getByText(newText)).toBeVisible()
|
|
|
|
// Undo the edit operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText(originalText)).toBeVisible()
|
|
await expect(me.getByText(newText)).toBeHidden()
|
|
|
|
// Redo the edit operation
|
|
await page.keyboard.press('Control+y')
|
|
await expect(me.getByText(newText)).toBeVisible()
|
|
await expect(me.getByText(originalText)).toBeHidden()
|
|
})
|
|
|
|
test('Undo/Redo - Multiple Operations Sequence', async ({ page, me }) => {
|
|
// Perform multiple operations
|
|
// 1. Add a child node
|
|
await me.click(childTopic)
|
|
await page.keyboard.press('Tab')
|
|
await page.keyboard.press('Enter')
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
|
|
|
// 2. Add a sibling node
|
|
await page.keyboard.press('Enter')
|
|
await page.keyboard.press('Enter')
|
|
const newNodes = me.getByText('New Node')
|
|
await expect(newNodes).toHaveCount(2)
|
|
|
|
// 3. Edit the first new node
|
|
await page.keyboard.press('ArrowUp')
|
|
await page.keyboard.press('F2')
|
|
await expect(page.locator('#input-box')).toBeVisible()
|
|
await page.keyboard.insertText('First New Node')
|
|
await page.keyboard.press('Enter')
|
|
await expect(me.getByText('First New Node')).toBeVisible()
|
|
|
|
// Now undo operations step by step
|
|
// Undo edit operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText('First New Node')).toBeHidden()
|
|
await expect(me.getByText('New Node')).toHaveCount(2)
|
|
|
|
// Undo second add operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(newNodes).toHaveCount(1)
|
|
|
|
// Undo first add operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
|
|
|
// Redo all operations
|
|
await page.keyboard.press('Control+y') // Redo first add
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
|
|
|
await page.keyboard.press('Control+y') // Redo second add
|
|
await expect(newNodes).toHaveCount(2)
|
|
|
|
await page.keyboard.press('Control+y') // Redo edit
|
|
await expect(me.getByText('First New Node')).toBeVisible()
|
|
})
|
|
|
|
test('Undo/Redo - Copy and Paste Operations', async ({ page, me }) => {
|
|
// Copy middle node
|
|
await me.click(middleTopic)
|
|
await page.keyboard.press('Control+c')
|
|
|
|
// Paste to child node
|
|
await me.click(childTopic)
|
|
await page.keyboard.press('Control+v')
|
|
|
|
// Verify the copy was successful (should have two "middle" nodes)
|
|
const middleNodes = me.getByText(middleTopic)
|
|
await expect(middleNodes).toHaveCount(2)
|
|
|
|
// Undo the paste operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(middleNodes).toHaveCount(1)
|
|
|
|
// Redo the paste operation
|
|
await page.keyboard.press('Control+y')
|
|
await expect(middleNodes).toHaveCount(2)
|
|
})
|
|
|
|
test('Undo/Redo - Cut and Paste Operations', async ({ page, me }) => {
|
|
// Cut child node
|
|
await me.click(childTopic)
|
|
await page.keyboard.press('Control+x')
|
|
await expect(me.getByText(childTopic)).toBeHidden()
|
|
|
|
// Paste to root node
|
|
await me.click(topic)
|
|
await page.keyboard.press('Control+v')
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
|
|
// Undo the paste operation
|
|
await page.keyboard.press('Control+z')
|
|
// After undo, the node should be back in its original position
|
|
|
|
// Undo the cut operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
|
|
// Redo the cut operation
|
|
await page.keyboard.press('Control+y')
|
|
await expect(me.getByText(childTopic)).toBeHidden()
|
|
|
|
// Redo the paste operation
|
|
await page.keyboard.press('Control+y')
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
})
|
|
|
|
test('Undo/Redo - No Operations Available', async ({ page, me }) => {
|
|
// Try to undo when no operations are available
|
|
await page.keyboard.press('Control+z')
|
|
// Should not crash or change anything
|
|
await expect(me.getByText(topic)).toBeVisible()
|
|
await expect(me.getByText(middleTopic)).toBeVisible()
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
|
|
// Try to redo when no operations are available
|
|
await page.keyboard.press('Control+y')
|
|
// Should not crash or change anything
|
|
await expect(me.getByText(topic)).toBeVisible()
|
|
await expect(me.getByText(middleTopic)).toBeVisible()
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
})
|
|
|
|
test('Undo/Redo - Node Selection Restoration', async ({ page, me }) => {
|
|
// Add a new node and verify it gets selected
|
|
await me.click(childTopic)
|
|
await page.keyboard.press('Enter')
|
|
await page.keyboard.press('Enter')
|
|
|
|
// The new node should be selected (we can verify this by checking if it has focus)
|
|
const newNode = me.getByText('New Node')
|
|
await expect(newNode).toBeVisible()
|
|
|
|
// Undo the operation
|
|
await page.keyboard.press('Control+z')
|
|
await expect(newNode).toBeHidden()
|
|
|
|
// The original child node should be selected again after undo
|
|
// We can verify this by trying to perform an action that requires a selected node
|
|
await page.keyboard.press('Delete')
|
|
await expect(me.getByText(childTopic)).toBeHidden()
|
|
|
|
// Undo the delete to restore the node
|
|
await page.keyboard.press('Control+z')
|
|
await expect(me.getByText(childTopic)).toBeVisible()
|
|
})
|