e2e tests for engine (#322)

This commit is contained in:
Will Chen
2025-06-03 16:11:16 -07:00
committed by GitHub
parent 7235eab227
commit fc1ebe9e8a
10 changed files with 956 additions and 165 deletions

View File

@@ -36,6 +36,35 @@ class PageObject {
await this.selectTestModel();
}
async setUpDyadPro({ autoApprove = false }: { autoApprove?: boolean } = {}) {
await this.goToSettingsTab();
if (autoApprove) {
await this.toggleAutoApprove();
}
await this.setUpDyadProvider();
await this.goToAppsTab();
}
async setUpDyadProvider() {
// await page.getByRole('link', { name: 'Settings' }).click();
await this.page
.locator("div")
.filter({ hasText: /^DyadNeeds Setup$/ })
.nth(1)
.click();
await this.page.getByRole("textbox", { name: "Set Dyad API Key" }).click();
await this.page
.getByRole("textbox", { name: "Set Dyad API Key" })
.fill("testdyadkey");
await this.page.getByRole("button", { name: "Save Key" }).click();
// await page.getByRole('link', { name: 'Apps' }).click();
// await page.getByTestId('home-chat-input-container').getByRole('button', { name: 'Pro' }).click();
// await page.getByRole('switch', { name: 'Turbo Edits' }).click();
// await page.getByRole('switch', { name: 'Turbo Edits' }).click();
// await page.locator('div').filter({ hasText: /^Import App$/ }).click();
// await page.getByRole('button', { name: 'Select Folder' }).press('Escape');
}
async snapshotMessages({
replaceDumpPath = false,
}: { replaceDumpPath?: boolean } = {}) {
@@ -110,9 +139,9 @@ class PageObject {
});
}
async snapshotServerDump({
onlyLastMessage = false,
}: { onlyLastMessage?: boolean } = {}) {
async snapshotServerDump(
type: "all-messages" | "last-message" | "request" = "all-messages",
) {
// Get the text content of the messages list
const messagesListText = await this.page
.getByTestId("messages-list")
@@ -133,9 +162,16 @@ class PageObject {
const dumpContent = fs.readFileSync(dumpFilePath, "utf-8");
// Perform snapshot comparison
expect(prettifyDump(dumpContent, { onlyLastMessage })).toMatchSnapshot(
"server-dump.txt",
);
const parsedDump = JSON.parse(dumpContent);
if (type === "request") {
expect(dumpContent).toMatchSnapshot("server-dump-request.json");
return;
}
expect(
prettifyDump(parsedDump["body"]["messages"], {
onlyLastMessage: type === "last-message",
}),
).toMatchSnapshot("server-dump.txt");
}
async waitForChatCompletion() {
@@ -185,6 +221,12 @@ class PageObject {
await this.waitForChatCompletion();
}
async selectModel({ provider, model }: { provider: string; model: string }) {
await this.page.getByRole("button", { name: "Model: Auto" }).click();
await this.page.getByText(provider).click();
await this.page.getByText(model).click();
}
async selectTestModel() {
await this.page.getByRole("button", { name: "Model: Auto" }).click();
await this.page.getByText("test-provider").click();
@@ -430,6 +472,7 @@ export const test = base.extend<{
process.env.OLLAMA_HOST = "http://localhost:3500/ollama";
process.env.LM_STUDIO_BASE_URL_FOR_TESTING =
"http://localhost:3500/lmstudio";
process.env.DYAD_LOCAL_ENGINE = "http://localhost:3500/engine/v1";
process.env.E2E_TEST_BUILD = "true";
// This is just a hack to avoid the AI setup screen.
process.env.OPENAI_API_KEY = "sk-test";
@@ -495,15 +538,13 @@ export const test = base.extend<{
export const testSkipIfWindows = os.platform() === "win32" ? test.skip : test;
function prettifyDump(
dumpContent: string,
{ onlyLastMessage = false }: { onlyLastMessage?: boolean } = {},
) {
const parsedDump = JSON.parse(dumpContent) as Array<{
allMessages: {
role: string;
content: string | Array<{}>;
}>;
const messages = onlyLastMessage ? parsedDump.slice(-1) : parsedDump;
}[],
{ onlyLastMessage = false }: { onlyLastMessage?: boolean } = {},
) {
const messages = onlyLastMessage ? allMessages.slice(-1) : allMessages;
return messages
.map((message) => {