mirror of
https://github.com/elementor/hello-theme.git
synced 2026-08-01 16:00:20 +08:00
Some checks failed
Build / Build theme (push) Failing after 1s
Lint / ESLint (push) Failing after 0s
PHPUnit / File Diff (push) Failing after 1s
Lint / PHPCS (push) Failing after 41s
PHPUnit / PHPUnit - WordPress 6.8 - PHP version 7.4 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.9 - PHP version 7.4 (push) Has been skipped
PHPUnit / PHPUnit - WordPress latest - PHP version 7.4 (push) Has been skipped
PHPUnit / PHPUnit - WordPress nightly - PHP version 7.4 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.8 - PHP version 8.0 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.9 - PHP version 8.0 (push) Has been skipped
PHPUnit / PHPUnit - WordPress latest - PHP version 8.0 (push) Has been skipped
PHPUnit / PHPUnit - WordPress nightly - PHP version 8.0 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.8 - PHP version 8.1 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.9 - PHP version 8.1 (push) Has been skipped
PHPUnit / PHPUnit - WordPress latest - PHP version 8.1 (push) Has been skipped
PHPUnit / PHPUnit - WordPress nightly - PHP version 8.1 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.8 - PHP version 8.2 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.9 - PHP version 8.2 (push) Has been skipped
PHPUnit / PHPUnit - WordPress latest - PHP version 8.2 (push) Has been skipped
PHPUnit / PHPUnit - WordPress nightly - PHP version 8.2 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.8 - PHP version 8.3 (push) Has been skipped
PHPUnit / PHPUnit - WordPress 6.9 - PHP version 8.3 (push) Has been skipped
PHPUnit / PHPUnit - WordPress latest - PHP version 8.3 (push) Has been skipped
PHPUnit / PHPUnit - WordPress nightly - PHP version 8.3 (push) Has been skipped
PHPUnit / PHPUnit - Test Results (push) Successful in 2s
* Setup prettier * Fix lint/format issues
324 lines
7.2 KiB
TypeScript
324 lines
7.2 KiB
TypeScript
import fs from 'fs';
|
|
import { type APIRequestContext } from '@playwright/test';
|
|
import crypto from 'crypto';
|
|
import { Image, Post, WpPage, User } from '../types/types.ts';
|
|
|
|
export default class ApiRequests {
|
|
private readonly nonce: string;
|
|
private readonly baseUrl: string;
|
|
constructor(baseUrl: string, nonce: string) {
|
|
this.nonce = nonce;
|
|
this.baseUrl = baseUrl;
|
|
}
|
|
|
|
public async create(request: APIRequestContext, entity: string, data: Post) {
|
|
const response = await request.post(`${this.baseUrl}/index.php`, {
|
|
params: { rest_route: `/wp/v2/${entity}` },
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
multipart: data,
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to create a ${entity}: ${response.status()}.
|
|
${await response.text()}
|
|
${response.url()}
|
|
TEST_PARALLEL_INDEX: ${process.env.TEST_PARALLEL_INDEX}
|
|
NONCE: ${this.nonce}
|
|
`);
|
|
}
|
|
const { id } = await response.json();
|
|
|
|
return id;
|
|
}
|
|
|
|
public async createMedia(request: APIRequestContext, image: Image) {
|
|
const imagePath = image.filePath;
|
|
const response = await request.post(`${this.baseUrl}/index.php`, {
|
|
params: { rest_route: '/wp/v2/media' },
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
multipart: {
|
|
file: fs.createReadStream(imagePath),
|
|
title: image.title,
|
|
status: 'publish',
|
|
description: image.description,
|
|
altText: image.alt_text,
|
|
caption: image.caption,
|
|
},
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to create default media: ${response.status()}.
|
|
${await response.text()}
|
|
`);
|
|
}
|
|
|
|
const { id } = await response.json();
|
|
|
|
return id;
|
|
}
|
|
|
|
public async deleteMedia(request: APIRequestContext, ids: string[]) {
|
|
const requests = [];
|
|
|
|
for (const id in ids) {
|
|
requests.push(
|
|
request.delete(`${this.baseUrl}/index.php`, {
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
params: {
|
|
rest_route: `/wp/v2/media/${ids[id]}`,
|
|
force: 1,
|
|
},
|
|
}),
|
|
);
|
|
}
|
|
|
|
await Promise.all(requests);
|
|
}
|
|
|
|
public async cleanUpTestPages(
|
|
request: APIRequestContext,
|
|
shouldDeleteAllPages = false,
|
|
) {
|
|
const pagesPublished = await this.getPages(request),
|
|
pagesDraft = await this.getPages(request, 'draft'),
|
|
pages = [...pagesPublished, ...pagesDraft];
|
|
|
|
const pageIds = pages
|
|
.filter(
|
|
(page: WpPage) =>
|
|
shouldDeleteAllPages ||
|
|
page.title.rendered.includes('Playwright Test Page'),
|
|
)
|
|
.map((page: WpPage) => page.id);
|
|
|
|
for (const id of pageIds) {
|
|
await this.deletePage(request, id);
|
|
}
|
|
}
|
|
|
|
public async installPlugin(
|
|
request: APIRequestContext,
|
|
slug: string,
|
|
active: boolean,
|
|
) {
|
|
const response = await request.post(`${this.baseUrl}/index.php`, {
|
|
params: {
|
|
rest_route: `/wp/v2/plugins`,
|
|
slug,
|
|
status: active ? 'active' : 'inactive',
|
|
},
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to install a plugin: ${response ? response.status() : '<no status>'}.
|
|
${response ? await response.text() : '<no response>'}
|
|
slug: ${slug}
|
|
`);
|
|
}
|
|
const { plugin } = await response.json();
|
|
|
|
return plugin;
|
|
}
|
|
|
|
public async deactivatePlugin(request: APIRequestContext, slug: string) {
|
|
const response = await request.post(`${this.baseUrl}/index.php`, {
|
|
params: {
|
|
rest_route: `/wp/v2/plugins/${slug}`,
|
|
status: 'inactive',
|
|
},
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
});
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to deactivate a plugin: ${response ? response.status() : '<no status>'}.
|
|
${response ? await response.text() : '<no response>'}
|
|
slug: ${slug}
|
|
`);
|
|
}
|
|
}
|
|
|
|
public async deletePlugin(request: APIRequestContext, slug: string) {
|
|
const response = await this._delete(request, 'plugins', slug);
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to delete a plugin: ${response ? response.status() : '<no status>'}.
|
|
${response ? await response.text() : '<no response>'}
|
|
slug: ${slug}
|
|
`);
|
|
}
|
|
}
|
|
|
|
public async getTheme(
|
|
request: APIRequestContext,
|
|
status?: 'active' | 'inactive',
|
|
) {
|
|
return await this.get(request, 'themes', status);
|
|
}
|
|
|
|
public async customGet(
|
|
request: APIRequestContext,
|
|
restRoute: string,
|
|
multipart?,
|
|
) {
|
|
const response = await request.get(`${this.baseUrl}/${restRoute}`, {
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
multipart,
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to get from ${restRoute}: ${response.status()}.
|
|
${this.baseUrl}
|
|
`);
|
|
}
|
|
|
|
return await response.json();
|
|
}
|
|
|
|
public async customPut(request: APIRequestContext, restRoute: string, data) {
|
|
const response = await request.put(`${this.baseUrl}/${restRoute}`, {
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
data,
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to put to ${restRoute}: ${response.status()}.
|
|
${await response.text()}
|
|
`);
|
|
}
|
|
}
|
|
|
|
private async get(
|
|
request: APIRequestContext,
|
|
entity: string,
|
|
status: string = 'publish',
|
|
) {
|
|
const response = await request.get(`${this.baseUrl}/index.php`, {
|
|
params: {
|
|
rest_route: `/wp/v2/${entity}`,
|
|
status,
|
|
},
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to get a ${entity}: ${response.status()}.
|
|
${await response.text()}
|
|
`);
|
|
}
|
|
|
|
return await response.json();
|
|
}
|
|
|
|
private async getPages(
|
|
request: APIRequestContext,
|
|
status: string = 'publish',
|
|
) {
|
|
return await this.get(request, 'pages', status);
|
|
}
|
|
|
|
private async deletePage(request: APIRequestContext, pageId: string) {
|
|
await this._delete(request, 'pages', pageId);
|
|
}
|
|
|
|
public async deleteUser(request: APIRequestContext, userId: string) {
|
|
const response = await request.delete(`${this.baseUrl}/index.php`, {
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
params: {
|
|
rest_route: `/wp/v2/users/${userId}`,
|
|
force: true,
|
|
reassign: '-1',
|
|
},
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to delete a user with id: ${userId}: ${response.status()}.
|
|
${await response.text()}
|
|
`);
|
|
}
|
|
|
|
return await response.json();
|
|
}
|
|
|
|
private async _delete(
|
|
request: APIRequestContext,
|
|
entity: string,
|
|
id: string,
|
|
) {
|
|
const response = await request.delete(`${this.baseUrl}/index.php`, {
|
|
params: {
|
|
rest_route: `/wp/v2/${entity}/${id}`,
|
|
},
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to delete a ${entity} with id '${id}': ${response.status()}.
|
|
${await response.text()}
|
|
`);
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
public async createNewUser(request: APIRequestContext, user: User) {
|
|
const randomNumber = crypto.randomInt(0, 1000);
|
|
const username = `${user.username}${randomNumber}`,
|
|
email = user.email || username + '@example.com',
|
|
password = user.password || 'password',
|
|
roles = user.roles;
|
|
|
|
const response = await request.post(`${this.baseUrl}/index.php`, {
|
|
params: { rest_route: '/wp/v2/users' },
|
|
headers: {
|
|
'X-WP-Nonce': this.nonce,
|
|
},
|
|
multipart: {
|
|
username,
|
|
email,
|
|
password,
|
|
roles: [...roles],
|
|
},
|
|
});
|
|
|
|
if (!response.ok()) {
|
|
throw new Error(`
|
|
Failed to create new user: ${response.status()}.
|
|
${await response.text()}
|
|
`);
|
|
}
|
|
|
|
const { id } = await response.json();
|
|
|
|
return { id, username, password };
|
|
}
|
|
}
|