Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import {
codeInjectionHeadLabel,
codeInjectionPageFootLabel,
codeInjectionPageHeadLabel,
settingsCodeInjectionBackButton,
settingsCodeInjectionRow,
} from '@tryghost/test-data/selectors/editor';

import {
Expand Down Expand Up @@ -34,8 +36,6 @@ const PAGE_ROUTE = new RegExp(`^/pages/${POST_ID}/\\?`);
// The panel's own width, and the width the wide pane widens it to.
const PANEL_WIDTH = 350;
const WIDE_PANEL_WIDTH = 500;
const BACK_LABEL = 'Close code injection panel';
const ROW_LABEL = 'Code injection';

const POLL = { timeout: 10_000 };

Expand Down Expand Up @@ -102,7 +102,7 @@ function footEditor() {
async function openCodeInjection() {
await editorScreen.settingsToggle().click();
await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await editorScreen.settingsSubviewRow(ROW_LABEL).click();
await editorScreen.settingsSubviewRow(settingsCodeInjectionRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
await expect.element(headEditor()).toBeVisible();
await expect.element(footEditor()).toBeVisible();
Expand Down Expand Up @@ -138,11 +138,11 @@ describe('Post settings code injection', () => {
await expect(editorScreen.settingsExcerpt()).toHaveCount(0);
expect(sidebarWidthPx()).toBe(WIDE_PANEL_WIDTH);

await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsCodeInjectionBackButton).click();

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsExcerpt()).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(ROW_LABEL)).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsCodeInjectionRow)).toBeVisible();
// The panel goes back to the width the section list is shown at.
await expect.poll(sidebarWidthPx).toBe(PANEL_WIDTH);
});
Expand All @@ -153,11 +153,13 @@ describe('Post settings code injection', () => {
await openCodeInjection();

// Opening a pane leaves the writer on its back button.
await expect.element(editorScreen.settingsSubviewBack(BACK_LABEL)).toHaveFocus();
await expect
.element(editorScreen.settingsSubviewBack(settingsCodeInjectionBackButton))
.toHaveFocus();
await userEvent.keyboard('{Escape}');

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsSubviewRow(ROW_LABEL)).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsCodeInjectionRow)).toBeVisible();
});

