enso/app/gui2/e2e/selectingNodes.spec.ts
Adam Obuchowicz 667ce038e7
Fix node removing bug, caused by spurious watchEffect effect. (#11099)
Fixes [#11062](https://github.com/enso-org/enso/issues/11062)

Modified watchEffect to be consistent with Vue behavior + tests. Before the scheduled effects were run even if stopped.

Why it fixes nodes removal? See [this comment](https://github.com/enso-org/enso/issues/11062#issuecomment-2352975474)
2024-09-17 07:12:59 +00:00

92 lines
3.7 KiB
TypeScript

import { test } from '@playwright/test'
import assert from 'assert'
import * as actions from './actions'
import { expect } from './customExpect'
import * as locate from './locate'
test('Selecting nodes by click', async ({ page }) => {
await actions.goToGraph(page)
const node1 = locate.graphNodeByBinding(page, 'five')
const node2 = locate.graphNodeByBinding(page, 'final')
const selectionMenu = page.locator('.SelectionMenu')
await expect(node1).not.toBeSelected()
await expect(node2).not.toBeSelected()
await expect(selectionMenu).toBeHidden()
await locate.graphNodeIcon(node1).click()
await expect(node1).toBeSelected()
await expect(node2).not.toBeSelected()
await expect(selectionMenu).toBeHidden()
// Check that clicking an unselected node deselects replaces the previous selection.
await locate.graphNodeIcon(node2).click()
await expect(node1).not.toBeSelected()
await expect(node2).toBeSelected()
await expect(selectionMenu).toBeHidden()
await page.waitForTimeout(300) // Avoid double clicks
await locate.graphNodeIcon(node1).click({ modifiers: ['Shift'] })
await expect(node1).toBeSelected()
await expect(node2).toBeSelected()
await expect(selectionMenu).toBeVisible()
// Check that when two nodes are selected, clicking a selected node replaces the previous selection.
await locate.graphNodeIcon(node2).click()
await expect(node1).not.toBeSelected()
await expect(node2).toBeSelected()
await expect(selectionMenu).toBeHidden()
// Check that clicking the background deselects all nodes.
await locate.graphEditor(page).click({ position: { x: 600, y: 200 } })
await expect(node1).not.toBeSelected()
await expect(node2).not.toBeSelected()
await expect(selectionMenu).toBeHidden()
})
test('Selecting nodes by area drag', async ({ page }) => {
await actions.goToGraph(page)
const node1 = locate.graphNodeByBinding(page, 'five')
const node2 = locate.graphNodeByBinding(page, 'ten')
await expect(node1).not.toBeSelected()
await expect(node2).not.toBeSelected()
const node1Id = await node1.getAttribute('data-node-id')
const node1Selection = page.locator(`.GraphNodeSelection[data-node-id="${node1Id}"]`)
const node1BBox = await node1Selection.boundingBox()
const node2BBox = await node2.boundingBox()
assert(node1BBox)
assert(node2BBox)
await page.mouse.move(node1BBox.x - 50, node1BBox.y - 50)
await page.mouse.down()
await page.mouse.move(node1BBox.x - 40, node1BBox.y - 40)
// await expect(page.locator('.SelectionBrush')).toBeVisible()
await page.mouse.move(node2BBox.x + node2BBox.width, node2BBox.y + node2BBox.height)
await expect(node1).toBeSelected()
await expect(node2).toBeSelected()
await page.mouse.up()
await expect(node1).toBeSelected()
await expect(node2).toBeSelected()
})
test('Moving selected nodes', async ({ page }) => {
await actions.goToGraph(page)
const movedNode = locate.graphNodeByBinding(page, 'final')
const notMovedNode = locate.graphNodeByBinding(page, 'sum')
await locate.graphNodeIcon(movedNode).click()
// Selection may affect bounding box: wait until it's actually selected.
await expect(movedNode).toBeSelected()
const initialBBox = await movedNode.boundingBox()
const initialNotMovedBBox = await notMovedNode.boundingBox()
assert(initialBBox)
assert(initialNotMovedBBox)
await page.keyboard.press('ArrowLeft', { delay: 500 })
const bbox = await movedNode.boundingBox()
const notMovedBBox = await notMovedNode.boundingBox()
assert(bbox)
assert(notMovedBBox)
await expect(bbox.x).not.toBeCloseTo(initialBBox.x)
await expect(bbox.y).toBeCloseTo(initialBBox.y)
await expect(notMovedBBox.x).toBeCloseTo(initialNotMovedBBox.x)
await expect(notMovedBBox.y).toBeCloseTo(initialNotMovedBBox.y)
})