clipboard.test.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * Tests for the clipboard / file-download helpers.
  3. */
  4. import { describe, it, expect, vi, afterEach } from 'vitest';
  5. import { copyTextToClipboard, downloadTextFile } from '../../utils/clipboard';
  6. describe('copyTextToClipboard', () => {
  7. afterEach(() => {
  8. vi.restoreAllMocks();
  9. });
  10. it('uses navigator.clipboard in a secure context', async () => {
  11. const writeText = vi.fn().mockResolvedValue(undefined);
  12. vi.stubGlobal('navigator', { clipboard: { writeText } });
  13. vi.stubGlobal('isSecureContext', true);
  14. const ok = await copyTextToClipboard('hello');
  15. expect(ok).toBe(true);
  16. expect(writeText).toHaveBeenCalledWith('hello');
  17. vi.unstubAllGlobals();
  18. });
  19. it('falls back to execCommand when clipboard write rejects', async () => {
  20. const writeText = vi.fn().mockRejectedValue(new Error('blocked'));
  21. vi.stubGlobal('navigator', { clipboard: { writeText } });
  22. vi.stubGlobal('isSecureContext', true);
  23. const execCommand = vi.fn().mockReturnValue(true);
  24. // jsdom does not implement execCommand — supply it for the fallback path.
  25. (document as unknown as { execCommand: unknown }).execCommand = execCommand;
  26. const ok = await copyTextToClipboard('lan-fallback');
  27. expect(ok).toBe(true);
  28. expect(execCommand).toHaveBeenCalledWith('copy');
  29. vi.unstubAllGlobals();
  30. });
  31. });
  32. describe('downloadTextFile', () => {
  33. it('triggers a download with the given filename', () => {
  34. const createObjectURL = vi.fn().mockReturnValue('blob:fake');
  35. const revokeObjectURL = vi.fn();
  36. (URL as unknown as { createObjectURL: unknown }).createObjectURL = createObjectURL;
  37. (URL as unknown as { revokeObjectURL: unknown }).revokeObjectURL = revokeObjectURL;
  38. let clickedHref = '';
  39. let clickedDownload = '';
  40. const clickSpy = vi
  41. .spyOn(HTMLAnchorElement.prototype, 'click')
  42. .mockImplementation(function (this: HTMLAnchorElement) {
  43. clickedHref = this.href;
  44. clickedDownload = this.download;
  45. });
  46. downloadTextFile('cert-body', 'bambuddy-virtual-printer-ca.crt', 'application/x-pem-file');
  47. expect(clickSpy).toHaveBeenCalled();
  48. expect(clickedHref).toContain('blob:fake');
  49. expect(clickedDownload).toBe('bambuddy-virtual-printer-ca.crt');
  50. expect(revokeObjectURL).toHaveBeenCalledWith('blob:fake');
  51. clickSpy.mockRestore();
  52. });
  53. });