0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00
ghost/apps/admin-x-settings/test/e2e/email/newsletters.test.ts
Jono M 07f1ae06c8
Fixed low-hanging fruit in AdminX (#18061)
refs https://github.com/TryGhost/Product/issues/3832

- Fixed code editor horizontal scroll
- Fixed toggle setting initial value in theme settings
- Prevented locking site without a password
- Updated to hide Pintura settings when config is set
- Updated mailgun settings to show only if not in server config
- Updated Pintura settings to hide banner when in server config
- Fixed body font category not updating in newsletter preview
- Fixed external images not loading when hosted
- Added character count to user bio
- Updated to scroll up when searching
- Fixed code editor not working with null value
- Improved form error messages
2023-09-11 12:49:45 +01:00

221 lines
9.4 KiB
TypeScript

import {expect, test} from '@playwright/test';
import {globalDataRequests, limitRequests, mockApi, responseFixtures} from '../../utils/e2e';
test.describe('Newsletter settings', async () => {
test('Supports creating a new newsletter', async ({page}) => {
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=all', response: responseFixtures.newsletters},
addNewsletter: {method: 'POST', path: '/newsletters/?opt_in_existing=true&include=count.active_members%2Ccount.posts', response: {newsletters: [{
id: 'new-newsletter',
name: 'New newsletter',
description: null,
count: {
active_members: 0,
posts: 0
}
}]}}
}});
await page.goto('/');
const section = page.getByTestId('newsletters');
await section.getByRole('button', {name: 'Add newsletter'}).click();
const modal = page.getByTestId('add-newsletter-modal');
await modal.getByRole('button', {name: 'Create'}).click();
await expect(page.getByTestId('toast')).toHaveText(/Can't save newsletter/);
await expect(modal).toHaveText(/Please enter a name/);
// Shouldn't be necessary, but without these Playwright doesn't click Create the second time for some reason
await modal.getByRole('button', {name: 'Cancel'}).click();
await section.getByRole('button', {name: 'Add newsletter'}).click();
await modal.getByLabel('Name').fill('New newsletter');
await modal.getByRole('button', {name: 'Create'}).click();
await expect(page.getByTestId('newsletter-modal')).toHaveCount(1);
expect(lastApiRequests.addNewsletter?.body).toMatchObject({
newsletters: [{
name: 'New newsletter'
}]
});
});
test('Supports updating a newsletter', async ({page}) => {
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=all', response: responseFixtures.newsletters},
editNewsletter: {method: 'PUT', path: `/newsletters/${responseFixtures.newsletters.newsletters[0].id}/?include=count.active_members%2Ccount.posts`, response: {
newsletters: [{
...responseFixtures.newsletters.newsletters[0],
name: 'Updated newsletter',
body_font_category: 'sans_serif'
}]
}}
}});
await page.goto('/');
const section = page.getByTestId('newsletters');
await section.getByText('Awesome newsletter').click();
const modal = page.getByTestId('newsletter-modal');
await modal.getByPlaceholder('Weekly Roundup').fill('');
await modal.getByRole('button', {name: 'Save & close'}).click();
await expect(page.getByTestId('toast')).toHaveText(/Can't save newsletter/);
await expect(modal).toHaveText(/Please enter a name/);
await modal.getByPlaceholder('Weekly Roundup').fill('Updated newsletter');
await modal.getByRole('tab', {name: 'Design'}).click();
await modal.getByLabel('Body style').selectOption({value: 'sans_serif'});
await modal.getByRole('button', {name: 'Save & close'}).click();
await expect(section.getByText('Updated newsletter')).toHaveCount(1);
expect(lastApiRequests.editNewsletter?.body).toMatchObject({
newsletters: [{
id: responseFixtures.newsletters.newsletters[0].id,
name: 'Updated newsletter',
body_font_category: 'sans_serif'
}]
});
});
test('Displays a prompt when email verification is required', async ({page}) => {
await mockApi({page, requests: {
...globalDataRequests,
browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=all', response: responseFixtures.newsletters},
editNewsletter: {method: 'PUT', path: `/newsletters/${responseFixtures.newsletters.newsletters[0].id}/?include=count.active_members%2Ccount.posts`, response: {
newsletters: [responseFixtures.newsletters.newsletters[0]],
meta: {
sent_email_verification: ['sender_email']
}
}}
}});
await page.goto('/');
const section = page.getByTestId('newsletters');
await section.getByText('Awesome newsletter').click();
const modal = page.getByTestId('newsletter-modal');
await modal.getByLabel('Sender email').fill('test@test.com');
await modal.getByRole('button', {name: 'Save & close'}).click();
await expect(page.getByTestId('confirmation-modal')).toHaveCount(1);
await expect(page.getByTestId('confirmation-modal')).toHaveText(/Confirm newsletter email address/);
});
test('Supports archiving newsletters', async ({page}) => {
const activate = await mockApi({page, requests: {
...globalDataRequests,
browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=all', response: responseFixtures.newsletters},
editNewsletter: {method: 'PUT', path: `/newsletters/${responseFixtures.newsletters.newsletters[1].id}/?include=count.active_members%2Ccount.posts`, response: {
newsletters: [{
...responseFixtures.newsletters.newsletters[1],
status: 'active'
}]
}}
}});
await page.goto('/');
const section = page.getByTestId('newsletters');
await section.getByRole('tab', {name: 'Archived'}).click();
await section.getByText('Average newsletter').hover();
await section.getByRole('button', {name: 'Activate'}).click();
await page.getByTestId('confirmation-modal').getByRole('button', {name: 'Reactivate'}).click();
await section.getByRole('tab', {name: 'Active'}).click();
await expect(section.getByText('Awesome newsletter')).toHaveCount(1);
await expect(section.getByText('Average newsletter')).toHaveCount(1);
expect(activate.lastApiRequests.editNewsletter?.body).toMatchObject({
newsletters: [{
id: responseFixtures.newsletters.newsletters[1].id,
status: 'active'
}]
});
const archive = await mockApi({page, requests: {
...globalDataRequests,
browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=all', response: responseFixtures.newsletters},
editNewsletter: {method: 'PUT', path: `/newsletters/${responseFixtures.newsletters.newsletters[0].id}/?include=count.active_members%2Ccount.posts`, response: {
newsletters: [{
...responseFixtures.newsletters.newsletters[0],
status: 'archived'
}]
}}
}});
await section.getByText('Awesome newsletter').hover();
await section.getByRole('button', {name: 'Archive'}).click();
await page.getByTestId('confirmation-modal').getByRole('button', {name: 'Archive'}).click();
await section.getByRole('tab', {name: 'Archived'}).click();
await expect(section.getByText('Awesome newsletter')).toHaveCount(1);
expect(archive.lastApiRequests.editNewsletter?.body).toMatchObject({
newsletters: [{
id: responseFixtures.newsletters.newsletters[0].id,
status: 'archived'
}]
});
});
test('Limits the number of newsletters', async ({page}) => {
await mockApi({page, requests: {
...globalDataRequests,
...limitRequests,
browseConfig: {
...globalDataRequests.browseConfig,
response: {
config: {
...responseFixtures.config.config,
hostSettings: {
limits: {
newsletters: {
max: 1,
error: 'Your plan supports up to {{max}} newsletters. Please upgrade to add more.'
}
}
}
}
}
},
browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=all', response: responseFixtures.newsletters}
}});
await page.goto('/');
const section = page.getByTestId('newsletters');
await section.getByRole('button', {name: 'Add newsletter'}).click();
await expect(page.getByTestId('limit-modal')).toHaveText(/Your plan supports up to 1 newsletters/);
await page.getByTestId('limit-modal').getByRole('button', {name: 'Cancel'}).click();
await section.getByRole('tab', {name: 'Archived'}).click();
await section.getByText('Average newsletter').hover();
await section.getByRole('button', {name: 'Activate'}).click();
await expect(page.getByTestId('limit-modal')).toHaveText(/Your plan supports up to 1 newsletters/);
});
});