useDataSaver.spec.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import React, { useEffect } from 'react';
  2. import useDataSaver from 'lib/hooks/useDataSaver';
  3. import { render } from '@testing-library/react';
  4. describe('useDataSaver hook', () => {
  5. const content = {
  6. title: 'title',
  7. };
  8. describe('Save as file', () => {
  9. beforeAll(() => {
  10. jest.useFakeTimers();
  11. jest.setSystemTime(new Date('Wed Mar 24 2021 03:19:56 GMT-0700'));
  12. });
  13. afterAll(() => jest.useRealTimers());
  14. it('downloads json file', () => {
  15. const link: HTMLAnchorElement = document.createElement('a');
  16. link.click = jest.fn();
  17. const mockCreate = jest
  18. .spyOn(document, 'createElement')
  19. .mockImplementation(() => link);
  20. const HookWrapper: React.FC = () => {
  21. const { saveFile } = useDataSaver('message', content);
  22. useEffect(() => saveFile(), [saveFile]);
  23. return null;
  24. };
  25. render(<HookWrapper />);
  26. expect(mockCreate).toHaveBeenCalledTimes(2);
  27. expect(link.download).toEqual('message_1616581196000.json');
  28. expect(link.href).toEqual(`data:text/json;charset=utf-8,${content}`);
  29. expect(link.click).toHaveBeenCalledTimes(1);
  30. mockCreate.mockRestore();
  31. });
  32. it('downloads txt file', () => {
  33. const link: HTMLAnchorElement = document.createElement('a');
  34. link.click = jest.fn();
  35. const mockCreate = jest
  36. .spyOn(document, 'createElement')
  37. .mockImplementation(() => link);
  38. const HookWrapper: React.FC = () => {
  39. const { saveFile } = useDataSaver('message', 'content');
  40. useEffect(() => saveFile(), [saveFile]);
  41. return null;
  42. };
  43. render(<HookWrapper />);
  44. expect(mockCreate).toHaveBeenCalledTimes(2);
  45. expect(link.download).toEqual('message_1616581196000.txt');
  46. expect(link.href).toEqual(`data:text/json;charset=utf-8,content`);
  47. expect(link.click).toHaveBeenCalledTimes(1);
  48. mockCreate.mockRestore();
  49. });
  50. });
  51. describe('copies the data to the clipboard', () => {
  52. Object.assign(navigator, {
  53. clipboard: {
  54. writeText: jest.fn(),
  55. },
  56. });
  57. jest.spyOn(navigator.clipboard, 'writeText');
  58. it('data with type Object', () => {
  59. const HookWrapper: React.FC = () => {
  60. const { copyToClipboard } = useDataSaver('topic', content);
  61. useEffect(() => copyToClipboard(), [copyToClipboard]);
  62. return null;
  63. };
  64. render(<HookWrapper />);
  65. expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
  66. JSON.stringify(content)
  67. );
  68. });
  69. it('data with type String', () => {
  70. const HookWrapper: React.FC = () => {
  71. const { copyToClipboard } = useDataSaver(
  72. 'topic',
  73. '{ title: "title", }'
  74. );
  75. useEffect(() => copyToClipboard(), [copyToClipboard]);
  76. return null;
  77. };
  78. render(<HookWrapper />);
  79. expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
  80. String('{ title: "title", }')
  81. );
  82. });
  83. });
  84. });