참고소스 수정본
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('@playwright/test');
|
||||
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.addInitScript(() => {
|
||||
const mockBattery = {
|
||||
level: 0.90,
|
||||
charging: true,
|
||||
chargingTime: 1800, // seconds
|
||||
dischargingTime: Infinity,
|
||||
addEventListener: () => { }
|
||||
};
|
||||
// application tries navigator.battery first
|
||||
// so we delete this method
|
||||
delete window.navigator.battery;
|
||||
// Override the method to always return mock battery info.
|
||||
window.navigator.getBattery = async () => mockBattery;
|
||||
});
|
||||
});
|
||||
|
||||
test('show battery status', async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await expect(page.locator('.battery-percentage')).toHaveText('90%');
|
||||
await expect(page.locator('.battery-status')).toHaveText('Adapter');
|
||||
await expect(page.locator('.battery-fully')).toHaveText('00:30');
|
||||
})
|
||||
@@ -0,0 +1,81 @@
|
||||
// @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.
|
||||
});
|
||||
@@ -0,0 +1,39 @@
|
||||
// @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(() => {
|
||||
const mockBattery = {
|
||||
level: 0.75,
|
||||
charging: true,
|
||||
chargingTime: 1800, // seconds
|
||||
dischargingTime: Infinity,
|
||||
addEventListener: (name, cb) => logCall(`addEventListener:${name}`)
|
||||
};
|
||||
// Override the method to always return mock battery info.
|
||||
window.navigator.getBattery = async () => {
|
||||
logCall('getBattery');
|
||||
return mockBattery;
|
||||
};
|
||||
// application tries navigator.battery first
|
||||
// so we delete this method
|
||||
delete window.navigator.battery;
|
||||
});
|
||||
})
|
||||
|
||||
test('verify battery calls', async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await expect(page.locator('.battery-percentage')).toHaveText('75%');
|
||||
|
||||
// Ensure expected method calls were made.
|
||||
expect(log).toEqual([
|
||||
'getBattery',
|
||||
'addEventListener:chargingchange',
|
||||
'addEventListener:levelchange'
|
||||
]);
|
||||
});
|
||||
Reference in New Issue
Block a user