it('keeps the pane open on Escape inside an editor', async () => {
Expand Down Expand Up @@ -196,7 +198,7 @@ describe('Post settings code injection', () => {
await renderAdminApp(`/editor/page/${POST_ID}`, FLAG_ON);
await editorScreen.settingsToggle().click();
await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await editorScreen.settingsSubviewRow(ROW_LABEL).click();
await editorScreen.settingsSubviewRow(settingsCodeInjectionRow).click();

await expect
.element(editorScreen.settingsCodeInjection(codeInjectionPageHeadLabel))
Expand Down Expand Up @@ -274,14 +276,14 @@ describe('Post settings code injection', () => {

await typeInto(headEditor(), '<script>onClose();</script>');
await expect.element(headEditor()).toHaveFocus();
await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsCodeInjectionBackButton).click();

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect(saveApi).toHaveSavedFields({
codeinjection_head: '<script>onClose();</script>',
});

await editorScreen.settingsSubviewRow(ROW_LABEL).click();
await editorScreen.settingsSubviewRow(settingsCodeInjectionRow).click();
await expect.element(headEditor()).toHaveTextContent('<script>onClose();</script>');
});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { describe, expect, it } from 'vitest';
import { userEvent } from 'vitest/browser';
import {
settingsFacebookCardBackButton,
settingsFacebookCardRow,
} from '@tryghost/test-data/selectors/editor';

import {
UNSPLASH_PICKED,
Expand All @@ -25,7 +29,6 @@ const POST_ID = 'abc123';
const CURRENT_USER_ID = '1';
const FLAG_ON = withoutAutosave({ labs: { editorReact: true } });
const PUBLISHED_AT = '2025-12-01T10:00:00.000Z';
const BACK_LABEL = 'Close Facebook card panel';
const UPLOADED = 'https://example.com/content/images/2026/09/hills.png';
const FEATURE = 'https://example.com/content/images/2026/09/coast.png';
// The site fixture's own description, which the card falls back to last.
Expand Down Expand Up @@ -69,7 +72,7 @@ function fakeSavablePost(overrides: Partial<SavedPost> = {}) {
async function openFacebookCard() {
await editorScreen.settingsToggle().click();
await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await editorScreen.settingsSubviewRow('Facebook card').click();
await editorScreen.settingsSubviewRow(settingsFacebookCardRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
}

Expand Down Expand Up @@ -105,9 +108,9 @@ describe('Post settings Facebook card', () => {
);
await expect.poll(() => uploadApi.requests.length, POLL).toBe(1);
await expect.element(editorScreen.settingsFacebookImageInput()).toBeDisabled();
await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsFacebookCardBackButton).click();
await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await editorScreen.settingsSubviewRow('Facebook card').click();
await editorScreen.settingsSubviewRow(settingsFacebookCardRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
await expect.element(editorScreen.settingsFacebookImageInput()).toBeDisabled();
await expect.element(editorScreen.settingsFacebookImageUnsplashButton()).toBeDisabled();
Expand Down Expand Up @@ -136,13 +139,13 @@ describe('Post settings Facebook card', () => {
await expect.element(editorScreen.settingsFacebookTitle()).toBeVisible();
await expect
.element(editorScreen.settingsSidebar())
.toHaveAttribute('aria-label', 'Facebook card');
.toHaveAttribute('aria-label', settingsFacebookCardRow);

await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsFacebookCardBackButton).click();

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsExcerpt()).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow('Facebook card')).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsFacebookCardRow)).toBeVisible();
});

it('saves an uploaded Facebook image as soon as it lands', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { describe, expect, it, onTestFinished } from 'vitest';
import { page, userEvent } from 'vitest/browser';
import { buildLexicalParagraph } from '@tryghost/test-data';
import {
settingsKeyboardShortcutsBackButton,
settingsKeyboardShortcutsRow,
} from '@tryghost/test-data/selectors/editor';

import {
currentUserResponse,
Expand All @@ -18,8 +22,6 @@ const POST_ID = 'abc123';
const CURRENT_USER_ID = '1';
const FLAG_ON = { labs: { editorReact: true } };
const ROUTE = new RegExp(`^/posts/${POST_ID}/\\?`);
const BACK_LABEL = 'Close keyboard shortcuts panel';
const ROW_LABEL = 'Keyboard shortcuts';
const MAC_AGENT =
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
const WINDOWS_AGENT =
Expand Down Expand Up @@ -63,7 +65,7 @@ function fakeEditablePost(overrides: Partial<ReturnType<typeof post>> = {}) {
async function openShortcuts() {
await editorScreen.settingsToggle().click();
await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await editorScreen.settingsSubviewRow(ROW_LABEL).click();
await editorScreen.settingsSubviewRow(settingsKeyboardShortcutsRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
}

Expand All @@ -79,14 +81,20 @@ describe('Post settings keyboard shortcuts', () => {

// The pane replaces the list it was opened from.
await expect(editorScreen.settingsExcerpt()).toHaveCount(0);
await expect.element(editorScreen.settingsSidebar()).toHaveAttribute('aria-label', ROW_LABEL);
await expect.element(page.getByRole('heading', { level: 2, name: ROW_LABEL })).toBeVisible();
await expect
.element(editorScreen.settingsSidebar())
.toHaveAttribute('aria-label', settingsKeyboardShortcutsRow);
await expect
.element(page.getByRole('heading', { level: 2, name: settingsKeyboardShortcutsRow }))
.toBeVisible();

await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsKeyboardShortcutsBackButton).click();

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsExcerpt()).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(ROW_LABEL)).toBeVisible();
await expect
.element(editorScreen.settingsSubviewRow(settingsKeyboardShortcutsRow))
.toBeVisible();
});

it('lists every shortcut under the group it belongs to, without widening the panel', async () => {
Expand Down Expand Up @@ -156,7 +164,9 @@ describe('Post settings keyboard shortcuts', () => {
await userEvent.keyboard('{Escape}');

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsSubviewRow(ROW_LABEL)).toHaveFocus();
await expect
.element(editorScreen.settingsSubviewRow(settingsKeyboardShortcutsRow))
.toHaveFocus();
});

it('gives a contributor the same reference list', async () => {
Expand Down
40 changes: 27 additions & 13 deletions apps/admin/src/editor/editor-settings-meta-data.acceptance.test.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { describe, expect, it } from 'vitest';
import { page, userEvent } from 'vitest/browser';
import {
settingsMetaDataBackButton,
settingsMetaDataRow,
} from '@tryghost/test-data/selectors/editor';

import {
currentUserResponse,
Expand All @@ -22,7 +26,6 @@ const POST_ID = 'abc123';
const CURRENT_USER_ID = '1';
const FLAG_ON = withoutAutosave({ labs: { editorReact: true } });
const PUBLISHED_AT = '2025-12-01T10:00:00.000Z';
const BACK_LABEL = 'Close meta data panel';
const PLACEHOLDER =
'Search engines will automatically show a custom preview of content related to the search term here if no custom meta description is set.';

Expand Down Expand Up @@ -59,7 +62,7 @@ function fakeSavablePost(overrides: Partial<SavedPost> = {}) {
async function openMetaData() {
await editorScreen.settingsToggle().click();
await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await editorScreen.settingsSubviewRow('Meta data').click();
await editorScreen.settingsSubviewRow(settingsMetaDataRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
}

Expand All @@ -82,20 +85,24 @@ describe('Post settings meta data', () => {
await expect(editorScreen.settingsExcerpt()).toHaveCount(0);
await expect.element(editorScreen.settingsMetaTitle()).toBeVisible();

await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsMetaDataBackButton).click();

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsExcerpt()).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow('Meta data')).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsMetaDataRow)).toBeVisible();
});

it('names the panel after the pane it is showing', async () => {
fakeSavablePost();
await renderAdminApp(`/editor/post/${POST_ID}`, FLAG_ON);
await openMetaData();

await expect.element(editorScreen.settingsSidebar()).toHaveAttribute('aria-label', 'Meta data');
await expect.element(page.getByRole('heading', { level: 2, name: 'Meta data' })).toBeVisible();
await expect
.element(editorScreen.settingsSidebar())
.toHaveAttribute('aria-label', settingsMetaDataRow);
await expect
.element(page.getByRole('heading', { level: 2, name: settingsMetaDataRow }))
.toBeVisible();
});

it('closes the pane on Escape', async () => {
Expand All @@ -106,7 +113,7 @@ describe('Post settings meta data', () => {
await userEvent.keyboard('{Escape}');

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsSubviewRow('Meta data')).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsMetaDataRow)).toBeVisible();
});

it('leaves the pane open for an Escape the preview has already answered', async () => {
Expand Down Expand Up @@ -138,7 +145,7 @@ describe('Post settings meta data', () => {
await userEvent.keyboard('{Escape}');

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsSubviewRow('Meta data')).toHaveFocus();
await expect.element(editorScreen.settingsSubviewRow(settingsMetaDataRow)).toHaveFocus();
await expect(saveApi).toHaveSavedFields({
[`meta_${field}`]: 'Saved when the pane closes',
});
Expand All @@ -151,14 +158,21 @@ describe('Post settings meta data', () => {
await openMetaData();

await expect
.poll(() => document.activeElement === editorScreen.settingsSubviewBack(BACK_LABEL).element())
.poll(
() =>
document.activeElement ===
editorScreen.settingsSubviewBack(settingsMetaDataBackButton).element(),
)
.toBe(true);

await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsMetaDataBackButton).click();

await expect.element(editorScreen.settingsSubviewRow('Meta data')).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsMetaDataRow)).toBeVisible();
await expect
.poll(() => document.activeElement === editorScreen.settingsSubviewRow('Meta data').element())
.poll(
() =>
document.activeElement === editorScreen.settingsSubviewRow(settingsMetaDataRow).element(),
)
.toBe(true);
});

Expand All @@ -173,7 +187,7 @@ describe('Post settings meta data', () => {

await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsSubviewRow('Meta data')).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsMetaDataRow)).toBeVisible();
});

