diff --git a/apps/files/src/actions/editLocallyAction.spec.ts b/apps/files/src/actions/editLocallyAction.spec.ts index e7102b8defb42..3d32930c27306 100644 --- a/apps/files/src/actions/editLocallyAction.spec.ts +++ b/apps/files/src/actions/editLocallyAction.spec.ts @@ -22,14 +22,35 @@ import { action } from './editLocallyAction' import { expect } from '@jest/globals' import { File, Permission, View, FileAction } from '@nextcloud/files' -import * as ncDialogs from '@nextcloud/dialogs' +import { DialogBuilder, showError } from '@nextcloud/dialogs' import axios from '@nextcloud/axios' +const dialogBuilder = { + setName: jest.fn().mockReturnThis(), + setText: jest.fn().mockReturnThis(), + setButtons: jest.fn().mockReturnThis(), + build: jest.fn().mockReturnValue({ + show: jest.fn().mockResolvedValue(true), + }), +} as unknown as DialogBuilder + +jest.mock('@nextcloud/dialogs', () => ({ + DialogBuilder: jest.fn(() => dialogBuilder), + showError: jest.fn(), +})) + const view = { id: 'files', name: 'Files', } as View +// Mock webroot variable +beforeAll(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (window as any)._oc_webroot = ''; + (window as any).OCA = { Viewer: { open: jest.fn() } } +}) + describe('Edit locally action conditions tests', () => { test('Default values', () => { expect(action).toBeInstanceOf(FileAction) @@ -55,7 +76,7 @@ describe('Edit locally action enabled tests', () => { expect(action.enabled!([file], view)).toBe(true) }) - test('Disabled for non-dav ressources', () => { + test('Disabled for non-dav resources', () => { const file = new File({ id: 1, source: 'https://domain.com/data/foobar.txt', @@ -115,8 +136,11 @@ describe('Edit locally action enabled tests', () => { describe('Edit locally action execute tests', () => { test('Edit locally opens proper URL', async () => { - jest.spyOn(axios, 'post').mockImplementation(async () => ({ data: { ocs: { data: { token: 'foobar' } } } })) - jest.spyOn(ncDialogs, 'showError') + jest.spyOn(axios, 'post').mockImplementation(async () => ({ + data: { ocs: { data: { token: 'foobar' } } } + })) + const mockedShowError = jest.mocked(showError) + const spyDialogBuilder = jest.spyOn(dialogBuilder, 'build') const file = new File({ id: 1, @@ -128,17 +152,20 @@ describe('Edit locally action execute tests', () => { const exec = await action.exec(file, view, '/') + expect(spyDialogBuilder).toBeCalled() + // Silent action expect(exec).toBe(null) expect(axios.post).toBeCalledTimes(1) expect(axios.post).toBeCalledWith('http://localhost/ocs/v2.php/apps/files/api/v1/openlocaleditor?format=json', { path: '/foobar.txt' }) - expect(ncDialogs.showError).toBeCalledTimes(0) + expect(mockedShowError).toBeCalledTimes(0) expect(window.location.href).toBe('nc://open/test@localhost/foobar.txt?token=foobar') }) - test('Edit locally fails and show error', async () => { + test('Edit locally fails and shows error', async () => { jest.spyOn(axios, 'post').mockImplementation(async () => ({})) - jest.spyOn(ncDialogs, 'showError') + const mockedShowError = jest.mocked(showError) + const spyDialogBuilder = jest.spyOn(dialogBuilder, 'build') const file = new File({ id: 1, @@ -150,12 +177,14 @@ describe('Edit locally action execute tests', () => { const exec = await action.exec(file, view, '/') + expect(spyDialogBuilder).toBeCalled() + // Silent action expect(exec).toBe(null) expect(axios.post).toBeCalledTimes(1) expect(axios.post).toBeCalledWith('http://localhost/ocs/v2.php/apps/files/api/v1/openlocaleditor?format=json', { path: '/foobar.txt' }) - expect(ncDialogs.showError).toBeCalledTimes(1) - expect(ncDialogs.showError).toBeCalledWith('Failed to redirect to client') + expect(mockedShowError).toBeCalledTimes(1) + expect(mockedShowError).toBeCalledWith('Failed to redirect to client') expect(window.location.href).toBe('http://localhost/') }) }) diff --git a/apps/files/src/actions/editLocallyAction.ts b/apps/files/src/actions/editLocallyAction.ts index e6e847e2fece8..38393b919d57a 100644 --- a/apps/files/src/actions/editLocallyAction.ts +++ b/apps/files/src/actions/editLocallyAction.ts @@ -62,7 +62,7 @@ const confirmLocalEditDialog = ( .then(() => { // Ensure the callback is called even if the dialog is dismissed in other ways if (!callbackCalled) { - localEditCallback(true) + localEditCallback(false) } }) }