95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
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)
|
|
})
|
|
})
|