diff --git a/src/mixins/AttachmentMixin.js b/src/mixins/AttachmentMixin.js index c36aea9ac7..f214b4ef4b 100644 --- a/src/mixins/AttachmentMixin.js +++ b/src/mixins/AttachmentMixin.js @@ -17,6 +17,10 @@ export default { }, previewableFileInfos() { + if (!OCA?.Viewer) { + return [] + } + return this.fileInfos.filter((fileInfo) => (fileInfo.mime.startsWith('image/') || fileInfo.mime.startsWith('video/') || fileInfo.mime.startsWith('audio/') diff --git a/src/tests/unit/mixins/AttachmentMixin.spec.js b/src/tests/unit/mixins/AttachmentMixin.spec.js new file mode 100644 index 0000000000..45a71607e4 --- /dev/null +++ b/src/tests/unit/mixins/AttachmentMixin.spec.js @@ -0,0 +1,45 @@ +/** + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { shallowMount } from '@vue/test-utils' +import AttachmentMixin from '../../../mixins/AttachmentMixin.js' + +const attachments = [ + { downloadUrl: '/cat.png', fileName: 'cat.png', mime: 'image/png' }, + { downloadUrl: '/notes.txt', fileName: 'notes.txt', mime: 'text/plain' }, +] + +function mountMixin() { + return shallowMount({ + mixins: [AttachmentMixin], + data: () => ({ attachments }), + render: (h) => h('div'), + }) +} + +describe('AttachmentMixin', () => { + afterEach(() => { + delete global.OCA + }) + + it('previews attachments supported by the viewer', () => { + global.OCA = { Viewer: { mimetypes: ['image/png'] } } + + const view = mountMixin() + + expect(view.vm.previewableFileInfos).toHaveLength(1) + expect(view.vm.canPreview(view.vm.fileInfos[0])).toBe(true) + expect(view.vm.canPreview(view.vm.fileInfos[1])).toBe(false) + }) + + it('previews nothing when the viewer app is disabled', () => { + global.OCA = {} + + const view = mountMixin() + + expect(view.vm.previewableFileInfos).toEqual([]) + expect(view.vm.canPreview(view.vm.fileInfos[0])).toBe(false) + }) +})