AFFiNE/tests/kit/electron.ts
renovate 3d3a66c3ed
chore: bump up electron version to v33 (#8495)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [electron](https://redirect.github.com/electron/electron) | [`^32.0.0` -> `^33.0.0`](https://renovatebot.com/diffs/npm/electron/32.1.2/33.0.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/electron/33.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/electron/33.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/electron/32.1.2/33.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/electron/32.1.2/33.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>electron/electron (electron)</summary>

### [`v33.0.0`](https://redirect.github.com/electron/electron/compare/v32.2.0...v33.0.0)

[Compare Source](https://redirect.github.com/electron/electron/compare/v32.2.0...v33.0.0)

### [`v32.2.0`](https://redirect.github.com/electron/electron/releases/tag/v32.2.0): electron v32.2.0

[Compare Source](https://redirect.github.com/electron/electron/compare/v32.1.2...v32.2.0)

### Release Notes for v32.2.0

#### Fixes

-   Fixed a crash when calling `focus` on a `WebView`'s `webContents`. [#&#8203;43934](https://redirect.github.com/electron/electron/pull/43934) <span style="font-size:small;">(Also in [31](https://redirect.github.com/electron/electron/pull/43933), [33](https://redirect.github.com/electron/electron/pull/43932))</span>
-   Fixed a potential issue accessing a child window document when overriding browserWindow creation via `setWindowOpenHandler`. [#&#8203;43877](https://redirect.github.com/electron/electron/pull/43877) <span style="font-size:small;">(Also in [31](https://redirect.github.com/electron/electron/pull/43878), [33](https://redirect.github.com/electron/electron/pull/43816))</span>
-   Fixed an issue where an exception could be thrown on BrowserView after its owner BrowserWindow was closed. [#&#8203;44001](https://redirect.github.com/electron/electron/pull/44001) <span style="font-size:small;">(Also in [31](https://redirect.github.com/electron/electron/pull/43999), [33](https://redirect.github.com/electron/electron/pull/44000))</span>
-   Fixed closing a window with more than one attached sheet on macOS. [#&#8203;43954](https://redirect.github.com/electron/electron/pull/43954) <span style="font-size:small;">(Also in [31](https://redirect.github.com/electron/electron/pull/43953), [33](https://redirect.github.com/electron/electron/pull/43952))</span>
-   Fixed potential use-after-free during view removal on macOS. [#&#8203;43923](https://redirect.github.com/electron/electron/pull/43923) <span style="font-size:small;">(Also in [31](https://redirect.github.com/electron/electron/pull/43924), [33](https://redirect.github.com/electron/electron/pull/43922))</span>

#### Other Changes

-   Ensured that the `sender-id` hint is set when creating desktop notifications on DBus. [#&#8203;43950](https://redirect.github.com/electron/electron/pull/43950) <span style="font-size:small;">(Also in [31](https://redirect.github.com/electron/electron/pull/43951), [33](https://redirect.github.com/electron/electron/pull/43949))</span>
-   Updated Chromium to 128.0.6613.178. [#&#8203;44086](https://redirect.github.com/electron/electron/pull/44086)
-   Updated Node.js to v20.18.0. [#&#8203;44116](https://redirect.github.com/electron/electron/pull/44116)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2024-10-15 07:18:28 +00:00

174 lines
4.4 KiB
TypeScript

import crypto from 'node:crypto';
import { join, resolve } from 'node:path';
import { expect, type Page } from '@playwright/test';
import fs from 'fs-extra';
import type { ElectronApplication } from 'playwright';
import { _electron as electron } from 'playwright';
import { test as base, testResultDir } from './playwright';
import { removeWithRetry } from './utils/utils';
const projectRoot = join(__dirname, '..', '..');
const electronRoot = join(projectRoot, 'packages/frontend/apps/electron');
function generateUUID() {
return crypto.randomUUID();
}
type RoutePath = 'setting';
const getPageId = async (page: Page) => {
return page.evaluate(() => {
return (window.__appInfo as any)?.viewId as string;
});
};
const isActivePage = async (page: Page) => {
return page.evaluate(async () => {
return await (window as any).__apis?.ui.isActiveTab();
});
};
const getActivePage = async (pages: Page[]) => {
for (const page of pages) {
if (await isActivePage(page)) {
return page;
}
}
return null;
};
export const test = base.extend<{
electronApp: ElectronApplication;
shell: Page;
appInfo: {
appPath: string;
appData: string;
sessionData: string;
};
views: {
getActive: () => Promise<Page>;
};
router: {
goto: (path: RoutePath) => Promise<void>;
};
}>({
shell: async ({ electronApp }, use) => {
await expect.poll(() => electronApp.windows().length > 1).toBeTruthy();
for (const page of electronApp.windows()) {
const viewId = await getPageId(page);
if (viewId === 'shell') {
await use(page);
break;
}
}
},
page: async ({ electronApp }, use) => {
await expect
.poll(
() => {
return electronApp.windows().length > 1;
},
{
timeout: 50000,
}
)
.toBeTruthy();
const page = await getActivePage(electronApp.windows());
if (!page) {
throw new Error('No active page found');
}
// wait for blocksuite to be loaded
await page.waitForSelector('v-line');
await page.evaluate(() => {
window.localStorage.setItem('dismissAiOnboarding', 'true');
window.localStorage.setItem('dismissAiOnboardingEdgeless', 'true');
window.localStorage.setItem('dismissAiOnboardingLocal', 'true');
});
await page.reload({
timeout: 30000,
});
// wait until the page is stable enough
await page.waitForTimeout(2000);
await use(page as Page);
},
views: async ({ electronApp, page }, use) => {
void page; // makes sure page is a dependency
await use({
getActive: async () => {
const view = await getActivePage(electronApp.windows());
return view || page;
},
});
},
// eslint-disable-next-line no-empty-pattern
electronApp: async ({}, use) => {
try {
// a random id to avoid conflicts between tests
const id = generateUUID();
const dist = resolve(electronRoot, 'dist');
const clonedDist = resolve(electronRoot, 'e2e-dist-' + id);
await fs.copy(dist, clonedDist);
const packageJson = await fs.readJSON(
resolve(electronRoot, 'package.json')
);
// overwrite the app name
packageJson.name = 'affine-test-' + id;
// overwrite the path to the main script
packageJson.main = './main.js';
// write to the cloned dist
await fs.writeJSON(resolve(clonedDist, 'package.json'), packageJson);
const env: Record<string, string> = {};
for (const [key, value] of Object.entries(process.env)) {
if (value) {
env[key] = value;
}
}
env.DEBUG = 'pw:browser';
env.SKIP_ONBOARDING = '1';
const electronApp = await electron.launch({
args: [clonedDist],
env,
cwd: clonedDist,
recordVideo: {
dir: testResultDir,
},
colorScheme: 'light',
});
await use(electronApp);
console.log('Cleaning up...');
const pages = electronApp.windows();
for (const page of pages) {
await page.close();
}
await electronApp.close();
await removeWithRetry(clonedDist);
} catch (error) {
console.log(error);
}
},
appInfo: async ({ electronApp }, use) => {
const appInfo = await electronApp.evaluate(async ({ app }) => {
return {
appPath: app.getAppPath(),
appData: app.getPath('appData'),
sessionData: app.getPath('sessionData'),
};
});
await use(appInfo);
},
});