Telemetry e2e test (#308)
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"selectedModel": {
|
||||||
|
"name": "auto",
|
||||||
|
"provider": "auto"
|
||||||
|
},
|
||||||
|
"providerSettings": {},
|
||||||
|
"telemetryConsent": "unset",
|
||||||
|
"telemetryUserId": "[UUID]",
|
||||||
|
"hasRunBefore": true,
|
||||||
|
"experiments": {},
|
||||||
|
"enableProLazyEditsMode": true,
|
||||||
|
"enableProSmartFilesContextMode": true,
|
||||||
|
"isTestMode": true
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"selectedModel": {
|
||||||
|
"name": "auto",
|
||||||
|
"provider": "auto"
|
||||||
|
},
|
||||||
|
"providerSettings": {},
|
||||||
|
"telemetryConsent": "unset",
|
||||||
|
"telemetryUserId": "[UUID]",
|
||||||
|
"hasRunBefore": true,
|
||||||
|
"experiments": {},
|
||||||
|
"enableProLazyEditsMode": true,
|
||||||
|
"enableProSmartFilesContextMode": true,
|
||||||
|
"isTestMode": true
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"selectedModel": {
|
||||||
|
"name": "auto",
|
||||||
|
"provider": "auto"
|
||||||
|
},
|
||||||
|
"providerSettings": {},
|
||||||
|
"telemetryConsent": "unset",
|
||||||
|
"telemetryUserId": "[UUID]",
|
||||||
|
"hasRunBefore": true,
|
||||||
|
"experiments": {},
|
||||||
|
"enableProLazyEditsMode": true,
|
||||||
|
"enableProSmartFilesContextMode": true,
|
||||||
|
"isTestMode": true
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
28
e2e-tests/telemetry.spec.ts
Normal file
28
e2e-tests/telemetry.spec.ts
Normal 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();
|
||||||
|
});
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user