0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-10 23:36:14 -05:00

Added Playwright member's actions tests (#15968)

refs TryGhost/Team#2371
- check that members can unsubscribe from newsletters by toggling
preferences in their account settings
- check that member can log out
This commit is contained in:
Elena Baidakova 2022-12-12 10:13:08 +04:00 committed by GitHub
parent aa706bc569
commit 88b056dc86
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 137 additions and 3 deletions

View file

@ -66,7 +66,7 @@
</GhFormGroup>
{{#if this.canShowSingleNewsletter}}
<GhFormGroup class="gh-members-subscribed-checkbox mb0">
<div class="flex justify-between items-center">
<div class="flex justify-between items-center" data-test-member-settings-switch>
<div>
<h4 class="gh-setting-title m">Subscribed to newsletter</h4>
<p class="gh-setting-desc">If disabled, member will <em>not</em> receive newsletter emails</p>

View file

@ -3,7 +3,7 @@
{{#unless this.suppressionData.suppressed}}
<div class="gh-member-newsletters">
{{#each this.newsletters as |newsletter|}}
<div class="gh-member-newsletter-row">
<div class="gh-member-newsletter-row" data-test-member-settings-switch>
<div>
<h4 class="gh-member-newsletter-title">{{newsletter.name}}</h4>
</div>

View file

@ -14,6 +14,7 @@
class="gh-input miw-100 form-text"
value={{@data.newsletter.name}}
placeholder="Weekly Roundup"
data-test-newsletter-title-input
{{on "input" (fn this.onInput "name")}}
/>
<GhErrorMessage @errors={{@data.newsletter.errors}} @property="name" />

View file

@ -68,7 +68,7 @@
</div>
</LinkTo>
{{#if (feature 'sourceAttribution')}}
<LinkTo class="gh-setting-group" @route="settings.analytics" data-test-nav="members-email">
<LinkTo class="gh-setting-group" @route="settings.analytics" data-test-nav="members-analytics">
<span class="green">{{svg-jar "chart"}}</span>
<div>
<h4>Analytics</h4>

View file

@ -0,0 +1,133 @@
const {expect, test} = require('@playwright/test');
const {createMember, impersonateMember} = require('../utils');
const addNewsletter = async (page) => {
// go to email settings
await page.goto('/ghost');
await page.locator('[data-test-nav="settings"]').click();
await page.locator('[data-test-nav="members-email"]').click();
// create newsletter
await page.locator('[data-test-button="add-newsletter"]').click();
await page.locator('[data-test-newsletter-title-input]').click();
await page.locator('[data-test-newsletter-title-input]').fill('One more newsletter');
await page.locator('[data-test-button="save-newsletter"]').click();
// check that newsletter was added
await page.waitForSelector('[data-test-newsletter="one-more-newsletter"]');
};
test.describe('Portal', () => {
test.describe('Member actions', () => {
test('can log out', async ({page}) => {
// create a new free member
await createMember(page, {
name: 'Test Member Signout',
email: 'test.member.signout@example.com',
note: 'Test Member'
});
// impersonate the member on frontend
impersonateMember(page);
const portalTriggerButton = page.frameLocator('#ghost-portal-root iframe.gh-portal-triggerbtn-iframe').locator('div').nth(1);
const portalFrame = page.frameLocator('#ghost-portal-root div iframe');
// sign out
await portalTriggerButton.click();
await portalFrame.locator('[data-test-button="footer-signout"]').click();
// check that sign out was successful and 'Sign in' button is available
await portalTriggerButton.click();
await expect(portalFrame.locator('[data-test-button="signin-switch"]')).toBeVisible();
});
test('can unsubscribe from newsletter from account settings', async ({page}) => {
// create a new free member
await createMember(page, {
name: 'Test Member',
email: 'test.member@example.com',
note: 'Test Member'
});
//get the url of the current member on admin
const memberUrl = page.url();
// impersonate the member on frontend
impersonateMember(page);
const portalTriggerButton = await page.locator('#gh-head').getByRole('link', {name: 'Account'});
const portalFrame = page.frameLocator('#ghost-portal-root div iframe');
// open portal and turn off newsletter
await portalTriggerButton.click();
// todo: replace on data attr
expect(await portalFrame.locator('#default-newsletter-toggle').isChecked()).toBeTruthy();
await portalFrame.locator('.gh-portal-for-switch .switch').click();
expect(await portalFrame.locator('#default-newsletter-toggle').isChecked()).not.toBeTruthy();
// check that member's newsletters was updated in Admin
await page.goto(memberUrl);
expect(await page.locator('[data-test-member-settings-switch] input[type=checkbox]').first().isChecked()).not.toBeTruthy();
});
test('can unsubscribe from all newsletters from account settings', async ({page}) => {
// create a new free member
await createMember(page, {
name: 'Test Member All Unsubscribe',
email: 'test.member2@example.com',
note: 'Test Member'
});
// get the url of the current member on admin
const memberUrl = page.url();
await addNewsletter(page);
// impersonate the member on frontend
await page.goto(memberUrl);
impersonateMember(page);
const portalTriggerButton = await page.locator('#gh-head').getByRole('link', {name: 'Account'});
const portalFrame = page.frameLocator('#ghost-portal-root div iframe');
// open portal
await portalTriggerButton.click();
await portalFrame.locator('[data-test-button="manage-newsletters"]').click();
// check amount of newsletters
// todo: replace on data attr
const newsletters = await portalFrame.locator('.gh-portal-list-toggle-wrapper');
const count = await newsletters.count();
expect(count).toEqual(2);
// all newsletters should be activated
for (let i = 0; i < count; i++) {
expect(await newsletters.nth(i).locator('input[type="checkbox"]').isChecked()).toBeTruthy();
}
// unsubscribe from all emails
// todo: replace on data attr
await portalFrame.getByRole('button', {name: 'Unsubscribe from all emails'}).click();
// all newsletters should be disabled
for (let i = 0; i < count; i++) {
expect(await newsletters.nth(i).locator('input[type="checkbox"]').isChecked()).not.toBeTruthy();
}
// check that member's newsletters was updated in Admin
await page.goto(memberUrl);
// check amount of newsletters in member's profile in Admin
await page.waitForSelector('[data-test-member-settings-switch]');
const membersNewsletters = await page.locator('[data-test-member-settings-switch]');
const newslettersCount = await membersNewsletters.count();
expect(newslettersCount).toEqual(2);
// all newsletters should be disabled
for (let i = 0; i < newslettersCount; i++) {
expect(await membersNewsletters.nth(i).locator('input[type="checkbox"]').isChecked()).not.toBeTruthy();
}
});
});
});