214 lines
7.2 KiB
TypeScript
214 lines
7.2 KiB
TypeScript
import { execSync } from 'child_process';
|
|
|
|
import { test, expect } from '@playwright/test';
|
|
|
|
import translations from '../client/i18n/locales/english/translations.json';
|
|
|
|
const apiLocation = process.env.API_LOCATION || 'http://localhost:3000';
|
|
|
|
const contents = [
|
|
translations.learn['read-this'].heading,
|
|
translations.learn['read-this'].p1,
|
|
translations.learn['read-this'].p2,
|
|
translations.learn['read-this'].p3,
|
|
translations.learn['read-this'].p4,
|
|
translations.learn['read-this'].p5,
|
|
translations.learn['read-this'].p6,
|
|
translations.learn['read-this'].p7,
|
|
translations.learn['read-this'].p8,
|
|
"And if you want to learn more math and computer science theory, we also have thousands of hours of video courses on freeCodeCamp's YouTube channel.",
|
|
translations.learn['read-this'].p10,
|
|
'You can do this on LinkedIn and GitHub, and also on the freeCodeCamp forum.',
|
|
translations.learn['read-this'].p12,
|
|
translations.misc.quincy,
|
|
translations.misc['email-blast']
|
|
];
|
|
|
|
test.describe('Email sign-up page when user is not signed in', () => {
|
|
test.use({ storageState: { cookies: [], origins: [] } });
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto('/email-sign-up');
|
|
});
|
|
|
|
test('should display the content correctly', async ({ page }) => {
|
|
for (const content of contents) {
|
|
await expect(page.getByText(content)).toBeVisible();
|
|
}
|
|
|
|
const youtubeLink = page.getByRole('link', {
|
|
name: "freeCodeCamp's YouTube channel"
|
|
});
|
|
await expect(youtubeLink).toHaveAttribute(
|
|
'href',
|
|
'https://youtube.com/freecodecamp'
|
|
);
|
|
|
|
const forumLink = page.getByRole('link', {
|
|
name: 'the freeCodeCamp forum'
|
|
});
|
|
await expect(forumLink).toHaveAttribute(
|
|
'href',
|
|
'https://forum.freecodecamp.org'
|
|
);
|
|
});
|
|
|
|
test("should not enable Quincy's weekly newsletter when the user clicks the sign up button", async ({
|
|
page
|
|
}) => {
|
|
await expect(page).toHaveTitle('Email Sign Up | freeCodeCamp.org');
|
|
await expect(
|
|
page.getByText(
|
|
'freeCodeCamp is a proven path to your first software developer job.'
|
|
)
|
|
).toBeVisible();
|
|
|
|
const signupLink = page.getByRole('link', {
|
|
name: translations.buttons['sign-up-email-list']
|
|
});
|
|
|
|
await expect(signupLink).toBeVisible();
|
|
await expect(signupLink).toHaveAttribute('href', `${apiLocation}/signin`);
|
|
await signupLink.click();
|
|
|
|
// The user is signed in and automatically redirected to /learn after clicking the button.
|
|
// We wait for this navigation to complete before moving onto the next.
|
|
await page.waitForURL('**/learn');
|
|
await expect(
|
|
page.getByRole('heading', { name: 'Welcome back, Full Stack User' })
|
|
).toBeVisible();
|
|
|
|
await page.goto('/settings');
|
|
await expect(
|
|
page.getByRole('group', { name: translations.settings.email.weekly })
|
|
).toBeVisible();
|
|
await expect(
|
|
page.getByRole('button', { name: translations.buttons['yes-please'] })
|
|
).toHaveAttribute('aria-pressed', 'false');
|
|
await expect(
|
|
page.getByRole('button', { name: translations.buttons['no-thanks'] })
|
|
).toHaveAttribute('aria-pressed', 'true');
|
|
});
|
|
});
|
|
|
|
test.describe('Email sign-up page when user is signed in', () => {
|
|
test.use({ storageState: 'playwright/.auth/certified-user.json' });
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
// It's necessary to seed with a user that has not accepted the privacy
|
|
// terms, otherwise the user will be redirected away from the email sign-up
|
|
// page.
|
|
execSync(
|
|
'node ./tools/scripts/seed/seed-demo-user --certified-user --set-false acceptedPrivacyTerms'
|
|
);
|
|
|
|
await page.goto('/email-sign-up');
|
|
});
|
|
|
|
test('should display the content correctly', async ({ page }) => {
|
|
for (const content of contents) {
|
|
await expect(page.getByText(content)).toBeVisible();
|
|
}
|
|
|
|
const youtubeLink = page.getByRole('link', {
|
|
name: "freeCodeCamp's YouTube channel"
|
|
});
|
|
await expect(youtubeLink).toHaveAttribute(
|
|
'href',
|
|
'https://youtube.com/freecodecamp'
|
|
);
|
|
|
|
const forumLink = page.getByRole('link', {
|
|
name: 'the freeCodeCamp forum'
|
|
});
|
|
await expect(forumLink).toHaveAttribute(
|
|
'href',
|
|
'https://forum.freecodecamp.org'
|
|
);
|
|
});
|
|
|
|
test("should disable Quincy's weekly newsletter if the user clicks No", async ({
|
|
page
|
|
}) => {
|
|
await expect(page).toHaveTitle('Email Sign Up | freeCodeCamp.org');
|
|
await expect(
|
|
page.getByText(
|
|
'freeCodeCamp is a proven path to your first software developer job.'
|
|
)
|
|
).toBeVisible();
|
|
|
|
const noThanksButton = page.getByRole('button', {
|
|
name: translations.buttons['no-thanks']
|
|
});
|
|
|
|
await expect(noThanksButton).toBeVisible();
|
|
await noThanksButton.click();
|
|
|
|
// The user is signed in and automatically redirected to /learn after clicking the button.
|
|
// We wait for the navigation to complete.
|
|
await page.waitForURL('**/learn');
|
|
await expect(
|
|
page.getByRole('heading', { name: 'Welcome back, Full Stack User' })
|
|
).toBeVisible();
|
|
|
|
await page.goto('/settings');
|
|
await expect(
|
|
page.getByRole('group', { name: translations.settings.email.weekly })
|
|
).toBeVisible();
|
|
await expect(
|
|
page.getByRole('button', { name: translations.buttons['no-thanks'] })
|
|
).toHaveAttribute('aria-pressed', 'true');
|
|
await expect(
|
|
page.getByRole('button', { name: translations.buttons['yes-please'] })
|
|
).toHaveAttribute('aria-pressed', 'false');
|
|
});
|
|
|
|
test("should enable Quincy's weekly newsletter if the user clicks Yes", async ({
|
|
page
|
|
}) => {
|
|
await expect(page).toHaveTitle('Email Sign Up | freeCodeCamp.org');
|
|
await expect(
|
|
page.getByText(
|
|
'freeCodeCamp is a proven path to your first software developer job.'
|
|
)
|
|
).toBeVisible();
|
|
|
|
const signupButton = page.getByRole('button', {
|
|
name: translations.buttons['yes-please']
|
|
});
|
|
|
|
await expect(signupButton).toBeVisible();
|
|
await signupButton.click();
|
|
|
|
// The user is signed in and automatically redirected to /learn after clicking the button.
|
|
// We wait for the navigation to complete.
|
|
await page.waitForURL('**/learn');
|
|
await expect(
|
|
page.getByRole('heading', { name: 'Welcome back, Full Stack User' })
|
|
).toBeVisible();
|
|
|
|
// When the user clicks Yes, the /update-privacy-terms API is called
|
|
// to update both `acceptedPrivacyTerms` and `sendQuincyEmail`.
|
|
// But `sendQuincyEmail` is not set in the DB since the endpoint is mocked,
|
|
// so we are overriding the user data once again to mimic the real behavior.
|
|
await page.route('*/**/user/get-session-user', async route => {
|
|
const response = await route.fetch();
|
|
const json = await response.json();
|
|
|
|
json.user.certifieduser.sendQuincyEmail = true;
|
|
await route.fulfill({ json });
|
|
});
|
|
|
|
await page.goto('/settings');
|
|
await expect(
|
|
page.getByRole('group', { name: translations.settings.email.weekly })
|
|
).toBeVisible();
|
|
await expect(
|
|
page.getByRole('button', { name: translations.buttons['yes-please'] })
|
|
).toHaveAttribute('aria-pressed', 'true');
|
|
await expect(
|
|
page.getByRole('button', { name: translations.buttons['no-thanks'] })
|
|
).toHaveAttribute('aria-pressed', 'false');
|
|
});
|
|
});
|