1
import { act, renderHook } from '@testing-library/react';
2
import { pwaInstallHandler } from 'pwa-install-handler';
3
import { afterEach, describe, expect, it, vi } from 'vitest';
5
import { PWA_INSTALL_ID } from '@/const/layoutTokens';
7
import { usePWAInstall } from './usePWAInstall';
8
import { usePlatform } from './usePlatform';
11
vi.mock('./usePlatform', () => ({
15
vi.mock('@/utils/env', () => ({
16
isOnServerSide: false,
19
vi.mock('pwa-install-handler', () => ({
22
removeListener: vi.fn(),
27
describe('usePWAInstall', () => {
32
it('should return canInstall as false when in PWA', () => {
33
vi.mocked(usePlatform).mockReturnValue({ isSupportInstallPWA: true, isPWA: true } as any);
35
const { result } = renderHook(() => usePWAInstall());
37
expect(result.current.canInstall).toBe(false);
40
it('should return canInstall based on canInstall state when support PWA', () => {
41
vi.mocked(usePlatform).mockReturnValue({ isSupportInstallPWA: true, isPWA: false } as any);
43
const { result, rerender } = renderHook(() => usePWAInstall());
45
expect(result.current.canInstall).toBe(false);
48
vi.mocked(pwaInstallHandler.addListener).mock.calls[0][0](true);
53
expect(result.current.canInstall).toBe(true);
56
it('should return canInstall as true when not support PWA', () => {
57
vi.mocked(usePlatform).mockReturnValue({ isSupportInstallPWA: false, isPWA: false } as any);
59
const { result } = renderHook(() => usePWAInstall());
61
expect(result.current.canInstall).toBe(true);
64
it('should call pwa.showDialog when install is called', () => {
65
const mockShowDialog = vi.fn();
66
document.body.innerHTML = `<div id="${PWA_INSTALL_ID}"></div>`;
67
const pwaElement: any = document.querySelector(`#${PWA_INSTALL_ID}`);
68
pwaElement.showDialog = mockShowDialog;
70
const { result } = renderHook(() => usePWAInstall());
73
result.current.install();
76
expect(mockShowDialog).toHaveBeenCalledWith(true);