Files
Oxicloud/frontend/src/lib/components/ShareDialog.test.ts
T
Edouard Vanbelle d9987782c4 feat(fileDto, folderDto): add is_favorite + is_shared
- provide is_shared and is_favorite information in DTO, information propagated as badge/buttons per items
      regarding performances I try to be minimalis on SQL to prevent any perf regression

    - remove old set of sharedids and favoriteids (was not functionnal anymore)
    - fix date picker (no past selection) in grant
    - fix contextmenu close on /files section
2026-07-22 01:55:10 +02:00

70 lines
2.5 KiB
TypeScript

import { it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent, waitFor } from '@testing-library/svelte';
const { ui } = vi.hoisted(() => ({ ui: { notify: vi.fn() } }));
vi.mock('$lib/stores/ui.svelte', () => ({ ui }));
vi.mock('$lib/utils/errors', () => ({ errorToast: vi.fn() }));
vi.mock('$lib/api/endpoints/shares', () => ({
copyShareLink: vi.fn(),
createShare: vi.fn(),
deleteShare: vi.fn(),
listSharesForItem: vi.fn(),
updateShare: vi.fn()
}));
vi.mock('$lib/api/endpoints/grants', () => ({
createGrant: vi.fn(),
expiryToIso: (v: string | null) => v,
displayRole: (r: string) => r,
fetchGrantsForResource: vi.fn(),
notifyGrantRecipient: vi.fn(),
revokeGrant: vi.fn(),
todayIso: () => '2026-07-22',
updateGrantRole: vi.fn()
}));
vi.mock('$lib/api/endpoints/recipients', () => ({
ensureResolvers: vi.fn(),
isDirectoryAvailable: () => true,
resolveRecipient: (_t: string, id: string) => ({ id, label: id }),
searchRecipients: vi.fn(async () => [])
}));
import { createShare, listSharesForItem } from '$lib/api/endpoints/shares';
import { fetchGrantsForResource } from '$lib/api/endpoints/grants';
import ShareDialog from './ShareDialog.svelte';
const m = (fn: unknown) => fn as ReturnType<typeof vi.fn>;
const item = { id: 'f1', name: 'doc.txt', kind: 'file' as const };
beforeEach(() => {
vi.clearAllMocks();
m(fetchGrantsForResource).mockResolvedValue([]);
m(listSharesForItem).mockResolvedValue([]);
});
it('loads grants and shares when opened', async () => {
render(ShareDialog, { props: { open: true, item } });
await screen.findByTestId('share-dialog');
await waitFor(() => expect(fetchGrantsForResource).toHaveBeenCalledWith('file', 'f1'));
await waitFor(() => expect(listSharesForItem).toHaveBeenCalledWith('f1', 'file'));
});
it('switches to the link tab and creates a public link', async () => {
m(createShare).mockResolvedValue({ id: 's1', token: 'abc', has_password: false });
render(ShareDialog, { props: { open: true, item } });
await fireEvent.click(await screen.findByTestId('share-dialog-link-tab'));
await fireEvent.input(screen.getByTestId('share-dialog-link-name-input'), {
target: { value: 'My link' }
});
await fireEvent.click(screen.getByTestId('share-dialog-create-btn'));
await waitFor(() =>
expect(createShare).toHaveBeenCalledWith(
expect.objectContaining({ itemId: 'f1', itemName: 'My link', itemType: 'file' })
)
);
});
it('does not load when closed', () => {
render(ShareDialog, { props: { open: false, item } });
expect(fetchGrantsForResource).not.toHaveBeenCalled();
});