| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /**
- * Tests for the clipboard / file-download helpers.
- */
- import { describe, it, expect, vi, afterEach } from 'vitest';
- import { copyTextToClipboard, downloadTextFile } from '../../utils/clipboard';
- describe('copyTextToClipboard', () => {
- afterEach(() => {
- vi.restoreAllMocks();
- });
- it('uses navigator.clipboard in a secure context', async () => {
- const writeText = vi.fn().mockResolvedValue(undefined);
- vi.stubGlobal('navigator', { clipboard: { writeText } });
- vi.stubGlobal('isSecureContext', true);
- const ok = await copyTextToClipboard('hello');
- expect(ok).toBe(true);
- expect(writeText).toHaveBeenCalledWith('hello');
- vi.unstubAllGlobals();
- });
- it('falls back to execCommand when clipboard write rejects', async () => {
- const writeText = vi.fn().mockRejectedValue(new Error('blocked'));
- vi.stubGlobal('navigator', { clipboard: { writeText } });
- vi.stubGlobal('isSecureContext', true);
- const execCommand = vi.fn().mockReturnValue(true);
- // jsdom does not implement execCommand — supply it for the fallback path.
- (document as unknown as { execCommand: unknown }).execCommand = execCommand;
- const ok = await copyTextToClipboard('lan-fallback');
- expect(ok).toBe(true);
- expect(execCommand).toHaveBeenCalledWith('copy');
- vi.unstubAllGlobals();
- });
- });
- describe('downloadTextFile', () => {
- it('triggers a download with the given filename', () => {
- const createObjectURL = vi.fn().mockReturnValue('blob:fake');
- const revokeObjectURL = vi.fn();
- (URL as unknown as { createObjectURL: unknown }).createObjectURL = createObjectURL;
- (URL as unknown as { revokeObjectURL: unknown }).revokeObjectURL = revokeObjectURL;
- let clickedHref = '';
- let clickedDownload = '';
- const clickSpy = vi
- .spyOn(HTMLAnchorElement.prototype, 'click')
- .mockImplementation(function (this: HTMLAnchorElement) {
- clickedHref = this.href;
- clickedDownload = this.download;
- });
- downloadTextFile('cert-body', 'bambuddy-virtual-printer-ca.crt', 'application/x-pem-file');
- expect(clickSpy).toHaveBeenCalled();
- expect(clickedHref).toContain('blob:fake');
- expect(clickedDownload).toBe('bambuddy-virtual-printer-ca.crt');
- expect(revokeObjectURL).toHaveBeenCalledWith('blob:fake');
- clickSpy.mockRestore();
- });
- });
|