Skip to content

Commit 45ac99c

Browse files
Cristhianzlclaude
andcommitted
Merge branch 'cz/playwright-tests-refactor' into feat/assistant-mcp-integration-clean
Bring the Playwright suite refactor (PR #13278: shared helpers + centralized TID/TEXTS/TIMEOUTS constants) into the feature branch so our test fixes are standardized against it. Conflict resolutions (our fix kept, expressed in the refactored style): - await-bootstrap-test.ts / run-flow / actionsMainPage-shard-1 / bulk-actions: keep our race-safe openTemplatesModal() helper, adopt the refactor's expect().toBeVisible() assertion. - add-flow-to-test-on-empty-langflow.ts: keep both the TEXTS import and our explanatory doc comment. - generalBugs-shard-13: keep both import sets (openTemplatesModal + env/skip helpers). - general-bugs-shard-3909: keep our deletion of the broken add-project navigation block (awaitBootstrapTest already opens the modal). - folder-deletion-integrity / shareable-playground-persistence: take the refactor's version (it supersedes our small adjustments). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 parents 88dbe58 + be2ae7e commit 45ac99c

198 files changed

Lines changed: 2533 additions & 4025 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { test } from "../../fixtures";
1+
import { expect, test } from "../../fixtures";
22
import { adjustScreenView } from "../../utils/adjust-screen-view";
33
import { awaitBootstrapTest } from "../../utils/await-bootstrap-test";
4+
import { TEXTS } from "../../utils/constants/texts";
45
import { openTemplatesModal } from "../../utils/new-project-flow";
56

67
test(
@@ -10,7 +11,9 @@ test(
1011
await awaitBootstrapTest(page);
1112

1213
await page.getByTestId("side_nav_options_all-templates").click();
13-
await page.getByRole("heading", { name: "Basic Prompting" }).click();
14+
await page
15+
.getByRole("heading", { name: TEXTS.templateBasicPrompting })
16+
.click();
1417

1518
await page.waitForSelector('[data-testid="sidebar-search-input"]', {
1619
timeout: 100000,
@@ -27,31 +30,35 @@ test(
2730
timeout: 1000,
2831
});
2932
// click on the delete button
30-
await page.getByText("Delete").last().click();
33+
await page.getByText(TEXTS.delete).last().click();
3134
await page.getByText("This can't be undone.").isVisible({
3235
timeout: 1000,
3336
});
3437

3538
//confirm the deletion in the modal
36-
await page.getByText("Delete").last().click();
39+
await page.getByText(TEXTS.delete).last().click();
3740

38-
await page.getByText("Selected items deleted successfully").isVisible();
41+
await expect(
42+
page.getByText("Selected items deleted successfully"),
43+
).toBeVisible();
3944
},
4045
);
4146

4247
test("search flows", { tag: ["@release", "@mainpage"] }, async ({ page }) => {
4348
await awaitBootstrapTest(page);
4449

4550
await page.getByTestId("side_nav_options_all-templates").click();
46-
await page.getByRole("heading", { name: "Basic Prompting" }).click();
51+
await page
52+
.getByRole("heading", { name: TEXTS.templateBasicPrompting })
53+
.click();
4754

4855
await page.waitForSelector('[data-testid="sidebar-search-input"]', {
4956
timeout: 100000,
5057
});
5158

5259
await page.getByTestId("icon-ChevronLeft").first().click();
5360

54-
await page.getByText("New Flow").isVisible();
61+
await expect(page.getByText("New Flow")).toBeVisible();
5562
await openTemplatesModal(page);
5663
await page.getByTestId("side_nav_options_all-templates").click();
5764
await page.getByRole("heading", { name: "Memory Chatbot" }).click();
@@ -71,9 +78,11 @@ test("search flows", { tag: ["@release", "@mainpage"] }, async ({ page }) => {
7178

7279
await page.getByTestId("icon-ChevronLeft").first().click();
7380
await page.getByPlaceholder("Search flows").fill("Memory Chatbot");
74-
await page.getByText("Memory Chatbot", { exact: true }).isVisible();
81+
await expect(page.getByText("Memory Chatbot", { exact: true })).toBeVisible();
7582
await page.getByText("Document Q&A", { exact: true }).isHidden();
76-
await page.getByText("Basic Prompting", { exact: true }).isHidden();
83+
await page
84+
.getByText(TEXTS.templateBasicPrompting, { exact: true })
85+
.isHidden();
7786
});
7887

7988
test(
@@ -84,11 +93,13 @@ test(
8493

8594
if (await page.getByTestId("components-btn").isVisible()) {
8695
await page.getByTestId("side_nav_options_all-templates").click();
87-
await page.getByRole("heading", { name: "Basic Prompting" }).click();
96+
await page
97+
.getByRole("heading", { name: TEXTS.templateBasicPrompting })
98+
.click();
8899

89100
await adjustScreenView(page, { numberOfZoomOut: 2 });
90101

91-
await page.getByText("Chat Input").first().click();
102+
await page.getByText(TEXTS.componentChatInput).first().click();
92103
await page.waitForSelector('[data-testid="more-options-modal"]', {
93104
timeout: 1000,
94105
});
@@ -124,15 +135,19 @@ test(
124135

125136
await page.getByTestId("icon-ChevronLeft").first().click();
126137

127-
const exitButton = await page.getByText("Exit", { exact: true }).count();
138+
const exitButton = await page
139+
.getByText(TEXTS.exit, { exact: true })
140+
.count();
128141

129142
if (exitButton > 0) {
130-
await page.getByText("Exit", { exact: true }).click();
143+
await page.getByText(TEXTS.exit, { exact: true }).click();
131144
}
132145

133146
await page.getByTestId("components-btn").click();
134147
await page.getByPlaceholder("Search components").fill("Chat Input");
135-
await page.getByText("Chat Input", { exact: true }).isVisible();
148+
await expect(
149+
page.getByText(TEXTS.componentChatInput, { exact: true }),
150+
).toBeVisible();
136151
await page.getByText("Prompt", { exact: true }).isHidden();
137152
await page.getByText("OpenAI", { exact: true }).isHidden();
138153
}

src/frontend/tests/core/features/auto-login-off.spec.ts

Lines changed: 57 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { waitForNewProjectButton } from "../../utils/new-project-flow";
55
import { renameFlow } from "../../utils/rename-flow";
66
import { zoomOut } from "../../utils/zoom-out";
77

8+
import { TEXTS } from "../../utils/constants/texts";
89
test(
910
"when auto_login is false, admin can CRUD user's and should see just your own flows",
1011
{ tag: ["@release", "@api", "@database", "@mainpage"] },
@@ -41,16 +42,22 @@ test(
4142

4243
await page.goto("/");
4344

44-
await page.waitForSelector("text=sign in to langflow", { timeout: 30000 });
45+
await page.waitForSelector(`text=${TEXTS.authSignInHeader}`, {
46+
timeout: 30000,
47+
});
4548

46-
await page.getByPlaceholder("Username").fill("langflow");
47-
await page.getByPlaceholder("Password").fill("langflow");
49+
await page
50+
.getByPlaceholder(TEXTS.placeholderUsername)
51+
.fill(TEXTS.authDefaultCredential);
52+
await page
53+
.getByPlaceholder(TEXTS.placeholderPassword)
54+
.fill(TEXTS.authDefaultCredential);
4855

4956
await page.evaluate(() => {
5057
sessionStorage.removeItem("testMockAutoLogin");
5158
});
5259

53-
await page.getByRole("button", { name: "Sign In" }).click();
60+
await page.getByRole("button", { name: TEXTS.signIn }).click();
5461

5562
await page.waitForSelector('[data-testid="mainpage_title"]', {
5663
timeout: 30000,
@@ -65,7 +72,10 @@ test(
6572
//CRUD an user
6673
await page.getByText("New User", { exact: true }).click();
6774

68-
await page.getByPlaceholder("Username").last().fill(randomName);
75+
await page
76+
.getByPlaceholder(TEXTS.placeholderUsername)
77+
.last()
78+
.fill(randomName);
6979
await page.locator('input[name="password"]').fill(randomPassword);
7080
await page.locator('input[name="confirmpassword"]').fill(randomPassword);
7181

@@ -75,7 +85,7 @@ test(
7585

7686
await page.locator("#is_active").click();
7787

78-
await page.getByText("Save", { exact: true }).click();
88+
await page.getByText(TEXTS.save, { exact: true }).click();
7989

8090
await page.waitForSelector("text=new user added", { timeout: 30000 });
8191

@@ -84,7 +94,7 @@ test(
8494
});
8595

8696
await page.getByTestId("icon-Trash2").last().click();
87-
await page.getByText("Delete", { exact: true }).last().click();
97+
await page.getByText(TEXTS.delete, { exact: true }).last().click();
8898

8999
await page.waitForSelector("text=user deleted", { timeout: 30000 });
90100

@@ -95,7 +105,10 @@ test(
95105

96106
await page.getByText("New User", { exact: true }).click();
97107

98-
await page.getByPlaceholder("Username").last().fill(randomName);
108+
await page
109+
.getByPlaceholder(TEXTS.placeholderUsername)
110+
.last()
111+
.fill(randomName);
99112
await page.locator('input[name="password"]').fill(randomPassword);
100113
await page.locator('input[name="confirmpassword"]').fill(randomPassword);
101114

@@ -105,22 +118,28 @@ test(
105118

106119
await page.locator("#is_active").click();
107120

108-
await page.getByText("Save", { exact: true }).click();
121+
await page.getByText(TEXTS.save, { exact: true }).click();
109122

110123
await page.waitForSelector("text=new user added", { timeout: 30000 });
111124

112125
const searchResponse = page.waitForResponse(
113126
(response) =>
114127
response.url().includes("/api/v1/users") && response.status() === 200,
115128
);
116-
await page.getByPlaceholder("Username").last().fill(randomName);
129+
await page
130+
.getByPlaceholder(TEXTS.placeholderUsername)
131+
.last()
132+
.fill(randomName);
117133
await searchResponse;
118134

119135
await page.getByTestId("icon-Pencil").last().click();
120136

121-
await page.getByPlaceholder("Username").last().fill(secondRandomName);
137+
await page
138+
.getByPlaceholder(TEXTS.placeholderUsername)
139+
.last()
140+
.fill(secondRandomName);
122141

123-
await page.getByText("Save", { exact: true }).click();
142+
await page.getByText(TEXTS.save, { exact: true }).click();
124143

125144
await page.waitForSelector("text=user edited", { timeout: 30000 });
126145

@@ -142,7 +161,9 @@ test(
142161
await awaitBootstrapTest(page, { skipGoto: true });
143162

144163
await page.getByTestId("side_nav_options_all-templates").click();
145-
await page.getByRole("heading", { name: "Basic Prompting" }).click();
164+
await page
165+
.getByRole("heading", { name: TEXTS.templateBasicPrompting })
166+
.click();
146167

147168
await adjustScreenView(page, { numberOfZoomOut: 1 });
148169

@@ -178,18 +199,22 @@ test(
178199
sessionStorage.setItem("testMockAutoLogin", "true");
179200
});
180201

181-
await page.getByText("Logout", { exact: true }).click();
202+
await page.getByText(TEXTS.logout, { exact: true }).click();
182203

183-
await page.waitForSelector("text=sign in to langflow", { timeout: 30000 });
204+
await page.waitForSelector(`text=${TEXTS.authSignInHeader}`, {
205+
timeout: 30000,
206+
});
184207

185-
await page.getByPlaceholder("Username").fill(secondRandomName);
186-
await page.getByPlaceholder("Password").fill(randomPassword);
208+
await page
209+
.getByPlaceholder(TEXTS.placeholderUsername)
210+
.fill(secondRandomName);
211+
await page.getByPlaceholder(TEXTS.placeholderPassword).fill(randomPassword);
187212

188213
await page.waitForSelector("text=Sign in", {
189214
timeout: 1500,
190215
});
191216

192-
await page.getByRole("button", { name: "Sign In" }).click();
217+
await page.getByRole("button", { name: TEXTS.signIn }).click();
193218

194219
await page.evaluate(() => {
195220
sessionStorage.removeItem("testMockAutoLogin");
@@ -210,7 +235,9 @@ test(
210235
await awaitBootstrapTest(page, { skipGoto: true });
211236

212237
await page.getByTestId("side_nav_options_all-templates").click();
213-
await page.getByRole("heading", { name: "Basic Prompting" }).click();
238+
await page
239+
.getByRole("heading", { name: TEXTS.templateBasicPrompting })
240+
.click();
214241

215242
await adjustScreenView(page, { numberOfZoomOut: 2 });
216243

@@ -243,18 +270,24 @@ test(
243270
sessionStorage.setItem("testMockAutoLogin", "true");
244271
});
245272

246-
await page.getByText("Logout", { exact: true }).click();
273+
await page.getByText(TEXTS.logout, { exact: true }).click();
247274

248-
await page.waitForSelector("text=sign in to langflow", { timeout: 30000 });
275+
await page.waitForSelector(`text=${TEXTS.authSignInHeader}`, {
276+
timeout: 30000,
277+
});
249278

250-
await page.getByPlaceholder("Username").fill("langflow");
251-
await page.getByPlaceholder("Password").fill("langflow");
279+
await page
280+
.getByPlaceholder(TEXTS.placeholderUsername)
281+
.fill(TEXTS.authDefaultCredential);
282+
await page
283+
.getByPlaceholder(TEXTS.placeholderPassword)
284+
.fill(TEXTS.authDefaultCredential);
252285

253286
await page.evaluate(() => {
254287
sessionStorage.removeItem("testMockAutoLogin");
255288
});
256289

257-
await page.getByRole("button", { name: "Sign In" }).click();
290+
await page.getByRole("button", { name: TEXTS.signIn }).click();
258291

259292
await page.waitForSelector('[data-testid="mainpage_title"]', {
260293
timeout: 30000,

0 commit comments

Comments
 (0)