aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJohn Molakvoæ <skjnldsv@protonmail.com>2023-06-14 10:51:17 +0200
committerJohn Molakvoæ <skjnldsv@protonmail.com>2023-06-21 09:20:50 +0200
commit809631539ee4df15e893abfdb77e62690b69eac7 (patch)
tree97014036b43cf6e36451bef1999e51013dc83381 /apps
parent1b0848a7dd0de4f96f58f176a37b66bed4783439 (diff)
downloadnextcloud-server-809631539ee4df15e893abfdb77e62690b69eac7.tar.gz
nextcloud-server-809631539ee4df15e893abfdb77e62690b69eac7.zip
feat: add open folder action testing
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
Diffstat (limited to 'apps')
-rw-r--r--apps/files/src/actions/openFolderAction.spec.ts163
-rw-r--r--apps/files/src/actions/openFolderAction.ts16
2 files changed, 173 insertions, 6 deletions
diff --git a/apps/files/src/actions/openFolderAction.spec.ts b/apps/files/src/actions/openFolderAction.spec.ts
new file mode 100644
index 00000000000..07502be2eed
--- /dev/null
+++ b/apps/files/src/actions/openFolderAction.spec.ts
@@ -0,0 +1,163 @@
+/**
+ * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
+ *
+ * @author John Molakvoæ <skjnldsv@protonmail.com>
+ *
+ * @license AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+import { action } from './openFolderAction'
+import { expect } from '@jest/globals'
+import { File, Folder, Permission } from '@nextcloud/files'
+import { FileAction } from '../services/FileAction'
+import type { Navigation } from '../services/Navigation'
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as Navigation
+
+describe('Open folder action conditions tests', () => {
+ test('Default values', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('open-folder')
+ expect(action.displayName([folder], view)).toBe('Open folder FooBar')
+ expect(action.iconSvgInline([], view)).toBe('SvgMock')
+ expect(action.default).toBe(true)
+ expect(action.order).toBe(-100)
+ })
+})
+
+describe('Open folder action enabled tests', () => {
+ test('Enabled for folders', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(true)
+ })
+
+ test('Disabled for non-dav ressources', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://domain.com/data/FooBar/',
+ owner: 'admin',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(false)
+ })
+
+ test('Disabled if more than one node', () => {
+ const folder1 = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+ const folder2 = new Folder({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Bar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder1, folder2], view)).toBe(false)
+ })
+
+ test('Disabled for files', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled without READ permissions', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(false)
+ })
+})
+
+describe('Open folder action execute tests', () => {
+ test('Open folder', async () => {
+ const goToRouteMock = jest.fn()
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.exec(folder, view, '/')
+ // Silent action
+ expect(exec).toBe(null)
+ expect(goToRouteMock).toBeCalledTimes(1)
+ expect(goToRouteMock).toBeCalledWith(null, null, { dir: '/FooBar' })
+ })
+
+ test('Open folder fails without node', async () => {
+ const goToRouteMock = jest.fn()
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ // @ts-ignore null as Node
+ const exec = await action.exec(null, view, '/')
+ expect(exec).toBe(false)
+ expect(goToRouteMock).toBeCalledTimes(0)
+ })
+
+ test('Open folder fails without Folder', async () => {
+ const goToRouteMock = jest.fn()
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ const exec = await action.exec(file, view, '/')
+ expect(exec).toBe(false)
+ expect(goToRouteMock).toBeCalledTimes(0)
+ })
+})
diff --git a/apps/files/src/actions/openFolderAction.ts b/apps/files/src/actions/openFolderAction.ts
index cc2c0825bd4..76467796a2b 100644
--- a/apps/files/src/actions/openFolderAction.ts
+++ b/apps/files/src/actions/openFolderAction.ts
@@ -27,7 +27,7 @@ import type { Navigation } from '../services/Navigation'
import { join } from 'path'
import { registerFileAction, FileAction } from '../services/FileAction'
-registerFileAction(new FileAction({
+export const action = new FileAction({
id: 'open-folder',
displayName(files: Node[]) {
// Only works on single node
@@ -43,6 +43,11 @@ registerFileAction(new FileAction({
}
const node = nodes[0]
+
+ if (!node.isDavRessource) {
+ return false
+ }
+
return node.type === FileType.Folder
&& (node.permissions & Permission.READ) !== 0
},
@@ -59,11 +64,10 @@ registerFileAction(new FileAction({
)
return null
},
- async execBatch(nodes: Node[], view: Navigation, dir: string) {
- return Promise.all(nodes.map(node => this.exec(node, view, dir)))
- },
// Main action if enabled, meaning folders only
- order: -100,
default: true,
-}))
+ order: -100,
+})
+
+registerFileAction(action)