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.
 | |
| });
 | 
