test(pwa): add comprehensive PWA and Vitest test suite

- Install Vitest and React Testing Library for frontend tests
- Configure Vitest with jsdom environment and coverage
- Add test setup file with global mocks (matchMedia, IntersectionObserver)
- Write InstallPWA component tests (14 tests):
  - iOS detection and manual installation instructions
  - Android/Chrome beforeinstallprompt event handling
  - Install and dismiss functionality
  - 7-day dismissal persistence (localStorage)
  - Installed state detection (standalone mode)
- Write PWA configuration tests (28 tests):
  - App icons existence (PNG and SVG)
  - iOS splash screens for multiple devices
  - Vite PWA plugin configuration
  - index.html meta tags (iOS PWA support)
  - Manifest schema validation
  - Service worker configuration (Workbox)
- Write service worker tests (24 tests):
  - Service worker registration and lifecycle
  - Workbox integration
  - Cache Storage API operations
- Migrate existing WebRTC tests from Jest to Vitest (25 tests):
  - Update imports to use Vitest (vi.fn, describe, it, expect)
  - Fix WebRTCWarning and webrtcDetection test expectations
- Add test scripts to package.json (test, test:watch, test:ui, test:coverage)

All 91 tests passing (InstallPWA: 14, PWA config: 28, Service Worker: 24,
WebRTC: 25 total across 2 files)
This commit is contained in:
Radosław Gierwiało
2025-11-19 21:24:34 +01:00
parent f0a1bfb31a
commit 9d1af60f30
9 changed files with 2332 additions and 11 deletions

View File

@@ -1,3 +1,4 @@
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import { detectWebRTCSupport, getWebRTCErrorMessage, getWebRTCFixSuggestions } from '../webrtcDetection';
describe('WebRTC Detection', () => {
@@ -10,12 +11,12 @@ describe('WebRTC Detection', () => {
beforeEach(() => {
// Mock RTCPeerConnection
mockCreateDataChannel = jest.fn();
mockCreateOffer = jest.fn();
mockSetLocalDescription = jest.fn();
mockClose = jest.fn();
mockCreateDataChannel = vi.fn();
mockCreateOffer = vi.fn();
mockSetLocalDescription = vi.fn();
mockClose = vi.fn();
mockRTCPeerConnection = jest.fn(function() {
mockRTCPeerConnection = vi.fn(function() {
this.createDataChannel = mockCreateDataChannel;
this.createOffer = mockCreateOffer;
this.setLocalDescription = mockSetLocalDescription;
@@ -27,7 +28,7 @@ describe('WebRTC Detection', () => {
});
afterEach(() => {
jest.clearAllMocks();
vi.clearAllMocks();
delete global.RTCPeerConnection;
});
@@ -163,7 +164,8 @@ describe('WebRTC Detection', () => {
const message = getWebRTCErrorMessage(detection);
expect(message).toContain('Unknown error occurred');
// When hasIceCandidates is false, it shows "blocked" message regardless of error
expect(message).toContain('WebRTC is blocked');
});
});