it('persists a draft’s meta title and description on the blur that ends each edit', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest';
import { userEvent } from 'vitest/browser';
import { buildLexicalParagraph } from '@tryghost/test-data';
import { settingsTagsCreateText } from '@tryghost/test-data/selectors/editor';

import {
currentUserResponse,
Expand Down Expand Up @@ -185,7 +186,7 @@ describe('Post settings tags', () => {
await openTagList();

await editorScreen.settingsTagsInput().fill('Culture');
await editorScreen.settingsTagOption('Create “Culture”').click();
await editorScreen.settingsTagOption(`${settingsTagsCreateText} “Culture”`).click();

await expect.poll(() => saveApi.requests.length, POLL).toBe(1);
// Named, not created first: an abandoned edit leaves no stray tag behind.
Expand Down Expand Up @@ -252,7 +253,9 @@ describe('Post settings tags', () => {

// A comma is an ordinary character in a tag name, not a separator.
await editorScreen.settingsTagsInput().fill('Arts, Culture');
await expect.element(editorScreen.settingsTagOption(/Create/)).toBeVisible();
await expect
.element(editorScreen.settingsTagOption(new RegExp(settingsTagsCreateText)))
.toBeVisible();
await userEvent.keyboard('{Tab}');

await expect.poll(() => saveApi.requests.length, POLL).toBe(1);
Expand Down
12 changes: 6 additions & 6 deletions apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { describe, expect, it } from 'vitest';
import { page, userEvent } from 'vitest/browser';
import { settingsXCardBackButton, settingsXCardRow } from '@tryghost/test-data/selectors/editor';

import {
UNSPLASH_PICKED,
Expand All @@ -25,7 +26,6 @@ const POST_ID = 'abc123';
const CURRENT_USER_ID = '1';
const FLAG_ON = withoutAutosave({ labs: { editorReact: true } });
const PUBLISHED_AT = '2025-12-01T10:00:00.000Z';
const BACK_LABEL = 'Close X card panel';
const UPLOADED = 'https://example.com/content/images/2026/09/hills.png';
const FEATURE = 'https://example.com/content/images/2026/09/coast.png';
// The site fixture's own description, which the card falls back to last.
Expand Down Expand Up @@ -75,7 +75,7 @@ function fakeImageUpload() {
async function openXCard() {
await editorScreen.settingsToggle().click();
await expect.element(editorScreen.settingsSidebar()).toBeVisible();
await editorScreen.settingsSubviewRow('X card').click();
await editorScreen.settingsSubviewRow(settingsXCardRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
}

Expand Down Expand Up @@ -111,9 +111,9 @@ describe('Post settings X card', () => {
);
await expect.poll(() => uploadApi.requests.length, POLL).toBe(1);
await expect.element(editorScreen.settingsXImageInput()).toBeDisabled();
await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsXCardBackButton).click();
await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await editorScreen.settingsSubviewRow('X card').click();
await editorScreen.settingsSubviewRow(settingsXCardRow).click();
await expect.element(editorScreen.settingsSubviewPane()).toBeVisible();
await expect.element(editorScreen.settingsXImageInput()).toBeDisabled();
await expect.element(editorScreen.settingsXImageUnsplashButton()).toBeDisabled();
Expand Down Expand Up @@ -143,11 +143,11 @@ describe('Post settings X card', () => {
await expect.element(editorScreen.settingsXDescription()).toBeVisible();
await expect.element(editorScreen.settingsXImage()).toBeVisible();

await editorScreen.settingsSubviewBack(BACK_LABEL).click();
await editorScreen.settingsSubviewBack(settingsXCardBackButton).click();

await expect(editorScreen.settingsSubviewPane()).toHaveCount(0);
await expect.element(editorScreen.settingsExcerpt()).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow('X card')).toBeVisible();
await expect.element(editorScreen.settingsSubviewRow(settingsXCardRow)).toBeVisible();
});

it('saves an uploaded X image as soon as it lands', async () => {
Expand Down
Loading
Loading