Skip to content

Commit bee2426

Browse files
authored
QA: Language logo Playwright test code (#40)
* QA: languaje logo ok * Update HomePage.spec.ts Remove extra tabs in code * Language toggle added in Page Object. AssertionsHelper created --------- Co-authored-by: robblun19 <Roberto Luna>
1 parent aeb6a1b commit bee2426

8 files changed

Lines changed: 109 additions & 58 deletions

File tree

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/NavBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const homepageUrl = t("homepage-url");
1111
return (
1212
<div className="fixed flex items-center justify-between w-full px-4 md:px-8 py-4">
1313
<div
14-
className="flex items-center"
14+
className="flex items-center cursor-pointer"
1515
onClick={() =>
1616
(window.location.href = homepageUrl)
1717
}

tests/e2e/HomePage.spec.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { expect, test } from '@playwright/test';
1+
import { test, expect } from '@playwright/test';
2+
import TestData from '../fixtures/testData';
23
import { closeQuickEscapeModal } from '../fixtures/testHelpers';
3-
import { HomePage, TestData } from '../page-objects';
4+
import { HomePage } from '../page-objects';
5+
import { expectUiLanguage } from '../fixtures/assertionsHelper';
46

57
test.describe('Homepage', () => {
68
let homePage: HomePage;
@@ -41,17 +43,19 @@ test.describe('Homepage', () => {
4143

4244
test('should handle language switching', async ({ page }) => {
4345
await closeQuickEscapeModal(page);
44-
45-
const languageToggle = page.locator('button').filter({ hasText: 'En' });
46-
if (await languageToggle.isVisible()) {
47-
await languageToggle.click();
48-
await expect(page.locator('text="Donar"')).toBeVisible();
49-
50-
const spanishToggle = page.locator('button').filter({ hasText: 'Es' });
51-
await spanishToggle.click();
52-
await expect(page.locator('text="Donate"')).toBeVisible();
53-
}
54-
});
46+
47+
// Visible En
48+
await expectUiLanguage(page, 'EN');
49+
50+
// Change to Es and Verify
51+
await homePage.switchLanguage('ES');
52+
await expectUiLanguage(page, 'ES');
53+
54+
// Change to En and Verify
55+
await homePage.switchLanguage('EN');
56+
await expectUiLanguage(page, 'EN');
57+
58+
});
5559

5660
test('should display quick escape by default', async ({ page }) => {
5761
await page.goto('/');

tests/e2e/Navigation.spec.ts

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,37 @@
11
import { expect, test } from '@playwright/test';
22
import TestData from '../fixtures/testData';
33
import { setupPageWithoutQuickEscape } from '../fixtures/testHelpers';
4+
import { BreathingExercisePage } from '../page-objects';
5+
import { expectUiLanguage } from '../fixtures/assertionsHelper';
46

57
test.describe('Navigation', () => {
68
test.beforeEach(async ({ page }) => {
79
await setupPageWithoutQuickEscape(page, TestData.urls.homepage);
810
});
911

1012
test.describe('Language Switching', () => {
11-
test('should switch to Spanish when language toggle is clicked', async ({ page }) => {
12-
const languageToggle = page.locator('button').filter({ hasText: 'En' });
13-
await expect(languageToggle).toBeVisible();
14-
await expect(page.locator('text="Donate"')).toBeVisible();
15-
16-
await languageToggle.click();
17-
18-
const spanishToggle = page.locator('button').filter({ hasText: 'Es' });
19-
await expect(spanishToggle).toBeVisible();
20-
await expect(page.locator('text="Donar"')).toBeVisible();
21-
});
13+
test('should switch to Spanish when language toggle is clicked', async ({ page }) => {
14+
const exercise = new BreathingExercisePage(page);
15+
// Initial state, En
16+
await expectUiLanguage(page, 'EN');
17+
// Change to Es
18+
await exercise.switchLanguage('ES');
19+
// Es language state
20+
await expectUiLanguage(page, 'ES');
21+
});
2222

23-
test('should switch back to English when language toggle is clicked again', async ({ page }) => {
24-
const languageToggle = page.locator('button').filter({ hasText: 'En' });
25-
await languageToggle.click();
26-
27-
const spanishToggle = page.locator('button').filter({ hasText: 'Es' });
28-
await expect(spanishToggle).toBeVisible();
29-
await expect(page.locator('text="Donar"')).toBeVisible();
30-
31-
await spanishToggle.click();
32-
33-
const englishToggle = page.locator('button').filter({ hasText: 'En' });
34-
await expect(englishToggle).toBeVisible();
35-
await expect(page.locator('text="Donate"')).toBeVisible();
36-
});
23+
test('should switch back to English when language toggle is clicked again', async ({ page }) => {
24+
const exercise = new BreathingExercisePage(page);
25+
26+
// Go to Es and check
27+
await exercise.switchLanguage('ES');
28+
await expectUiLanguage(page, 'ES');
29+
30+
// Go back to En and Check
31+
await exercise.switchLanguage('EN');
32+
await expectUiLanguage(page, 'EN');
3733
});
34+
});
3835

3936
test.describe('Quick Escape Feature', () => {
4037
test('should display quick escape modal by default', async ({ page }) => {

tests/fixtures/assertionsHelper.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {expect, Page} from '@playwright/test';
2+
3+
export async function expectUiLanguage (page: Page, lang: 'EN' | 'ES'){
4+
//Toggle by language
5+
const toggle = page.getByRole('button', { name: lang === 'EN' ? /^En$/i : /^Es$/i });
6+
await expect(toggle).toBeVisible();
7+
8+
// Donation link and text
9+
const donateName = lang === 'EN' ? /^Donate$/i : /^Donar$/i;
10+
await expect(page.getByRole('link', { name: donateName })).toBeVisible();
11+
12+
// Logo by language
13+
const logo = page.getByAltText('LogoAlt');
14+
const suffix = lang.toLowerCase(); // 'en' | 'es'
15+
await expect(logo).toHaveAttribute('src', new RegExp(`TrevorLogo-${suffix}\\.svg(\\?.*)?$`, 'i'));
16+
}

tests/page-objects/BreathingExercisePage.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import TestData from '../fixtures/testData';
77
*/
88
export class BreathingExercisePage {
99
readonly page: Page;
10+
11+
//Language elements
12+
readonly languageToggleBase: Locator;
1013

1114
// Exercise elements
1215
readonly breathingCircle: Locator;
@@ -25,7 +28,9 @@ export class BreathingExercisePage {
2528

2629
constructor(page: Page) {
2730
this.page = page;
28-
31+
32+
// Language controls
33+
this.languageToggleBase = page.locator(TestData.selectors.languageToggle);
2934
// Exercise controls
3035
this.breathingCircle = page.locator(TestData.selectors.breathingCircle);
3136
this.pauseButton = page.locator(TestData.selectors.pauseButton);
@@ -42,21 +47,29 @@ export class BreathingExercisePage {
4247
this.timer = page.locator('[data-testid="timer"], [data-testid="countdown"]');
4348
}
4449

50+
// Get Toggle by language
51+
getLanguageToggle(lang: 'EN' | 'ES') {
52+
const re = lang === 'EN' ? /^En$/i : /^Es$/i;
53+
return this.page.getByRole('button', { name: re });
54+
}
55+
56+
private toggleButton() {
57+
return this.page.getByRole('button', { name: /^(En|Es)$/i });
58+
}
4559
/**
4660
* Navigate directly to the exercise page
4761
*/
4862
async goto() {
4963
await this.page.goto(TestData.urls.exercise);
5064
}
5165

52-
/**
53-
* Start the breathing exercise
66+
/**
67+
* Change language
5468
*/
55-
async startExercise() {
56-
const startButton = this.page.locator('[data-testid="start-button"], [data-testid="begin-exercise"]');
57-
if (await startButton.isVisible()) {
58-
await startButton.click();
59-
}
69+
async switchLanguage(target: 'EN' | 'ES') {
70+
if (await this.getLanguageToggle(target).isVisible()) return;
71+
await this.toggleButton().click();
72+
await this.getLanguageToggle(target).waitFor({ state: 'visible' });
6073
}
6174

6275
/**

tests/page-objects/HomePage.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import TestData from '../fixtures/testData';
1414
export class HomePage {
1515
readonly page: Page;
1616

17+
// Language elements
18+
readonly languageToggleBase: Locator;
1719
// Page elements
1820
readonly startButton: Locator;
1921
readonly welcomeText: Locator;
@@ -27,6 +29,9 @@ export class HomePage {
2729
constructor(page: Page) {
2830
this.page = page;
2931

32+
// Language controls
33+
this.languageToggleBase = page.locator(TestData.selectors.languageToggle);
34+
3035
// Initialize locators using TestData selectors
3136
this.startButton = page.locator(TestData.selectors.startButton);
3237
this.welcomeText = page.locator(TestData.selectors.welcomeText);
@@ -42,13 +47,36 @@ export class HomePage {
4247

4348
}
4449

50+
51+
// Get Toggle by language
52+
getLanguageToggle(lang: 'EN' | 'ES') {
53+
const re = lang === 'EN' ? /^En$/i : /^Es$/i;
54+
return this.page.getByRole('button', { name: re });
55+
}
56+
57+
private toggleButton() {
58+
return this.page.getByRole('button', { name: /^(En|Es)$/i });
59+
}
4560
/**
4661
* Navigate to the homepage
4762
*/
4863
async goto() {
4964
await this.page.goto(TestData.urls.homepage);
5065
}
5166

67+
/**
68+
* Change language
69+
*/
70+
async switchLanguage(target: 'EN' | 'ES') {
71+
if (await this.getLanguageToggle(target).isVisible()) return;
72+
await this.toggleButton().click();
73+
await this.getLanguageToggle(target).waitFor({ state: 'visible' });
74+
}
75+
76+
async hasLanguageToggle() {
77+
return await this.languageToggleBase.isVisible();
78+
}
79+
5280
/**
5381
* Start the breathing exercise
5482
*/
@@ -107,13 +135,6 @@ export class HomePage {
107135
return await this.startButton.isVisible();
108136
}
109137

110-
/**
111-
* Check if language toggle is available
112-
*/
113-
async hasLanguageToggle() {
114-
return await this.languageToggle.isVisible();
115-
}
116-
117138
/**
118139
* Check if quick escape is available
119140
*/

tests/playwright.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { defineConfig, devices } from '@playwright/test';
22

33
export default defineConfig({
4-
testDir: 'e2e',
4+
testDir: './e2e',
55
/* Run tests in files in parallel */
66
fullyParallel: true,
77
/* Fail the build on CI if you accidentally left test.only in the source code. */

0 commit comments

Comments
 (0)