Skip to content

Commit 80692e7

Browse files
committed
test: remove automatic logout for all tests
1 parent d10835b commit 80692e7

8 files changed

Lines changed: 168 additions & 70 deletions

File tree

playwright/fixtures/index.ts

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import * as fs from "fs/promises";
2-
import * as os from "os";
3-
import * as path from "path";
41
import { test as baseTest, expect } from "@playwright/test";
52
import { SharedSlice } from "@prismicio/types-internal/lib/customtypes";
63
import {
@@ -21,7 +18,7 @@ import { SimulatorPage } from "../pages/SimulatorPage";
2118
import { SliceMachinePage } from "../pages/SliceMachinePage";
2219
import { generateRandomId } from "../utils/generateRandomId";
2320
import { MockManagerProcedures } from "../utils";
24-
import config from "../playwright.config";
21+
import config, { auth, baseUrl } from "../playwright.config";
2522

2623
type Options = {
2724
onboarded: boolean;
@@ -48,10 +45,10 @@ type Fixtures = {
4845
/**
4946
* Data
5047
*/
51-
reusablePageType: { name: string };
52-
singlePageType: { name: string };
53-
reusableCustomType: { name: string };
54-
singleCustomType: { name: string };
48+
reusablePageType: { name: string; id: string };
49+
singlePageType: { name: string; id: string };
50+
reusableCustomType: { name: string; id: string };
51+
singleCustomType: { name: string; id: string };
5552
slice: { name: string };
5653
repeatableZoneSlice: { name: string };
5754
firstSliceLibrary: { id: string };
@@ -65,6 +62,11 @@ type Fixtures = {
6562
* Mocks
6663
*/
6764
procedures: MockManagerProcedures;
65+
66+
/**
67+
* Authentication
68+
*/
69+
userApiToken: string;
6870
};
6971

7072
export const test = baseTest.extend<Options & Fixtures>({
@@ -112,55 +114,79 @@ export const test = baseTest.extend<Options & Fixtures>({
112114
/**
113115
* Data
114116
*/
115-
reusablePageType: async ({ pageTypesTablePage }, use) => {
117+
reusablePageType: async ({ pageTypesTablePage, manager }, use) => {
116118
await pageTypesTablePage.goto();
117119
await pageTypesTablePage.openCreateDialog();
118120

119-
const pageTypeName = "Page Type " + generateRandomId();
121+
const uuid = generateRandomId();
122+
const pageTypeName = "Page Type " + uuid;
123+
const pageTypeId = `page_type_${uuid}`;
120124
await pageTypesTablePage.createTypeDialog.createType(
121125
pageTypeName,
122126
"reusable",
123127
);
124128

125-
await use({ name: pageTypeName });
129+
await use({ name: pageTypeName, id: pageTypeId });
130+
131+
await manager.customTypes.deleteCustomType({
132+
id: pageTypeId,
133+
});
126134
},
127-
singlePageType: async ({ pageTypesTablePage }, use) => {
135+
singlePageType: async ({ pageTypesTablePage, manager }, use) => {
128136
await pageTypesTablePage.goto();
129137
await pageTypesTablePage.openCreateDialog();
130138

131-
const pageTypeName = "Page Type " + generateRandomId();
139+
const uuid = generateRandomId();
140+
const pageTypeName = "Page Type " + uuid;
141+
const pageTypeId = `page_type_${uuid}`;
132142
await pageTypesTablePage.createTypeDialog.createType(
133143
pageTypeName,
134144
"single",
135145
);
136146

137-
await use({ name: pageTypeName });
147+
await use({ name: pageTypeName, id: pageTypeId });
148+
149+
await manager.customTypes.deleteCustomType({
150+
id: pageTypeId,
151+
});
138152
},
139-
reusableCustomType: async ({ customTypesTablePage }, use) => {
153+
reusableCustomType: async ({ customTypesTablePage, manager }, use) => {
140154
await customTypesTablePage.goto();
141155
await customTypesTablePage.openCreateDialog();
142156

143-
const customTypeName = "Custom Type " + generateRandomId();
157+
const uuid = generateRandomId();
158+
const customTypeName = "Custom Type " + uuid;
159+
const customTypeId = `custom_type_${uuid}`;
144160
await customTypesTablePage.createTypeDialog.createType(
145161
customTypeName,
146162
"reusable",
147163
);
148164

149-
await use({ name: customTypeName });
165+
await use({ name: customTypeName, id: customTypeId });
166+
167+
await manager.customTypes.deleteCustomType({
168+
id: customTypeId,
169+
});
150170
},
151-
singleCustomType: async ({ customTypesTablePage }, use) => {
171+
singleCustomType: async ({ customTypesTablePage, manager }, use) => {
152172
await customTypesTablePage.goto();
153173
await customTypesTablePage.openCreateDialog();
154174

155-
const customTypeName = "Custom Type " + generateRandomId();
175+
const uuid = generateRandomId();
176+
const customTypeName = "Custom Type " + uuid;
177+
const customTypeId = `custom_type_${uuid}`;
156178
await customTypesTablePage.createTypeDialog.createType(
157179
customTypeName,
158180
"single",
159181
);
160182

161-
await use({ name: customTypeName });
183+
await use({ name: customTypeName, id: customTypeId });
184+
185+
await manager.customTypes.deleteCustomType({
186+
id: customTypeId,
187+
});
162188
},
163-
slice: async ({ slicesListPage }, use) => {
189+
slice: async ({ slicesListPage, manager, firstSliceLibrary }, use) => {
164190
await slicesListPage.goto();
165191
await expect(slicesListPage.breadcrumbLabel).toBeVisible();
166192
await slicesListPage.addSliceDropdown.click();
@@ -170,6 +196,12 @@ export const test = baseTest.extend<Options & Fixtures>({
170196
await slicesListPage.createSliceDialog.createSlice(sliceName);
171197

172198
await use({ name: sliceName });
199+
200+
const sliceId = sliceName.toLowerCase();
201+
await manager.slices.deleteSlice({
202+
libraryID: firstSliceLibrary.id,
203+
sliceID: sliceId,
204+
});
173205
},
174206
repeatableZoneSlice: async ({ firstSliceLibrary, manager }, use) => {
175207
const sliceName = "Slice" + generateRandomId();
@@ -280,13 +312,6 @@ export const test = baseTest.extend<Options & Fixtures>({
280312
const newContext = await browser.newContext({ storageState });
281313
const page = await newContext.newPage();
282314

283-
// Logout user by default
284-
try {
285-
await fs.rm(path.join(os.homedir(), ".prismic"));
286-
} catch (error) {
287-
// Ignore since it means the user is already logged out
288-
}
289-
290315
// Propagate the modified page to the test
291316
await use(page);
292317

@@ -316,4 +341,22 @@ export const test = baseTest.extend<Options & Fixtures>({
316341

317342
await use(procedures);
318343
},
344+
345+
/**
346+
* Authentication
347+
*/
348+
// eslint-disable-next-line no-empty-pattern
349+
userApiToken: async ({}, use) => {
350+
const authUrl = baseUrl.replace("https://", "https://auth.");
351+
const loginResponse = await fetch(`${authUrl}login`, {
352+
method: "POST",
353+
body: JSON.stringify({
354+
email: auth.username,
355+
password: auth.password,
356+
}),
357+
});
358+
const userApiToken = await loginResponse.text();
359+
360+
await use(userApiToken);
361+
},
319362
});

playwright/pages/ChangesPage.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export class ChangesPage extends SliceMachinePage {
1212
readonly notLoggedInTitle: Locator;
1313
readonly notAuthorizedTitle: Locator;
1414
readonly blankSlateTitle: Locator;
15+
readonly postPushBlankSlateTitle: Locator;
1516
readonly unknownErrorMessage: Locator;
1617
readonly softLimitTitle: Locator;
1718
readonly softLimitCheckbox: Locator;
@@ -50,6 +51,10 @@ export class ChangesPage extends SliceMachinePage {
5051
this.blankSlateTitle = page.getByText("Everything is up-to-date", {
5152
exact: true,
5253
});
54+
this.postPushBlankSlateTitle = page.getByText(
55+
"Success! Your changes have been pushed to the Page Builder.",
56+
{ exact: true },
57+
);
5358
this.unknownErrorMessage = page.getByText(
5459
"Something went wrong when pushing your changes. Check your terminal logs.",
5560
{
@@ -100,6 +105,7 @@ export class ChangesPage extends SliceMachinePage {
100105
await this.pushChangesButton.click();
101106
await expect(this.pushChangesButton).toBeDisabled();
102107
await this.checkPushedMessage();
108+
await expect(this.postPushBlankSlateTitle).toBeVisible();
103109
}
104110

105111
async confirmDeleteDocuments() {
@@ -136,6 +142,18 @@ export class ChangesPage extends SliceMachinePage {
136142
).toBeVisible();
137143
}
138144

145+
async checkSliceName(name: string) {
146+
await expect(
147+
this.getSliceCard(name).getByText(name, { exact: true }),
148+
).toBeVisible();
149+
}
150+
151+
async checkSliceStatus(name: string, status: string) {
152+
await expect(
153+
this.getSliceCard(name).getByText(status, { exact: true }),
154+
).toBeVisible();
155+
}
156+
139157
async checkPushedMessage() {
140158
await expect(this.pushedMessaged).toBeVisible();
141159
await expect(this.pushedMessaged).not.toBeVisible();

playwright/playwright.config.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,7 @@ const config = {
108108
// Run local dev servers before starting the tests if needed.
109109
webServer: {
110110
cwd: "..",
111-
command: process.env["CI"]
112-
? `yarn play --prefix ${REPOSITORY_NAME_PREFIX}`
113-
: `yarn play`,
111+
command: "yarn play",
114112
url: "http://localhost:9999/",
115113
reuseExistingServer: !process.env["CI"],
116114
stdout: "pipe",

playwright/tests/changes/changes.spec.ts

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
import { CustomType } from "@prismicio/types-internal/lib/customtypes";
21
import { expect } from "@playwright/test";
32

43
import { test } from "../../fixtures";
54
import { generateLibraries, generateTypes } from "../../mocks";
5+
import { savePrismicAuthFile } from "../../utils/savePrismicAuthFile";
66

77
test("I cannot see the login screen when logged in", async ({
88
changesPage,
9-
procedures,
9+
userApiToken,
1010
}) => {
11-
procedures.mock("getState", ({ data }) => ({
12-
...(data as Record<string, unknown>),
13-
clientError: {
14-
clientError: undefined,
15-
},
16-
}));
11+
await savePrismicAuthFile(userApiToken);
1712

1813
await changesPage.goto();
1914
await expect(changesPage.loginButton).not.toBeVisible();
@@ -73,27 +68,26 @@ test("I can see the empty state when I don't have any changes to push", async ({
7368

7469
test("I can see the changes I have to push", async ({
7570
changesPage,
76-
procedures,
71+
reusablePageType,
72+
slice,
73+
userApiToken,
7774
}) => {
78-
const types = generateTypes({ typesCount: 1 });
79-
const customType = types[0] as CustomType;
80-
procedures.mock("getState", ({ data }) => ({
81-
...(data as Record<string, unknown>),
82-
libraries: generateLibraries({ slicesCount: 0 }),
83-
customTypes: types,
84-
remoteCustomTypes: [],
85-
remoteSlices: [],
86-
clientError: undefined,
87-
}));
75+
await savePrismicAuthFile(userApiToken);
8876

8977
await changesPage.goto();
9078
await expect(changesPage.loginButton).not.toBeVisible();
79+
80+
// Custom Type
9181
await changesPage.checkCustomTypeName(
92-
customType.id,
93-
customType.label as string,
82+
reusablePageType.id,
83+
reusablePageType.name,
9484
);
95-
await changesPage.checkCustomTypeApiId(customType.id);
96-
await changesPage.checkCustomTypeStatus(customType.id, "New");
85+
await changesPage.checkCustomTypeApiId(reusablePageType.id);
86+
await changesPage.checkCustomTypeStatus(reusablePageType.id, "New");
87+
88+
// Slice
89+
await changesPage.checkSliceName(slice.name);
90+
await changesPage.checkSliceStatus(slice.name, "New");
9791
});
9892

9993
test("I can update screenshots", async ({ changesPage, procedures, slice }) => {
@@ -116,22 +110,22 @@ test("I can update screenshots", async ({ changesPage, procedures, slice }) => {
116110
).not.toBeVisible();
117111
});
118112

119-
test("I can push the changes I have", async ({ changesPage, procedures }) => {
120-
procedures.mock("getState", ({ data }) => ({
121-
...(data as Record<string, unknown>),
122-
libraries: generateLibraries({ slicesCount: 0 }),
123-
customTypes: generateTypes({ typesCount: 1 }),
124-
remoteCustomTypes: [],
125-
remoteSlices: [],
126-
clientError: undefined,
127-
}));
128-
procedures.mock("prismicRepository.pushChanges", () => undefined, {
129-
execute: false,
130-
});
113+
test("I can push the changes I have", async ({
114+
changesPage,
115+
reusablePageType,
116+
slice,
117+
userApiToken,
118+
}) => {
119+
await savePrismicAuthFile(userApiToken);
131120

132121
await changesPage.goto();
133122
await expect(changesPage.loginButton).not.toBeVisible();
134123
await changesPage.pushChanges();
124+
125+
await expect(
126+
changesPage.getCustomType(reusablePageType.id),
127+
).not.toBeVisible();
128+
await expect(changesPage.getSliceCard(slice.name)).not.toBeVisible();
135129
});
136130

137131
test("I can see an error when the push failed", async ({

playwright/tests/common/environment.spec.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,39 @@ import { expect } from "@playwright/test";
33
import { test } from "../../fixtures";
44
import { environments } from "../../mocks";
55

6-
test("I can click on the text to log in", async ({ sliceMachinePage }) => {
6+
test("I can click on the text to log in", async ({
7+
sliceMachinePage,
8+
procedures,
9+
}) => {
10+
procedures.mock(
11+
"prismicRepository.fetchEnvironments",
12+
() => {
13+
const error = new Error();
14+
error.name = "SMUnauthenticatedError";
15+
throw error;
16+
},
17+
{ execute: false },
18+
);
19+
720
await sliceMachinePage.gotoDefaultPage();
821
await sliceMachinePage.menu.environmentSelector.loginTextButton.click();
922
await expect(sliceMachinePage.loginDialog.submitButton).toBeVisible();
1023
});
1124

12-
test("I can click on the icon to log in", async ({ sliceMachinePage }) => {
25+
test("I can click on the icon to log in", async ({
26+
sliceMachinePage,
27+
procedures,
28+
}) => {
29+
procedures.mock(
30+
"prismicRepository.fetchEnvironments",
31+
() => {
32+
const error = new Error();
33+
error.name = "SMUnauthenticatedError";
34+
throw error;
35+
},
36+
{ execute: false },
37+
);
38+
1339
await sliceMachinePage.gotoDefaultPage();
1440
await sliceMachinePage.menu.environmentSelector.loginIconButton.click();
1541
await expect(sliceMachinePage.loginDialog.submitButton).toBeVisible();

playwright/tests/common/navigation.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ test("I can navigate through all menu entries", async ({
5656
);
5757
});
5858

59-
test("I can access the repository using the open icon", async ({
59+
test.skip("I can access the repository using the open icon", async ({
6060
sliceMachinePage,
6161
procedures,
6262
}) => {

0 commit comments

Comments
 (0)