mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	
		
			
	
	
		
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | // @ts-check
 | ||
|  | const { test, expect } = require('@playwright/test'); | ||
|  | 
 | ||
|  | let log = []; | ||
|  | 
 | ||
|  | test.beforeEach(async ({page}) => { | ||
|  |   log = []; | ||
|  |   // Expose function for pushing messages to the Node.js script.
 | ||
|  |   await page.exposeFunction('logCall', msg => log.push(msg)); | ||
|  | 
 | ||
|  |   await page.addInitScript(() => { | ||
|  |     // for these tests, return the same mock battery status
 | ||
|  |     class BatteryMock { | ||
|  |       level = 0.10; | ||
|  |       charging = false; | ||
|  |       chargingTime = 1800; | ||
|  |       dischargingTime = Infinity; | ||
|  |       _chargingListeners = []; | ||
|  |       _levelListeners = []; | ||
|  |       addEventListener(eventName, listener) { | ||
|  |         logCall(`addEventListener:${eventName}`); | ||
|  |         if (eventName === 'chargingchange') | ||
|  |           this._chargingListeners.push(listener); | ||
|  |         if (eventName === 'levelchange') | ||
|  |           this._levelListeners.push(listener); | ||
|  |       } | ||
|  |       _setLevel(value) { | ||
|  |         this.level = value; | ||
|  |         this._levelListeners.forEach(cb => cb()); | ||
|  |       } | ||
|  |       _setCharging(value) { | ||
|  |         this.charging = value; | ||
|  |         this._chargingListeners.forEach(cb => cb()); | ||
|  |       } | ||
|  |     }; | ||
|  |     const mockBattery = new BatteryMock(); | ||
|  |     // Override the method to always return mock battery info.
 | ||
|  |     window.navigator.getBattery = async () => { | ||
|  |       logCall('getBattery'); | ||
|  |       return mockBattery; | ||
|  |     }; | ||
|  |     // Save the mock object on window for easier access.
 | ||
|  |     window.mockBattery = mockBattery; | ||
|  | 
 | ||
|  |     // application tries navigator.battery first
 | ||
|  |     // so we delete this method
 | ||
|  |     delete window.navigator.battery; | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | test('should update UI when battery status changes', async ({ page }) => { | ||
|  |   await page.goto('/'); | ||
|  |   await expect(page.locator('.battery-percentage')).toHaveText('10%'); | ||
|  | 
 | ||
|  |   // Update level to 27.5%
 | ||
|  |   await page.evaluate(() => window.mockBattery._setLevel(0.275)); | ||
|  |   await expect(page.locator('.battery-percentage')).toHaveText('27.5%'); | ||
|  |   await expect(page.locator('.battery-status')).toHaveText('Battery'); | ||
|  | 
 | ||
|  |   // Emulate connected adapter
 | ||
|  |   await page.evaluate(() => window.mockBattery._setCharging(true)); | ||
|  |   await expect(page.locator('.battery-status')).toHaveText('Adapter'); | ||
|  |   await expect(page.locator('.battery-fully')).toHaveText('00:30'); | ||
|  | }); | ||
|  | 
 | ||
|  | 
 | ||
|  | test('verify API calls', async ({ page }) => { | ||
|  |   await page.goto('/'); | ||
|  |   await expect(page.locator('.battery-percentage')).toHaveText('10%'); | ||
|  | 
 | ||
|  |   // Ensure expected method calls were made.
 | ||
|  |   expect(log).toEqual([ | ||
|  |     'getBattery', | ||
|  |     'addEventListener:chargingchange', | ||
|  |     'addEventListener:levelchange' | ||
|  |   ]); | ||
|  |   log = []; // reset the log
 | ||
|  | 
 | ||
|  |   await page.evaluate(() => window.mockBattery._setLevel(0.275)); | ||
|  |   expect(log).toEqual([]); // getBattery is not called, cached version is used.
 | ||
|  | }); |