import {ElementHandle, expect, test} from '@playwright/test';
import {globalDataRequests} from '../../utils/acceptance';
import {mockApi, mockSitePreview, responseFixtures} from '@tryghost/admin-x-framework/test/acceptance';
test.describe('Announcement Bar', async () => {
test('Working with the announcement bar preview', async ({page}) => {
await mockApi({page, requests: {
...globalDataRequests,
browseLatestPost: {method: 'GET', path: /^\/posts\/.+limit=1/, response: responseFixtures.latestPost}
}});
await mockSitePreview({
page,
url: responseFixtures.site.site.url,
response: '
homepage preview
'
});
await mockSitePreview({
page,
url: responseFixtures.latestPost.posts[0].url,
response: 'post preview
'
});
await page.goto('/');
const section = page.getByTestId('announcement-bar');
await section.getByRole('button', {name: 'Customize'}).click();
await page.waitForSelector('[data-testid="announcement-bar-preview-iframe"]');
const checkTextInIframes = async (iframesHandles: ElementHandle[], textToSearch: string) => {
let textExists = false;
for (const iframeHandle of iframesHandles) {
const frame = await iframeHandle.contentFrame();
const textFound = await frame?.$eval('body', (body, text) => {
return body.innerText.includes(text);
}, textToSearch);
if (textFound) {
textExists = true;
break;
}
}
return textExists;
};
const iframesHandleHome = await page.$$('[data-testid="announcement-bar-preview-iframe"] > iframe');
const textExistsInHomeIframes = await checkTextInIframes(iframesHandleHome, 'homepage preview');
await expect(textExistsInHomeIframes).toBeTruthy();
const modal = page.getByTestId('announcement-bar-modal');
await modal.getByTestId('design-toolbar').getByRole('tab', {name: 'Post'}).click();
await page.waitForSelector('[data-testid="announcement-bar-preview-iframe"]');
const iframesHandlePost = await page.$$('[data-testid="announcement-bar-preview-iframe"] > iframe');
const textExistsInPostIframes = await checkTextInIframes(iframesHandlePost, 'post preview');
expect(textExistsInPostIframes).toBeTruthy();
});
// TODO - lexical isn't loading in the preview
// test('Editing announcement bar text content', async ({page}) => {
// await mockApi({page, requests: {
// ...globalDataRequests,
// editSettings: {method: 'PUT', path: '/settings/', response: responseFixtures.settings}
// }});
// await mockSitePreview({
// page,
// url: responseFixtures.site.site.url,
// response: 'homepage preview
'
// });
// await page.goto('/');
// const section = page.getByTestId('announcement-bar');
// await section.getByRole('button', {name: 'Customize'}).click();
// const modal = page.getByTestId('announcement-bar-modal');
// await expect(modal.frameLocator('[data-testid="announcement-bar-preview"]').getByText('homepage preview')).toHaveCount(1);
// });
test('Can toggle colours', async ({page}) => {
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
editSettings: {method: 'PUT', path: '/settings/', response: responseFixtures.settings}
}});
// find label background color
await page.goto('/');
const section = page.getByTestId('announcement-bar');
await section.getByRole('button', {name: 'Customize'}).click();
const labelElement = page.locator('label:text("Background color")');
await expect(labelElement).toHaveCount(1);
const modal = page.getByTestId('announcement-bar-modal');
// Check the titles of the buttons.
// Get the parent div of the label
const parentDiv = labelElement.locator('..');
// Then get the div that follows the label within the parent div
const buttonContainer = parentDiv.locator('div');
const darkButton = buttonContainer.locator('button[title="Dark"]');
const lightButton = buttonContainer.locator('button[title="Light"]');
const accentButton = buttonContainer.locator('button[title="Accent"]');
await expect(darkButton).toHaveCount(1);
await expect(lightButton).toHaveCount(1);
await expect(accentButton).toHaveCount(1);
await lightButton?.click();
await modal.getByRole('button', {name: 'Save'}).click();
expect(lastApiRequests.editSettings?.body).toEqual({
settings: [
{key: 'announcement_background', value: 'light'}
]
});
});
test('Can toggle visibility', async ({page}) => {
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
editSettings: {method: 'PUT', path: '/settings/', response: responseFixtures.settings}
}});
// find label background color
await page.goto('/');
const section = page.getByTestId('announcement-bar');
await section.getByRole('button', {name: 'Customize'}).click();
const labelElement = page.locator('h6:text("Visibility")');
await expect(labelElement).toHaveCount(1);
const modal = page.getByTestId('announcement-bar-modal');
// get checkbox input with value of free_members
const checkbox = await page.$('input[value="free_members"]');
expect(checkbox).not.toBeNull();
await checkbox?.check();
await modal.getByRole('button', {name: 'Save'}).click();
// Note - the value is a stringified array
expect(lastApiRequests.editSettings?.body).toEqual({
settings: [
{key: 'announcement_visibility', value: '["free_members"]'}
]
});
});
});