aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/services/Search.spec.ts
blob: c2840521a1559763fb0d66de4da6733c2bb504af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*!
 * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

import { createPinia, setActivePinia } from 'pinia'
import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
import { getContents } from './Search.ts'
import { Folder, Permission } from '@nextcloud/files'

const searchNodes = vi.hoisted(() => vi.fn())
vi.mock('./WebDavSearch.ts', () => ({ searchNodes }))
vi.mock('@nextcloud/auth')

describe('Search service', () => {
	const fakeFolder = new Folder({ owner: 'owner', source: 'https://cloud.example.com/remote.php/dav/files/owner/folder', root: '/files/owner' })

	beforeAll(() => {
		window.OCP ??= {}
		window.OCP.Files ??= {}
		window.OCP.Files.Router ??= { params: {}, query: {} }
		vi.spyOn(window.OCP.Files.Router, 'params', 'get').mockReturnValue({ view: 'files' })
	})

	beforeEach(() => {
		vi.restoreAllMocks()
		setActivePinia(createPinia())
	})

	it('rejects on error', async () => {
		searchNodes.mockImplementationOnce(() => { throw new Error('expected error') })
		expect(getContents).rejects.toThrow('expected error')
	})

	it('returns the search results and a fake root', async () => {
		searchNodes.mockImplementationOnce(() => [fakeFolder])
		const { contents, folder } = await getContents()

		expect(searchNodes).toHaveBeenCalledOnce()
		expect(contents).toHaveLength(1)
		expect(contents).toEqual([fakeFolder])
		// read only root
		expect(folder.permissions).toBe(Permission.READ)
	})

	it('can be cancelled', async () => {
		const { promise, resolve } = Promise.withResolvers<Event>()
		searchNodes.mockImplementationOnce(async (_, { signal }: { signal: AbortSignal}) => {
			signal.addEventListener('abort', resolve)
			await promise
			return []
		})

		const content = getContents()
		content.cancel()

		// its cancelled thus the promise returns the event
		const event = await promise
		expect(event.type).toBe('abort')
	})
})