diff --git a/e2e/src/tests/utils/network-simulator.spec.ts b/e2e/src/tests/utils/network-simulator.spec.ts new file mode 100644 index 0000000..ba69e27 --- /dev/null +++ b/e2e/src/tests/utils/network-simulator.spec.ts @@ -0,0 +1,53 @@ +import { test, expect } from '@playwright/test'; +import { NetworkSimulator } from '../../utils/NetworkSimulator'; +import { networkConfigs } from '../../config/network-configs'; + +test.describe('NetworkSimulator', () => { + test('should set 3G network condition', async ({ page, context }) => { + const simulator = new NetworkSimulator(context); + await simulator.setNetworkCondition(networkConfigs['3g-fast']); + + await page.goto('/'); + await expect(page.locator('header')).toBeVisible(); + }); + + test('should switch to offline mode', async ({ page, context }) => { + const simulator = new NetworkSimulator(context); + await page.goto('/'); + + await simulator.goOffline(); + await page.reload(); + + await expect(page.locator('header')).toBeVisible(); + }); + + test('should switch back to online mode', async ({ page, context }) => { + const simulator = new NetworkSimulator(context); + await simulator.goOffline(); + await page.goto('/'); + + await simulator.goOnline(); + await page.reload(); + + await expect(page.locator('header')).toBeVisible(); + }); + + test('should simulate network switch', async ({ page, context }) => { + const simulator = new NetworkSimulator(context); + + await simulator.simulateNetworkSwitch(networkConfigs['4g'], networkConfigs['3g-slow']); + + await page.goto('/'); + await expect(page.locator('header')).toBeVisible(); + }); + + test('should reset network condition', async ({ page, context }) => { + const simulator = new NetworkSimulator(context); + await simulator.setNetworkCondition(networkConfigs['3g-slow']); + + await simulator.resetNetworkCondition(); + + await page.goto('/'); + await expect(page.locator('header')).toBeVisible(); + }); +}); \ No newline at end of file diff --git a/e2e/src/utils/NetworkSimulator.ts b/e2e/src/utils/NetworkSimulator.ts index ebc35bb..5251033 100644 --- a/e2e/src/utils/NetworkSimulator.ts +++ b/e2e/src/utils/NetworkSimulator.ts @@ -35,25 +35,74 @@ export class NetworkSimulator { } async setNetworkCondition(config: NetworkConfig): Promise { + const page = this.context.pages()[0]; + if (!page) throw new Error('No page available'); + + const cdpSession = await this.context.newCDPSession(page); + if (config.offline) { - await this.context.setOffline(true); + await cdpSession.send('Network.emulateNetworkConditions', { + offline: true, + downloadThroughput: 0, + uploadThroughput: 0, + latency: 0, + }); } else { - await this.context.setOffline(false); - if (config.downloadThroughput && config.uploadThroughput && config.latency) { - await this.context.route('**', (route) => { - route.continue({ - headers: { - ...route.request().headers(), - }, - }); - }); - } + await cdpSession.send('Network.emulateNetworkConditions', { + offline: false, + downloadThroughput: config.downloadThroughput, + uploadThroughput: config.uploadThroughput, + latency: config.latency, + }); } } + async goOffline(): Promise { + const page = this.context.pages()[0]; + if (!page) throw new Error('No page available'); + + const cdpSession = await this.context.newCDPSession(page); + await cdpSession.send('Network.emulateNetworkConditions', { + offline: true, + downloadThroughput: 0, + uploadThroughput: 0, + latency: 0, + }); + } + + async goOnline(): Promise { + const page = this.context.pages()[0]; + if (!page) throw new Error('No page available'); + + const cdpSession = await this.context.newCDPSession(page); + await cdpSession.send('Network.emulateNetworkConditions', { + offline: false, + downloadThroughput: -1, + uploadThroughput: -1, + latency: 0, + }); + } + + async simulateNetworkSwitch(fromConfig: NetworkConfig, toConfig: NetworkConfig): Promise { + await this.setNetworkCondition(fromConfig); + const page = this.context.pages()[0]; + if (page) { + await page.waitForTimeout(1000); + } + await this.setNetworkCondition(toConfig); + } + async resetNetworkCondition(): Promise { - await this.context.setOffline(false); - await this.context.unrouteAll(); + const page = this.context.pages()[0]; + if (!page) throw new Error('No page available'); + + const cdpSession = await this.context.newCDPSession(page); + await cdpSession.send('Network.emulateNetworkConditions', { + offline: false, + downloadThroughput: -1, + uploadThroughput: -1, + latency: 0, + }); } getRequests(): NetworkRequest[] {