)}{' '}
{challengeDescription}
- {!showIndependentLowerJaw && (
+ {showSidePanelTests && (
<>
{toolPanel}
diff --git a/client/src/templates/Challenges/components/test-suite.css b/client/src/templates/Challenges/components/test-suite.css
index 6eb6dc3f4d0..1c08396251a 100644
--- a/client/src/templates/Challenges/components/test-suite.css
+++ b/client/src/templates/Challenges/components/test-suite.css
@@ -7,8 +7,7 @@
}
.challenge-test-suite-heading {
- font-size: 0.9em;
- text-align: center;
+ font-size: 1em;
}
.sk-spinner {
@@ -25,6 +24,7 @@
width: 100%;
align-items: center;
line-height: 1.5;
+ padding: 6px;
}
.test-result:nth-child(odd) {
@@ -47,11 +47,9 @@
display: flex;
align-items: center;
justify-content: center;
- min-width: 60px;
- min-height: 60px;
}
.test-status-icon > svg {
- width: 40px;
- height: 40px;
+ width: 30px;
+ height: 30px;
}
diff --git a/e2e/challenge-reset-modal.spec.ts b/e2e/challenge-reset-modal.spec.ts
index 281ec8e5992..21fcd3e1de3 100644
--- a/e2e/challenge-reset-modal.spec.ts
+++ b/e2e/challenge-reset-modal.spec.ts
@@ -47,7 +47,7 @@ test('should render the modal content correctly', async ({ page }) => {
'/learn/responsive-web-design-v9/workshop-cat-photo-app/step-3'
);
- await page.getByTestId('independentLowerJaw-reset-button').click();
+ await page.getByRole('button', { name: translations.buttons.reset }).click();
await expectToRenderResetModal(page);
@@ -93,14 +93,12 @@ test('User can reset challenge', async ({ page, isMobile, browserName }) => {
// are reset)
await page
.getByRole('button', {
- // check-code works on all browsers because it does not include Command
- // or Ctrl
name: translations.buttons['check-code']
})
.click();
// Reset the challenge
- await page.getByTestId('independentLowerJaw-reset-button').click();
+ await page.getByRole('button', { name: translations.buttons.reset }).click();
await page
.getByRole('button', { name: translations.buttons['reset-lesson'] })
.click();
@@ -147,11 +145,9 @@ test.describe('When the user is not logged in', () => {
await focusEditor({ page, isMobile });
await getEditors(page).fill(challengeSolution);
- const submitButton = page.getByRole('button', {
- name: isMobile
- ? translations.buttons.run
- : translations.buttons['run-test']
- });
+ const submitButton = isMobile
+ ? page.getByRole('button', { name: translations.buttons.run })
+ : page.getByRole('button', { name: translations.buttons['check-code'] });
await submitButton.click();
@@ -161,7 +157,7 @@ test.describe('When the user is not logged in', () => {
// Completion dialog shows up
await expect(
- page.getByText(translations.buttons['go-to-next'])
+ page.getByText(translations.buttons['submit-continue'])
).toBeVisible();
// Close the dialog
@@ -170,11 +166,7 @@ test.describe('When the user is not logged in', () => {
.click();
await page
- .getByRole('button', {
- name: !isMobile
- ? translations.buttons['reset-lesson']
- : translations.buttons.reset
- })
+ .getByRole('button', { name: translations.buttons.reset })
.click();
await page
@@ -206,7 +198,7 @@ test('should close when the user clicks the close button', async ({ page }) => {
'/learn/responsive-web-design-v9/workshop-cat-photo-app/step-3'
);
- await page.getByTestId('independentLowerJaw-reset-button').click();
+ await page.getByRole('button', { name: translations.buttons.reset }).click();
await expect(
page.getByRole('dialog', { name: translations.learn.reset })
@@ -242,13 +234,11 @@ test('User can reset on a multi-file project', async ({
await page.getByRole('button', { name: translations.buttons.revert }).click();
await expectToRenderResetModal(page);
-
await expect(
page.getByRole('button', {
name: translations.buttons['revert-to-saved-code']
})
).toBeVisible();
-
await page
.getByRole('button', {
name: translations.buttons['revert-to-saved-code']
diff --git a/e2e/donation-modal.spec.ts b/e2e/donation-modal.spec.ts
index 7439b106784..631d75314bc 100644
--- a/e2e/donation-modal.spec.ts
+++ b/e2e/donation-modal.spec.ts
@@ -103,11 +103,8 @@ const completeChallenges = async ({
challenge.solution
);
await page.keyboard.press('ControlOrMeta+V');
- await page.getByRole('button', { name: 'Run' }).click();
- await expect(
- page.getByRole('dialog').filter({ hasText: 'Basic Javascript' })
- ).toBeVisible(); // completion dialog
- await page.getByRole('button', { name: 'Submit' }).click();
+ await page.getByRole('button', { name: 'Check Your Code' }).click();
+ await page.getByRole('button', { name: 'Submit and continue' }).click();
}
};
diff --git a/e2e/help-button.spec.ts b/e2e/help-button.spec.ts
index 784fbbc3b7d..94ef3c99c3b 100644
--- a/e2e/help-button.spec.ts
+++ b/e2e/help-button.spec.ts
@@ -1,9 +1,16 @@
import { test, expect } from '@playwright/test';
+import translations from '../client/i18n/locales/english/translations.json';
-test.describe('help-button tests for a page with three links (hint, help and video)', () => {
+test.describe('Mobile help-button tests for a page with three links (hint, help and video)', () => {
+ test.use({
+ viewport: { width: 393, height: 851 },
+ isMobile: true
+ });
test('should render the button, menu and the three links when video is available', async ({
- page
+ page,
+ isMobile
}) => {
+ test.skip(!isMobile, 'Help dropdown only available on mobile');
// visit the page with the video link
await page.goto(
'/learn/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements'
@@ -20,11 +27,17 @@ test.describe('help-button tests for a page with three links (hint, help and vid
});
});
-test.describe('help-button tests for a page with two links when video is not available', () => {
+test.describe('Mobile help-button tests for a page with two links when video is not available', () => {
+ test.use({
+ viewport: { width: 393, height: 851 },
+ isMobile: true
+ });
test('should render the button, menu and the two links when video is not available', async ({
- page
+ page,
+ isMobile
}) => {
- // visit the page without the video link
+ test.skip(!isMobile, 'Help dropdown only available on mobile');
+
await page.goto(
'/learn/front-end-development-libraries/bootstrap/apply-the-default-bootstrap-button-style'
);
@@ -81,10 +94,78 @@ test.describe('Desktop help-button tests for a page with a reset and help button
'learn/2022/responsive-web-design/learn-html-by-building-a-cat-photo-app/step-3'
);
await expect(
- page.getByTestId('independentLowerJaw-reset-button')
+ page.getByRole('button', { name: translations.buttons.reset })
).toBeVisible();
await expect(
- page.getByTestId('independentLowerJaw-help-button')
+ page.getByRole('button', { name: translations.buttons.help })
+ ).toBeVisible();
+ });
+
+ test('should open help modal with video button when video is available', async ({
+ page
+ }) => {
+ // visit the page with the video link
+ await page.goto(
+ '/learn/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements'
+ );
+
+ // Click the help button in independent lower jaw
+ const helpButton = page.getByRole('button', {
+ name: translations.buttons.help
+ });
+ await expect(helpButton).toBeVisible();
+ await helpButton.click();
+
+ // Help modal should open
+ await expect(
+ page.getByRole('dialog', { name: translations.buttons['get-help'] })
+ ).toBeVisible();
+
+ // Video button should be present in the modal
+ await expect(
+ page.getByRole('button', { name: translations.buttons['watch-video'] })
+ ).toBeVisible();
+
+ // Other help options should be present
+ await expect(
+ page.getByRole('link', { name: translations.buttons['get-hint'] })
+ ).toBeVisible();
+ await expect(
+ page.getByRole('button', { name: translations.buttons['create-post'] })
+ ).toBeVisible();
+ });
+
+ test('should open help modal without video button when video is not available', async ({
+ page
+ }) => {
+ // visit the page without the video link
+ await page.goto(
+ '/learn/front-end-development-libraries/bootstrap/apply-the-default-bootstrap-button-style'
+ );
+
+ // Click the help button in independent lower jaw
+ const helpButton = page.getByRole('button', {
+ name: translations.buttons.help
+ });
+ await expect(helpButton).toBeVisible();
+ await helpButton.click();
+
+ // Help modal should open
+ await expect(
+ page.getByRole('dialog', { name: translations.buttons['get-help'] })
+ ).toBeVisible();
+
+ // Video button should NOT be present in the modal
+ await expect(
+ page.getByRole('button', { name: translations.buttons['watch-video'] })
+ ).toBeHidden();
+
+ // Other help options should be present
+ await expect(
+ page.getByRole('link', { name: translations.buttons['get-hint'] })
+ ).toBeVisible();
+ await expect(
+ page.getByRole('button', { name: translations.buttons['create-post'] })
).toBeVisible();
});
});
diff --git a/e2e/help-modal.spec.ts b/e2e/help-modal.spec.ts
index e6d4d97944a..515490bc683 100644
--- a/e2e/help-modal.spec.ts
+++ b/e2e/help-modal.spec.ts
@@ -14,7 +14,7 @@ test.describe('Help Modal component', () => {
.click();
await expect(
- page.getByRole('dialog', { name: translations.buttons['ask-for-help'] })
+ page.getByRole('dialog', { name: translations.buttons['get-help'] })
).toBeVisible();
await expect(
page.getByText(
@@ -52,7 +52,7 @@ test.describe('Help Modal component', () => {
.click();
await expect(
- page.getByRole('dialog', { name: translations.buttons['ask-for-help'] })
+ page.getByRole('dialog', { name: translations.buttons['get-help'] })
).toBeVisible();
const rsaCheckbox = page.getByRole('checkbox', {
@@ -102,7 +102,7 @@ test.describe('Help Modal component', () => {
.click();
await expect(
- page.getByRole('dialog', { name: translations.buttons['ask-for-help'] })
+ page.getByRole('dialog', { name: translations.buttons['get-help'] })
).toBeVisible();
const rsaCheckbox = page.getByRole('checkbox', {
@@ -143,7 +143,7 @@ test.describe('Help Modal component', () => {
.click();
await expect(
- page.getByRole('dialog', { name: translations.buttons['ask-for-help'] })
+ page.getByRole('dialog', { name: translations.buttons['get-help'] })
).toBeVisible();
const rsaCheckbox = page.getByRole('checkbox', {
@@ -189,7 +189,7 @@ test.describe('Help Modal component', () => {
.click();
const dialog = page.getByRole('dialog', {
- name: translations.buttons['ask-for-help']
+ name: translations.buttons['get-help']
});
await expect(dialog).toBeVisible();
@@ -207,7 +207,7 @@ test.describe('Help Modal component', () => {
.click();
const dialog = page.getByRole('dialog', {
- name: translations.buttons['ask-for-help']
+ name: translations.buttons['get-help']
});
await expect(dialog).toBeVisible();
diff --git a/e2e/ms-trophy-show.spec.ts b/e2e/ms-trophy-show.spec.ts
index 4bec2e73694..954f1331390 100644
--- a/e2e/ms-trophy-show.spec.ts
+++ b/e2e/ms-trophy-show.spec.ts
@@ -43,7 +43,7 @@ test('Correct Ask for help button', async ({ page }) => {
await checkAnswerButton.click();
await expect(
page.getByRole('heading', {
- name: translations.buttons['ask-for-help'],
+ name: translations.buttons['get-help'],
exact: true
})
).toBeVisible();
diff --git a/e2e/multifile-cert-projects.spec.ts b/e2e/multifile-cert-projects.spec.ts
index 07d635e5df3..f4ca2bdb35a 100644
--- a/e2e/multifile-cert-projects.spec.ts
+++ b/e2e/multifile-cert-projects.spec.ts
@@ -1,6 +1,8 @@
import { execSync } from 'child_process';
import { test, expect } from '@playwright/test';
+import translations from '../client/i18n/locales/english/translations.json';
import { clearEditor, focusEditor } from './utils/editor';
+
test.describe('multifileCertProjects', () => {
test.beforeEach(async ({ page }) => {
execSync('node ../tools/scripts/seed/seed-demo-user --certified-user');
@@ -25,9 +27,7 @@ test.describe('multifileCertProjects', () => {
await page.keyboard.type('save1text');
await expect(page.getByText('save1text')).toBeVisible();
- await page
- .getByRole('button', { name: !isMobile ? 'Save your Code' : 'Save' })
- .click();
+ await page.getByRole('button', { name: translations.buttons.save }).click();
await expect(page.getByTestId('flash-message')).toContainText(success);
diff --git a/e2e/output.spec.ts b/e2e/output.spec.ts
index 1404fac3854..e73939ce529 100644
--- a/e2e/output.spec.ts
+++ b/e2e/output.spec.ts
@@ -55,7 +55,11 @@ const runChallengeTest = async (page: Page, isMobile: boolean) => {
await page.getByRole('tab', { name: 'Console' }).click();
await page.getByText('Run').click();
} else {
- await page.getByText('Run the Tests (Ctrl + Enter)').click();
+ await page
+ .getByRole('button', {
+ name: translations.buttons['check-code']
+ })
+ .click();
}
};
@@ -95,7 +99,9 @@ test.describe('For classic challenges', () => {
text: '
Hello World
'
});
await runChallengeTest(page, isMobile);
- await closeButton.click();
+ if (isMobile) {
+ await closeButton.click();
+ }
await expect(
page.getByRole('region', {
diff --git a/e2e/progress-bar.spec.ts b/e2e/progress-bar.spec.ts
index 57966ad8ee0..25bca9aa672 100644
--- a/e2e/progress-bar.spec.ts
+++ b/e2e/progress-bar.spec.ts
@@ -1,11 +1,8 @@
import { expect, test } from '@playwright/test';
+import translations from '../client/i18n/locales/english/translations.json';
import { clearEditor, focusEditor } from './utils/editor';
test.describe('Progress bar component in editor', () => {
- // progress bar shows up for the defeult lower jaw that is only displayed on mobile.
- test.use({
- viewport: { width: 390, height: 844 }
- });
test('Should appear with the correct content after the user has submitted their code', async ({
page,
isMobile,
@@ -24,20 +21,24 @@ test.describe('Progress bar component in editor', () => {
'
CatPhotoApp
Cat Photos
Everyone loves cute cats online!
'
);
- await page.getByRole('button', { name: 'Check Your Code' }).click();
+ await page
+ .getByRole('button', { name: translations.buttons['check-code'] })
+ .click();
const progressBarContainer = page.getByTestId('progress-bar-container');
await expect(progressBarContainer).toContainText(
'Learn HTML by Building a Cat Photo App'
);
await expect(progressBarContainer).toContainText(/\d% complete/);
- await page
- .getByRole('button', { name: 'Submit and go to next challenge' })
- .click();
+ await page.getByRole('button', { name: 'Submit and continue' }).click();
});
});
test.describe('Progress bar component in modal', () => {
+ test.use({
+ viewport: { width: 393, height: 851 },
+ isMobile: true
+ });
test('should appear in the completion modal after user has submitted their code', async ({
page,
isMobile,
@@ -51,12 +52,18 @@ test.describe('Progress bar component in modal', () => {
await page.keyboard.insertText('var myName;');
- await page
- .getByRole('button', {
- name: 'Run',
- exact: false
- })
- .click();
+ if (isMobile) {
+ await page
+ .getByRole('button', {
+ name: 'Run',
+ exact: false
+ })
+ .click();
+ } else {
+ await page
+ .getByRole('button', { name: translations.buttons['check-code'] })
+ .click();
+ }
await expect(page.locator('.completion-block-meta')).toContainText(
/\d% complete/
diff --git a/e2e/projects.spec.ts b/e2e/projects.spec.ts
index e829ecf7ba2..39efa0dfe11 100644
--- a/e2e/projects.spec.ts
+++ b/e2e/projects.spec.ts
@@ -158,10 +158,15 @@ test.describe('JavaScript projects can be submitted and then viewed in /settings
await pasteContent(page);
- await page.getByRole('button', { name: 'Run' }).click();
+ await page
+ .getByRole('button', { name: translations.buttons['check-code'] })
+ .click();
await page
- .getByRole('button', { name: 'Go to next challenge', exact: false })
+ .getByRole('button', {
+ name: translations.buttons['submit-continue'],
+ exact: false
+ })
.click();
// Submit the rest with the API.
diff --git a/e2e/side-panel.spec.ts b/e2e/side-panel.spec.ts
index a1f81a9730c..b010c8eef2c 100644
--- a/e2e/side-panel.spec.ts
+++ b/e2e/side-panel.spec.ts
@@ -9,10 +9,8 @@ test.beforeEach(async ({ page }) => {
test.describe('Challenge Side Panel Component', () => {
test('should render correctly', async ({ page, isMobile }) => {
- const toolPanelItem = page.getByText(translations.buttons['get-help']);
if (isMobile) {
- await expect(toolPanelItem).not.toBeVisible();
- } else {
+ const toolPanelItem = page.getByText(translations.buttons['get-help']);
await expect(toolPanelItem).toBeVisible();
}
await expect(page.getByTestId('challenge-title')).toBeVisible();
diff --git a/e2e/test-suite.spec.ts b/e2e/test-suite.spec.ts
index cf762b0ab52..a573fc70693 100644
--- a/e2e/test-suite.spec.ts
+++ b/e2e/test-suite.spec.ts
@@ -5,7 +5,9 @@ const runChallengeTest = async (page: Page, isMobile: boolean) => {
if (isMobile) {
await page.getByText('Run').click();
} else {
- await page.getByText('Run the Tests (Ctrl + Enter)').click();
+ await page
+ .getByRole('button', { name: translations.buttons['check-code'] })
+ .click();
}
};
diff --git a/e2e/tool-panel.spec.ts b/e2e/tool-panel.spec.ts
index f30fc16c5c9..b9a47a97bab 100644
--- a/e2e/tool-panel.spec.ts
+++ b/e2e/tool-panel.spec.ts
@@ -11,19 +11,22 @@ test.describe('Tool Panel', () => {
page,
isMobile
}) => {
- await page
- .getByRole('button', {
- name: 'Run',
- exact: false
- })
- .click();
-
if (isMobile) {
+ await page
+ .getByRole('button', {
+ name: 'Run',
+ exact: false
+ })
+ .click();
await page
.getByRole('tab', {
name: 'Console'
})
.click();
+ } else {
+ await page
+ .getByRole('button', { name: translations.buttons['check-code'] })
+ .click();
}
await expect(page.getByTestId('output-text')).toContainText(
@@ -41,7 +44,7 @@ test.describe('Tool Panel', () => {
.click();
} else {
await page
- .getByRole('button', { name: translations.buttons['reset-lesson'] })
+ .getByRole('button', { name: translations.buttons.reset })
.click();
}
await expect(
@@ -50,8 +53,10 @@ test.describe('Tool Panel', () => {
});
test('should display list with expected links after clicking "Get Help"', async ({
- page
+ page,
+ isMobile
}) => {
+ test.skip(!isMobile, 'Help dropdown only available on mobile');
const expectedHelpLinks = [
`${translations.buttons['get-hint']} , ${translations.aria['opens-new-window']}`,
translations.buttons['watch-video'],
diff --git a/e2e/video-modal.spec.ts b/e2e/video-modal.spec.ts
index acc158049e6..9fda352b596 100644
--- a/e2e/video-modal.spec.ts
+++ b/e2e/video-modal.spec.ts
@@ -4,13 +4,18 @@ import translations from '../client/i18n/locales/english/translations.json';
const currentUrlPath =
'/learn/responsive-web-design/responsive-web-design-principles/create-a-media-query';
-test.beforeEach(async ({ page }) => {
- await page.goto(currentUrlPath);
- await page.getByTestId('get-help-dropdown').click();
- await page.getByTestId('watch-a-video').click();
-});
+test.describe('Exit Video Modal E2E Test Suite - Mobile', () => {
+ test.use({
+ viewport: { width: 393, height: 851 },
+ isMobile: true
+ });
+
+ test.beforeEach(async ({ page }) => {
+ await page.goto(currentUrlPath);
+ await page.getByTestId('get-help-dropdown').click();
+ await page.getByTestId('watch-a-video').click();
+ });
-test.describe('Exit Video Modal E2E Test Suite', () => {
test('Verifies the Correct Rendering of the Video Modal', async ({
page
}) => {
@@ -44,3 +49,48 @@ test.describe('Exit Video Modal E2E Test Suite', () => {
await expect(dialog).not.toBeVisible();
});
});
+
+test.describe('Exit Video Modal E2E Test Suite - Desktop', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto(currentUrlPath);
+ // Open help modal via independent lower jaw
+ await page.getByRole('button', { name: translations.buttons.help }).click();
+ // Click watch video link from help modal
+ await page.getByTestId('watch-a-video-modal-button').click();
+ });
+
+ test('Verifies the Correct Rendering of the Video Modal on Desktop', async ({
+ page
+ }) => {
+ const dialog = page.getByRole('dialog', {
+ name: translations.buttons['watch-video']
+ });
+
+ await expect(dialog).toBeVisible();
+ await expect(
+ page.getByTestId('video-modal-video-player-iframe')
+ ).toBeVisible();
+ await expect(
+ page.getByText(translations.learn['scrimba-tip'])
+ ).toBeVisible();
+ await expect(
+ dialog.getByRole('button', { name: translations.buttons.close })
+ ).toBeVisible();
+ });
+
+ test('Closes the Video Modal When the User clicks on exit button on Desktop', async ({
+ page
+ }) => {
+ const dialog = page.getByRole('dialog', {
+ name: translations.buttons['watch-video']
+ });
+
+ await expect(dialog).toBeVisible();
+
+ await dialog
+ .getByRole('button', { name: translations.buttons.close })
+ .click();
+
+ await expect(dialog).not.toBeVisible();
+ });
+});