Telemetry e2e test (#308)

This commit is contained in:
Will Chen
2025-06-02 16:19:47 -07:00
committed by GitHub
parent e905e9e10f
commit 3499fabab3
9 changed files with 161 additions and 4 deletions

View File

@@ -2,11 +2,19 @@ import { test as base, Page, expect } from "@playwright/test";
import { findLatestBuild, parseElectronApp } from "electron-playwright-helpers"; import { findLatestBuild, parseElectronApp } from "electron-playwright-helpers";
import { ElectronApplication, _electron as electron } from "playwright"; import { ElectronApplication, _electron as electron } from "playwright";
import fs from "fs"; import fs from "fs";
import path from "path";
const showDebugLogs = process.env.DEBUG_LOGS === "true"; const showDebugLogs = process.env.DEBUG_LOGS === "true";
class PageObject { class PageObject {
constructor(private page: Page) {} private userDataDir: string;
constructor(
private page: Page,
{ userDataDir }: { userDataDir: string },
) {
this.userDataDir = userDataDir;
}
async setUp({ autoApprove = false }: { autoApprove?: boolean } = {}) { async setUp({ autoApprove = false }: { autoApprove?: boolean } = {}) {
await this.goToSettingsTab(); await this.goToSettingsTab();
@@ -218,6 +226,30 @@ class PageObject {
await this.page.getByRole("switch", { name: "Auto-approve" }).click(); await this.page.getByRole("switch", { name: "Auto-approve" }).click();
} }
async snapshotSettings() {
const settings = path.join(this.userDataDir, "user-settings.json");
const settingsContent = fs.readFileSync(settings, "utf-8");
// Sanitize the "telemetryUserId" since it's a UUID
const sanitizedSettingsContent = settingsContent.replace(
/"telemetryUserId": "[^"]*"/g,
'"telemetryUserId": "[UUID]"',
);
expect(sanitizedSettingsContent).toMatchSnapshot();
}
async clickTelemetryAccept() {
await this.page.getByTestId("telemetry-accept-button").click();
}
async clickTelemetryReject() {
await this.page.getByTestId("telemetry-reject-button").click();
}
async clickTelemetryLater() {
await this.page.getByTestId("telemetry-later-button").click();
}
async goToAppsTab() { async goToAppsTab() {
await this.page.getByRole("link", { name: "Apps" }).click(); await this.page.getByRole("link", { name: "Apps" }).click();
} }
@@ -298,7 +330,9 @@ export const test = base.extend<{
async ({ electronApp }, use) => { async ({ electronApp }, use) => {
const page = await electronApp.firstWindow(); const page = await electronApp.firstWindow();
const po = new PageObject(page); const po = new PageObject(page, {
userDataDir: (electronApp as any).$dyadUserDataDir,
});
await use(po); await use(po);
}, },
{ auto: true }, { auto: true },
@@ -331,17 +365,19 @@ export const test = base.extend<{
process.env.E2E_TEST_BUILD = "true"; process.env.E2E_TEST_BUILD = "true";
// This is just a hack to avoid the AI setup screen. // This is just a hack to avoid the AI setup screen.
process.env.OPENAI_API_KEY = "sk-test"; process.env.OPENAI_API_KEY = "sk-test";
const USER_DATA_DIR = `/tmp/dyad-e2e-tests-${Date.now()}`;
const electronApp = await electron.launch({ const electronApp = await electron.launch({
args: [ args: [
appInfo.main, appInfo.main,
"--enable-logging", "--enable-logging",
`--user-data-dir=/tmp/dyad-e2e-tests-${Date.now()}`, `--user-data-dir=${USER_DATA_DIR}`,
], ],
executablePath: appInfo.executable, executablePath: appInfo.executable,
recordVideo: { recordVideo: {
dir: "test-results", dir: "test-results",
}, },
}); });
(electronApp as any).$dyadUserDataDir = USER_DATA_DIR;
console.log("electronApp launched!"); console.log("electronApp launched!");
if (showDebugLogs) { if (showDebugLogs) {

View File

@@ -0,0 +1,14 @@
{
"selectedModel": {
"name": "auto",
"provider": "auto"
},
"providerSettings": {},
"telemetryConsent": "unset",
"telemetryUserId": "[UUID]",
"hasRunBefore": true,
"experiments": {},
"enableProLazyEditsMode": true,
"enableProSmartFilesContextMode": true,
"isTestMode": true
}

View File

@@ -0,0 +1,15 @@
{
"selectedModel": {
"name": "auto",
"provider": "auto"
},
"providerSettings": {},
"telemetryConsent": "opted_in",
"telemetryUserId": "[UUID]",
"hasRunBefore": true,
"experiments": {},
"lastShownReleaseNotesVersion": "0.8.0",
"enableProLazyEditsMode": true,
"enableProSmartFilesContextMode": true,
"isTestMode": true
}

View File

@@ -0,0 +1,14 @@
{
"selectedModel": {
"name": "auto",
"provider": "auto"
},
"providerSettings": {},
"telemetryConsent": "unset",
"telemetryUserId": "[UUID]",
"hasRunBefore": true,
"experiments": {},
"enableProLazyEditsMode": true,
"enableProSmartFilesContextMode": true,
"isTestMode": true
}

View File

@@ -0,0 +1,15 @@
{
"selectedModel": {
"name": "auto",
"provider": "auto"
},
"providerSettings": {},
"telemetryConsent": "unset",
"telemetryUserId": "[UUID]",
"hasRunBefore": true,
"experiments": {},
"lastShownReleaseNotesVersion": "0.8.0",
"enableProLazyEditsMode": true,
"enableProSmartFilesContextMode": true,
"isTestMode": true
}

View File

@@ -0,0 +1,14 @@
{
"selectedModel": {
"name": "auto",
"provider": "auto"
},
"providerSettings": {},
"telemetryConsent": "unset",
"telemetryUserId": "[UUID]",
"hasRunBefore": true,
"experiments": {},
"enableProLazyEditsMode": true,
"enableProSmartFilesContextMode": true,
"isTestMode": true
}

View File

@@ -0,0 +1,15 @@
{
"selectedModel": {
"name": "auto",
"provider": "auto"
},
"providerSettings": {},
"telemetryConsent": "opted_out",
"telemetryUserId": "[UUID]",
"hasRunBefore": true,
"experiments": {},
"lastShownReleaseNotesVersion": "0.8.0",
"enableProLazyEditsMode": true,
"enableProSmartFilesContextMode": true,
"isTestMode": true
}

View File

@@ -0,0 +1,28 @@
import { test } from "./helpers/test_helper";
test("telemetry - accept", async ({ po }) => {
// Expect NO telemetry settings to be set
await po.snapshotSettings();
await po.clickTelemetryAccept();
// Expect telemetry settings to be set
await po.snapshotSettings();
});
test("telemetry - reject", async ({ po }) => {
// Expect NO telemetry settings to be set
await po.snapshotSettings();
await po.clickTelemetryReject();
// Expect telemetry settings to still NOT be set
await po.snapshotSettings();
});
test("telemetry - later", async ({ po }) => {
// Expect NO telemetry settings to be set
await po.snapshotSettings();
await po.clickTelemetryLater();
// Expect telemetry settings to still NOT be set
await po.snapshotSettings();
});

View File

@@ -48,6 +48,7 @@ export function PrivacyBanner() {
onClick={() => { onClick={() => {
updateSettings({ telemetryConsent: "opted_in" }); updateSettings({ telemetryConsent: "opted_in" });
}} }}
data-testid="telemetry-accept-button"
> >
Accept Accept
</Button> </Button>
@@ -56,10 +57,15 @@ export function PrivacyBanner() {
onClick={() => { onClick={() => {
updateSettings({ telemetryConsent: "opted_out" }); updateSettings({ telemetryConsent: "opted_out" });
}} }}
data-testid="telemetry-reject-button"
> >
Reject Reject
</Button> </Button>
<Button variant="ghost" onClick={() => setHideBanner(true)}> <Button
variant="ghost"
onClick={() => setHideBanner(true)}
data-testid="telemetry-later-button"
>
Later Later
</Button> </Button>
</div> </div>