Skip to content

Commit

Permalink
feat: improve username validation test (#54634)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sembauke committed May 14, 2024
1 parent f826596 commit 0bf41ec
Show file tree
Hide file tree
Showing 3 changed files with 174 additions and 186 deletions.
140 changes: 0 additions & 140 deletions cypress/e2e/default/settings/username-change.ts

This file was deleted.

47 changes: 1 addition & 46 deletions e2e/settings.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,10 @@ const settingsTestIds = {

const settingsObject = {
email: 'foo@bar.com',
userNamePlaceholder: '{{username}}',
certifiedUsername: 'certifieduser',
testEmail: 'test@gmail.com',
pageTitle: `${translations.buttons.settings} | freeCodeCamp.org`,
userNamePlaceholder: '{{username}}',
testUser: 'testuser',
errorCode: '404',
invalidUserName: 'user!',
tooShortUserName: 'us',
private: 'Private',
public: 'Public',
supportEmail: 'support@freecodecamp.org',
Expand Down Expand Up @@ -70,47 +66,6 @@ test.describe('Settings', () => {
);
});

test('Should validate Username Settings', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
await expect(inputLabel).toBeVisible();
await inputLabel.fill(settingsObject.testUser);
await expect(
page.getByText(translations.settings.username.validating)
).toBeVisible();
await inputLabel.fill(settingsObject.errorCode);
await expect(
page.getByText(
translations.settings.username['is a reserved error code'].replace(
settingsObject.userNamePlaceholder,
settingsObject.errorCode
)
)
).toBeVisible();
await inputLabel.fill(settingsObject.invalidUserName);
await expect(
page.getByText(
translations.settings.username['contains invalid characters'].replace(
settingsObject.userNamePlaceholder,
settingsObject.invalidUserName
)
)
).toBeVisible();
await inputLabel.fill(settingsObject.tooShortUserName);
await expect(
page.getByText(
translations.settings.username['is too short'].replace(
settingsObject.userNamePlaceholder,
settingsObject.tooShortUserName
)
)
).toBeVisible();
await inputLabel.fill(settingsObject.certifiedUsername);
const saveButton = page.getByRole('button', {
name: translations.settings.labels.username
});
await expect(saveButton).toBeVisible();
});

test('Should validate Privacy Settings', async ({ page }) => {
await expect(
page.getByRole('heading', {
Expand Down
173 changes: 173 additions & 0 deletions e2e/username-change.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
import { test, expect } from '@playwright/test';
import translations from '../client/i18n/locales/english/translations.json';
test.use({ storageState: 'playwright/.auth/certified-user.json' });

const settingsObject = {
usernamePlaceholder: '{{username}}',
usernameUpdateToLowerCase: 'quincy',
usernameUpdateToUpperCase: 'Mrugesh',
usernameAvailable: 'Sem',
usernameAvailablePressingEnter: 'Oliver',
usernameNotAvailable: 'Twaha',
usernameInvalid: 'user!',
usernameTooShort: 'us',
certifiedUsername: 'certifieduser',
testUser: 'testuser',
errorCode: '404'
};

test.describe('Username Settings Validation', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/settings');
});

test('Should display Username Input and Save Button', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
const saveButton = page.getByRole('button', {
name: translations.settings.labels.username
});
await expect(inputLabel).toBeVisible();
await expect(saveButton).toBeVisible();
});

test('Should handle Reserved Username Error', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
await inputLabel.fill(settingsObject.errorCode);
await expect(
page.getByText(
translations.settings.username['is a reserved error code'].replace(
settingsObject.usernamePlaceholder,
settingsObject.errorCode
)
)
).toBeVisible();
});

test('Should handle Invalid Username Error', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
await inputLabel.fill(settingsObject.usernameInvalid);
await expect(
page.getByText(
translations.settings.username['contains invalid characters'].replace(
settingsObject.usernamePlaceholder,
settingsObject.usernameInvalid
)
)
).toBeVisible();
});

test('Should handle Unavailable Username Error', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
await inputLabel.fill(settingsObject.usernameNotAvailable);
await expect(
page.getByText(
translations.settings.username['unavailable'].replace(
settingsObject.usernamePlaceholder,
settingsObject.usernameNotAvailable
)
)
).toBeVisible();
});

test('Should handle Too Short Username Error', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
await inputLabel.fill(settingsObject.usernameTooShort);
await expect(
page.getByText(
translations.settings.username['is too short'].replace(
settingsObject.usernamePlaceholder,
settingsObject.usernameTooShort
)
)
).toBeVisible();
});

test('Should save valid Username', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
const saveButton = page.getByRole('button', {
name: translations.settings.labels.username
});
await inputLabel.fill(settingsObject.usernameAvailable);
await expect(saveButton).not.toBeDisabled();
await saveButton.click();
await expect(
page.getByText(
translations.flash['username-updated'].replace(
settingsObject.usernamePlaceholder,
settingsObject.usernameAvailable
)
)
).toBeVisible();
});

test('should update username in lowercase and reflect in the UI', async ({
page
}) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
const saveButton = page.getByRole('button', {
name: translations.settings.labels.username
});
await inputLabel.fill(settingsObject.usernameUpdateToLowerCase);
await expect(saveButton).not.toBeDisabled();
await saveButton.click();
await expect(
page.getByText(
translations.flash['username-updated'].replace(
settingsObject.usernamePlaceholder,
settingsObject.usernameUpdateToLowerCase
)
)
).toBeVisible();
});

test('should update username in uppercase and reflect in the UI', async ({
page
}) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
const saveButton = page.getByRole('button', {
name: translations.settings.labels.username
});
await inputLabel.fill(settingsObject.usernameUpdateToUpperCase);
await expect(saveButton).not.toBeDisabled();
await saveButton.click();
await expect(
page.getByText(
translations.flash['username-updated'].replace(
settingsObject.usernamePlaceholder,
settingsObject.usernameUpdateToUpperCase
)
)
).toBeVisible();
});

test('should update username by pressing enter', async ({ page }) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
await inputLabel.fill(settingsObject.testUser);

await expect(
page.getByText(translations.settings.username.available)
).toBeVisible();

await inputLabel.press('Enter');

await expect(
page.getByText(
translations.flash['username-updated'].replace(
settingsObject.usernamePlaceholder,
settingsObject.testUser
)
)
).toBeVisible();
});

test('should not be able to update username to the same username', async ({
page
}) => {
const inputLabel = page.getByLabel(translations.settings.labels.username);
const saveButton = page.getByRole('button', {
name: translations.settings.labels.username
});
await inputLabel.fill(settingsObject.testUser);
await expect(saveButton).toBeDisabled();
});
});

0 comments on commit 0bf41ec

Please sign in to comment.