|
@@ -68,7 +68,8 @@ describe('workspace browser rows', () => {
|
|
|
const onOpen = vi.fn()
|
|
const onOpen = vi.fn()
|
|
|
const onToggle = vi.fn()
|
|
const onToggle = vi.fn()
|
|
|
const view = render(
|
|
const view = render(
|
|
|
- <SessionNodeItem node={parent} depth={0} currentId={parent.id} now={0} onOpen={onOpen} onToggle={onToggle} />,
|
|
|
|
|
|
|
+ <SessionNodeItem node={parent} depth={0} currentId={parent.id} now={0} onOpen={onOpen}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={onToggle} />,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const parentRow = screen.getByText('Parent').closest('[role="treeitem"]')!
|
|
const parentRow = screen.getByText('Parent').closest('[role="treeitem"]')!
|
|
@@ -88,7 +89,8 @@ describe('workspace browser rows', () => {
|
|
|
view.rerender(
|
|
view.rerender(
|
|
|
<SessionNodeItem
|
|
<SessionNodeItem
|
|
|
node={{ ...parent, children: [], expanded: false, running: false }}
|
|
node={{ ...parent, children: [], expanded: false, running: false }}
|
|
|
- depth={1} currentId={undefined} now={0} onOpen={onOpen} onToggle={onToggle}
|
|
|
|
|
|
|
+ depth={1} currentId={undefined} now={0} onOpen={onOpen}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={onToggle}
|
|
|
/>,
|
|
/>,
|
|
|
)
|
|
)
|
|
|
expect(screen.getByRole('button', { name: 'Expand' })).toBeTruthy()
|
|
expect(screen.getByRole('button', { name: 'Expand' })).toBeTruthy()
|
|
@@ -135,19 +137,29 @@ describe('workspace browser rows', () => {
|
|
|
expect(screen.queryByRole('button', { name: /Workspace actions/ })).toBeNull()
|
|
expect(screen.queryByRole('button', { name: /Workspace actions/ })).toBeNull()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- it('session row menu opens without opening the session and closes on selection', () => {
|
|
|
|
|
|
|
+ it('session row menu opens without opening the session and dispatches rename', () => {
|
|
|
const onOpen = vi.fn()
|
|
const onOpen = vi.fn()
|
|
|
|
|
+ const onRename = vi.fn()
|
|
|
const node: SessionNode = {
|
|
const node: SessionNode = {
|
|
|
id: sid('s1'), title: 'One', children: [], hasChildren: false,
|
|
id: sid('s1'), title: 'One', children: [], hasChildren: false,
|
|
|
expanded: false, running: false, updatedAt: 0,
|
|
expanded: false, running: false, updatedAt: 0,
|
|
|
}
|
|
}
|
|
|
- render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={onOpen} onToggle={vi.fn()} />)
|
|
|
|
|
|
|
+ render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={onOpen}
|
|
|
|
|
+ onRename={onRename} onToggle={vi.fn()} />)
|
|
|
fireEvent.click(screen.getByRole('button', { name: 'Session actions for One' }))
|
|
fireEvent.click(screen.getByRole('button', { name: 'Session actions for One' }))
|
|
|
expect(onOpen).not.toHaveBeenCalled()
|
|
expect(onOpen).not.toHaveBeenCalled()
|
|
|
expect(screen.getByRole('menuitem', { name: 'Delete session' }).className).toMatch(/danger/)
|
|
expect(screen.getByRole('menuitem', { name: 'Delete session' }).className).toMatch(/danger/)
|
|
|
- fireEvent.click(screen.getByRole('menuitem', { name: 'Fork session' }))
|
|
|
|
|
|
|
+ // Rename dispatches with the current display title (dialog prefill).
|
|
|
|
|
+ fireEvent.click(screen.getByRole('menuitem', { name: 'Rename' }))
|
|
|
expect(screen.queryByRole('menu')).toBeNull()
|
|
expect(screen.queryByRole('menu')).toBeNull()
|
|
|
|
|
+ expect(onRename).toHaveBeenCalledWith(node.id, 'One')
|
|
|
expect(onOpen).not.toHaveBeenCalled()
|
|
expect(onOpen).not.toHaveBeenCalled()
|
|
|
|
|
+ // Fork and Delete stay visual-only.
|
|
|
|
|
+ fireEvent.click(screen.getByRole('button', { name: 'Session actions for One' }))
|
|
|
|
|
+ fireEvent.click(screen.getByRole('menuitem', { name: 'Fork session' }))
|
|
|
|
|
+ fireEvent.click(screen.getByRole('button', { name: 'Session actions for One' }))
|
|
|
|
|
+ fireEvent.click(screen.getByRole('menuitem', { name: 'Delete session' }))
|
|
|
|
|
+ expect(onRename).toHaveBeenCalledOnce()
|
|
|
// Escape closes without selecting (Menu onClose path).
|
|
// Escape closes without selecting (Menu onClose path).
|
|
|
fireEvent.click(screen.getByRole('button', { name: 'Session actions for One' }))
|
|
fireEvent.click(screen.getByRole('button', { name: 'Session actions for One' }))
|
|
|
fireEvent.keyDown(document, { key: 'Escape' })
|
|
fireEvent.keyDown(document, { key: 'Escape' })
|
|
@@ -159,7 +171,8 @@ describe('workspace browser rows', () => {
|
|
|
id: sid('p'), title: 'Parent', children: [], hasChildren: true,
|
|
id: sid('p'), title: 'Parent', children: [], hasChildren: true,
|
|
|
expanded: false, running: false, updatedAt: 0,
|
|
expanded: false, running: false, updatedAt: 0,
|
|
|
}
|
|
}
|
|
|
- render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()} onToggle={vi.fn()} flat />)
|
|
|
|
|
|
|
+ render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={vi.fn()} flat />)
|
|
|
expect(screen.queryByRole('button', { name: 'Expand' })).toBeNull()
|
|
expect(screen.queryByRole('button', { name: 'Expand' })).toBeNull()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -170,7 +183,8 @@ describe('workspace browser rows', () => {
|
|
|
id: sid('s1'), title: 'Hovered', children: [], hasChildren: false,
|
|
id: sid('s1'), title: 'Hovered', children: [], hasChildren: false,
|
|
|
expanded: false, running: true, updatedAt: 0,
|
|
expanded: false, running: true, updatedAt: 0,
|
|
|
}
|
|
}
|
|
|
- render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={60_000} onOpen={vi.fn()} onToggle={vi.fn()} />)
|
|
|
|
|
|
|
+ render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={60_000} onOpen={vi.fn()}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={vi.fn()} />)
|
|
|
const wrapper = screen.getByRole('treeitem').parentElement as HTMLElement
|
|
const wrapper = screen.getByRole('treeitem').parentElement as HTMLElement
|
|
|
fireEvent.pointerEnter(wrapper)
|
|
fireEvent.pointerEnter(wrapper)
|
|
|
act(() => { vi.advanceTimersByTime(500) })
|
|
act(() => { vi.advanceTimersByTime(500) })
|
|
@@ -196,7 +210,8 @@ describe('workspace browser rows', () => {
|
|
|
id: sid('s1'), title: 'Quiet', children: [], hasChildren: false,
|
|
id: sid('s1'), title: 'Quiet', children: [], hasChildren: false,
|
|
|
expanded: false, running: false, updatedAt: 0,
|
|
expanded: false, running: false, updatedAt: 0,
|
|
|
}
|
|
}
|
|
|
- render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()} onToggle={vi.fn()} />)
|
|
|
|
|
|
|
+ render(<SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={vi.fn()} />)
|
|
|
fireEvent.pointerEnter(screen.getByRole('treeitem').parentElement as HTMLElement)
|
|
fireEvent.pointerEnter(screen.getByRole('treeitem').parentElement as HTMLElement)
|
|
|
act(() => { vi.advanceTimersByTime(500) })
|
|
act(() => { vi.advanceTimersByTime(500) })
|
|
|
expect(screen.getByText('Idle')).toBeTruthy()
|
|
expect(screen.getByText('Idle')).toBeTruthy()
|
|
@@ -213,7 +228,8 @@ describe('workspace browser rows', () => {
|
|
|
}
|
|
}
|
|
|
const inactive = dragProps()
|
|
const inactive = dragProps()
|
|
|
const { rerender } = render(
|
|
const { rerender } = render(
|
|
|
- <SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()} onToggle={vi.fn()} drag={inactive} />,
|
|
|
|
|
|
|
+ <SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={vi.fn()} drag={inactive} />,
|
|
|
)
|
|
)
|
|
|
const row = screen.getByRole('treeitem')
|
|
const row = screen.getByRole('treeitem')
|
|
|
stubRect(row)
|
|
stubRect(row)
|
|
@@ -230,7 +246,8 @@ describe('workspace browser rows', () => {
|
|
|
|
|
|
|
|
const active = dragProps({ active: true, marker: 'before' })
|
|
const active = dragProps({ active: true, marker: 'before' })
|
|
|
rerender(
|
|
rerender(
|
|
|
- <SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()} onToggle={vi.fn()} drag={active} />,
|
|
|
|
|
|
|
+ <SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={vi.fn()} drag={active} />,
|
|
|
)
|
|
)
|
|
|
stubRect(screen.getByRole('treeitem'))
|
|
stubRect(screen.getByRole('treeitem'))
|
|
|
// Top half hovers/drops 'before'; bottom half 'after' (row mid = 117).
|
|
// Top half hovers/drops 'before'; bottom half 'after' (row mid = 117).
|
|
@@ -243,7 +260,8 @@ describe('workspace browser rows', () => {
|
|
|
|
|
|
|
|
const after = dragProps({ active: true, marker: 'after' })
|
|
const after = dragProps({ active: true, marker: 'after' })
|
|
|
rerender(
|
|
rerender(
|
|
|
- <SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()} onToggle={vi.fn()} drag={after} />,
|
|
|
|
|
|
|
+ <SessionNodeItem node={node} depth={0} currentId={undefined} now={0} onOpen={vi.fn()}
|
|
|
|
|
+ onRename={vi.fn()} onToggle={vi.fn()} drag={after} />,
|
|
|
)
|
|
)
|
|
|
expect(screen.getByRole('treeitem').className).toMatch(/dropAfter/)
|
|
expect(screen.getByRole('treeitem').className).toMatch(/dropAfter/)
|
|
|
})
|
|
})
|