[verified] add Nextcloud file comment shortcut
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
|
||||
const mocks = vi.hoisted(() => ({
|
||||
getSidebar: vi.fn(),
|
||||
registerFileAction: vi.fn(),
|
||||
loadState: vi.fn(),
|
||||
open: vi.fn(),
|
||||
setActiveTab: vi.fn(),
|
||||
getTabs: vi.fn(),
|
||||
}))
|
||||
|
||||
vi.mock('@nextcloud/files', () => ({
|
||||
getSidebar: mocks.getSidebar,
|
||||
registerFileAction: mocks.registerFileAction,
|
||||
Permission: { NONE: 0 },
|
||||
}))
|
||||
|
||||
vi.mock('@nextcloud/initial-state', () => ({
|
||||
loadState: mocks.loadState,
|
||||
}))
|
||||
|
||||
import { action } from '../src/main'
|
||||
|
||||
const node = {
|
||||
root: '/files/alice',
|
||||
permissions: 1,
|
||||
source: 'https://cloud.example/remote.php/dav/files/alice/report.pdf',
|
||||
}
|
||||
const context = {
|
||||
nodes: [node],
|
||||
folder: {},
|
||||
view: {},
|
||||
contents: [node],
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
mocks.open.mockReset()
|
||||
mocks.setActiveTab.mockReset()
|
||||
mocks.getTabs.mockReset()
|
||||
mocks.loadState.mockReset()
|
||||
mocks.loadState.mockReturnValue(true)
|
||||
mocks.getTabs.mockReturnValue([{ id: 'activity' }])
|
||||
mocks.getSidebar.mockReturnValue({
|
||||
available: true,
|
||||
isOpen: false,
|
||||
node: undefined,
|
||||
open: mocks.open,
|
||||
setActiveTab: mocks.setActiveTab,
|
||||
getTabs: mocks.getTabs,
|
||||
})
|
||||
})
|
||||
|
||||
describe('Korean comments file action', () => {
|
||||
it('registers a non-inline 댓글 action', () => {
|
||||
expect(mocks.registerFileAction).toHaveBeenCalledWith(action)
|
||||
expect(action.displayName(context as never)).toBe('댓글')
|
||||
expect(action.inline?.(context as never)).toBe(false)
|
||||
})
|
||||
|
||||
it('opens the integrated Activity tab', async () => {
|
||||
expect(action.enabled?.(context as never)).toBe(true)
|
||||
expect(await action.exec(context as never)).toBeNull()
|
||||
expect(mocks.open).toHaveBeenCalledWith(node, 'activity')
|
||||
})
|
||||
|
||||
it('switches an already-open sidebar to Activity', async () => {
|
||||
mocks.getSidebar.mockReturnValue({
|
||||
available: true,
|
||||
isOpen: true,
|
||||
node,
|
||||
open: mocks.open,
|
||||
setActiveTab: mocks.setActiveTab,
|
||||
getTabs: mocks.getTabs,
|
||||
})
|
||||
|
||||
expect(await action.exec(context as never)).toBeNull()
|
||||
expect(mocks.setActiveTab).toHaveBeenCalledWith('activity')
|
||||
expect(mocks.open).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('falls back to the standalone Comments tab', async () => {
|
||||
mocks.getTabs.mockReturnValue([{ id: 'comments' }])
|
||||
|
||||
expect(await action.exec(context as never)).toBeNull()
|
||||
expect(mocks.open).toHaveBeenCalledWith(node, 'comments')
|
||||
})
|
||||
|
||||
it('hides when Activity exists without Comments integration', () => {
|
||||
mocks.loadState.mockReturnValue(false)
|
||||
mocks.getTabs.mockReturnValue([{ id: 'activity' }])
|
||||
|
||||
expect(action.enabled?.(context as never)).toBe(false)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user