Skip to content

Commit 8dd1ac7

Browse files
committed
test: remove automatic logout for all tests
1 parent d10835b commit 8dd1ac7

7 files changed

Lines changed: 144 additions & 72 deletions

File tree

playwright/fixtures/index.ts

Lines changed: 71 additions & 27 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 {
@@ -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 };
@@ -112,55 +109,95 @@ export const test = baseTest.extend<Options & Fixtures>({
112109
/**
113110
* Data
114111
*/
115-
reusablePageType: async ({ pageTypesTablePage }, use) => {
112+
reusablePageType: async ({ pageTypesTablePage, manager }, use) => {
116113
await pageTypesTablePage.goto();
117114
await pageTypesTablePage.openCreateDialog();
118115

119-
const pageTypeName = "Page Type " + generateRandomId();
116+
const uuid = generateRandomId();
117+
const pageTypeName = "Page Type " + uuid;
118+
const pageTypeID = `page_type_${uuid}`;
120119
await pageTypesTablePage.createTypeDialog.createType(
121120
pageTypeName,
122121
"reusable",
123122
);
124123

125-
await use({ name: pageTypeName });
124+
await use({ name: pageTypeName, id: pageTypeID });
125+
126+
try {
127+
await manager.customTypes.deleteCustomType({
128+
id: pageTypeID,
129+
});
130+
} catch (_) {
131+
// noop - the page type is already deleted
132+
}
126133
},
127-
singlePageType: async ({ pageTypesTablePage }, use) => {
134+
singlePageType: async ({ pageTypesTablePage, manager }, use) => {
128135
await pageTypesTablePage.goto();
129136
await pageTypesTablePage.openCreateDialog();
130137

131-
const pageTypeName = "Page Type " + generateRandomId();
138+
const uuid = generateRandomId();
139+
const pageTypeName = "Page Type " + uuid;
140+
const pageTypeID = `page_type_${uuid}`;
132141
await pageTypesTablePage.createTypeDialog.createType(
133142
pageTypeName,
134143
"single",
135144
);
136145

137-
await use({ name: pageTypeName });
146+
await use({ name: pageTypeName, id: pageTypeID });
147+
148+
try {
149+
await manager.customTypes.deleteCustomType({
150+
id: pageTypeID,
151+
});
152+
} catch (_) {
153+
// noop - the page type is already deleted
154+
}
138155
},
139-
reusableCustomType: async ({ customTypesTablePage }, use) => {
156+
reusableCustomType: async ({ customTypesTablePage, manager }, use) => {
140157
await customTypesTablePage.goto();
141158
await customTypesTablePage.openCreateDialog();
142159

143-
const customTypeName = "Custom Type " + generateRandomId();
160+
const uuid = generateRandomId();
161+
const customTypeName = "Custom Type " + uuid;
162+
const customTypeID = `custom_type_${uuid}`;
144163
await customTypesTablePage.createTypeDialog.createType(
145164
customTypeName,
146165
"reusable",
147166
);
148167

149-
await use({ name: customTypeName });
168+
await use({ name: customTypeName, id: customTypeID });
169+
170+
try {
171+
await manager.customTypes.deleteCustomType({
172+
id: customTypeID,
173+
});
174+
} catch (_) {
175+
// noop - the custom type is already deleted
176+
}
150177
},
151-
singleCustomType: async ({ customTypesTablePage }, use) => {
178+
singleCustomType: async ({ customTypesTablePage, manager }, use) => {
152179
await customTypesTablePage.goto();
153180
await customTypesTablePage.openCreateDialog();
154181

155-
const customTypeName = "Custom Type " + generateRandomId();
182+
const uuid = generateRandomId();
183+
const customTypeName = "Custom Type " + uuid;
184+
const customTypeID = `custom_type_${uuid}`;
156185
await customTypesTablePage.createTypeDialog.createType(
157186
customTypeName,
158187
"single",
159188
);
160189

161-
await use({ name: customTypeName });
190+
await use({ name: customTypeName, id: customTypeID });
191+
192+
try {
193+
await manager.customTypes.deleteCustomType({
194+
id: customTypeID,
195+
});
196+
} catch (_) {
197+
// noop - the custom type is already deleted
198+
}
162199
},
163-
slice: async ({ slicesListPage }, use) => {
200+
slice: async ({ slicesListPage, firstSliceLibrary, manager }, use) => {
164201
await slicesListPage.goto();
165202
await expect(slicesListPage.breadcrumbLabel).toBeVisible();
166203
await slicesListPage.addSliceDropdown.click();
@@ -170,6 +207,15 @@ export const test = baseTest.extend<Options & Fixtures>({
170207
await slicesListPage.createSliceDialog.createSlice(sliceName);
171208

172209
await use({ name: sliceName });
210+
211+
try {
212+
await manager.slices.deleteSlice({
213+
libraryID: firstSliceLibrary.id,
214+
sliceID: sliceName.toLowerCase(),
215+
});
216+
} catch (_) {
217+
// noop - the slice is already deleted
218+
}
173219
},
174220
repeatableZoneSlice: async ({ firstSliceLibrary, manager }, use) => {
175221
const sliceName = "Slice" + generateRandomId();
@@ -196,6 +242,11 @@ export const test = baseTest.extend<Options & Fixtures>({
196242
});
197243

198244
await use({ name: model.name });
245+
246+
await manager.slices.deleteSlice({
247+
libraryID: firstSliceLibrary.id,
248+
sliceID: model.id,
249+
});
199250
},
200251
firstSliceLibrary: async ({ manager }, use) => {
201252
const config = await manager.project.getSliceMachineConfig();
@@ -280,13 +331,6 @@ export const test = baseTest.extend<Options & Fixtures>({
280331
const newContext = await browser.newContext({ storageState });
281332
const page = await newContext.newPage();
282333

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-
290334
// Propagate the modified page to the test
291335
await use(page);
292336

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: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
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";
65

76
test("I cannot see the login screen when logged in", async ({
87
changesPage,
9-
procedures,
108
}) => {
11-
procedures.mock("getState", ({ data }) => ({
12-
...(data as Record<string, unknown>),
13-
clientError: {
14-
clientError: undefined,
15-
},
16-
}));
17-
189
await changesPage.goto();
1910
await expect(changesPage.loginButton).not.toBeVisible();
2011
await expect(changesPage.notLoggedInTitle).not.toBeVisible();
@@ -73,27 +64,23 @@ test("I can see the empty state when I don't have any changes to push", async ({
7364

7465
test("I can see the changes I have to push", async ({
7566
changesPage,
76-
procedures,
67+
reusablePageType,
68+
slice,
7769
}) => {
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-
}));
88-
8970
await changesPage.goto();
9071
await expect(changesPage.loginButton).not.toBeVisible();
72+
73+
// Custom Type
9174
await changesPage.checkCustomTypeName(
92-
customType.id,
93-
customType.label as string,
75+
reusablePageType.id,
76+
reusablePageType.name,
9477
);
95-
await changesPage.checkCustomTypeApiId(customType.id);
96-
await changesPage.checkCustomTypeStatus(customType.id, "New");
78+
await changesPage.checkCustomTypeApiId(reusablePageType.id);
79+
await changesPage.checkCustomTypeStatus(reusablePageType.id, "New");
80+
81+
// Slice
82+
await changesPage.checkSliceName(slice.name);
83+
await changesPage.checkSliceStatus(slice.name, "New");
9784
});
9885

9986
test("I can update screenshots", async ({ changesPage, procedures, slice }) => {
@@ -116,22 +103,19 @@ test("I can update screenshots", async ({ changesPage, procedures, slice }) => {
116103
).not.toBeVisible();
117104
});
118105

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-
});
131-
106+
test("I can push the changes I have", async ({
107+
changesPage,
108+
reusablePageType,
109+
slice,
110+
}) => {
132111
await changesPage.goto();
133112
await expect(changesPage.loginButton).not.toBeVisible();
134113
await changesPage.pushChanges();
114+
115+
await expect(
116+
changesPage.getCustomType(reusablePageType.id),
117+
).not.toBeVisible();
118+
await expect(changesPage.getSliceCard(slice.name)).not.toBeVisible();
135119
});
136120

137121
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
}) => {

scripts/play.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ Arguments:
142142

143143
let [playgroundName] = args._;
144144
const didProvidePlaygroundName = Boolean(playgroundName);
145+
let usedExistingPlayground = false;
145146

146147
if (!playgroundName) {
147148
if (args.new) {
@@ -151,11 +152,12 @@ Arguments:
151152
PLAYGROUNDS_ROOT,
152153
{ dirOnly: true, exclude: [".yarn", "node_modules"] },
153154
);
155+
usedExistingPlayground = Boolean(mostRecentPlaygroundName);
154156
playgroundName = mostRecentPlaygroundName ?? createRandomName();
155157
}
156158
}
157159

158-
if (!playgroundName.startsWith(args.prefix)) {
160+
if (!usedExistingPlayground && !playgroundName.startsWith(args.prefix)) {
159161
playgroundName = `${args.prefix}${playgroundName}`;
160162
}
161163

0 commit comments

Comments
 (0)