diff --git a/client/src/templates/Challenges/components/completion-modal.tsx b/client/src/templates/Challenges/components/completion-modal.tsx
index 15d3b2e8f29..c131df70666 100644
--- a/client/src/templates/Challenges/components/completion-modal.tsx
+++ b/client/src/templates/Challenges/components/completion-modal.tsx
@@ -200,6 +200,7 @@ class CompletionModal extends Component<
diff --git a/e2e/completion-model.spec.ts b/e2e/completion-model.spec.ts
new file mode 100644
index 00000000000..d504082d89a
--- /dev/null
+++ b/e2e/completion-model.spec.ts
@@ -0,0 +1,83 @@
+import { test, expect } from '@playwright/test';
+import translations from '../client/i18n/locales/english/translations.json';
+
+test.beforeEach(async ({ page }) => {
+ await page.goto(
+ '/learn/scientific-computing-with-python/scientific-computing-with-python-projects/arithmetic-formatter'
+ );
+ await page.getByLabel('Solution Link').fill('https://example.com');
+ await page
+ .getByRole('button', { name: "I've completed this challenge" })
+ .click();
+});
+
+test.afterEach(async ({ page }) => {
+ await page.close();
+});
+
+test.describe('Challenge Completion Modal Tests (Signed Out)', () => {
+ test('should render the modal correctly', async ({ page }) => {
+ await expect(page.getByRole('heading')).toBeVisible();
+ await expect(page.getByRole('button', { name: 'close' })).toBeVisible();
+ await expect(page.getByTestId('completion-success-icon')).toBeVisible();
+ await expect(page.getByTestId('progress-bar-container')).toBeVisible();
+ await expect(
+ page.getByRole('link', { name: translations.learn['sign-in-save'] })
+ ).toBeVisible();
+ await expect(
+ page.getByRole('button', { name: translations.buttons['go-to-next'] })
+ ).toBeVisible();
+ });
+
+ test('should close the modal after user click on close', async ({ page }) => {
+ await page.getByRole('button', { name: 'close' }).click();
+ await expect(page.getByTestId('completion-success-icon')).not.toBeVisible();
+ });
+
+ test('should redirect to /learn after sign in', async ({ page }) => {
+ await page
+ .getByRole('link', { name: translations.learn['sign-in-save'] })
+ .click();
+ await expect(page).toHaveURL(/.*\/learn\/?$/);
+ });
+
+ test('should redirect to next challenge', async ({ page }) => {
+ await page
+ .getByRole('button', { name: translations.buttons['go-to-next'] })
+ .click();
+ await expect(page).toHaveURL(
+ 'http://localhost:8000/learn/scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator'
+ );
+ });
+});
+
+test.describe('Challenge Completion Modal Tests (Signed In)', () => {
+ test.use({ storageState: 'playwright/.auth/certified-user.json' });
+
+ test('should render the modal correctly', async ({ page }) => {
+ await expect(page.getByRole('heading')).toBeVisible();
+ await expect(page.getByRole('button', { name: 'close' })).toBeVisible();
+ await expect(page.getByTestId('completion-success-icon')).toBeVisible();
+ await expect(page.getByTestId('progress-bar-container')).toBeVisible();
+ await expect(
+ page.getByRole('link', { name: translations.learn['sign-in-save'] })
+ ).not.toBeVisible();
+ await expect(
+ page.getByRole('button', { name: translations.buttons['submit-and-go'] })
+ ).toBeVisible();
+ });
+
+ test('should close the modal after user click on close', async ({ page }) => {
+ await page.getByRole('button', { name: 'close' }).click();
+ await expect(page.getByTestId('completion-success-icon')).not.toBeVisible();
+ });
+
+ test('should redirect to next challenge', async ({ page }) => {
+ await page
+ .getByRole('button', { name: translations.buttons['submit-and-go'] })
+ .click();
+ await expect(page).toHaveURL(
+ 'http://localhost:8000/learn/scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator'
+ );
+ });
+});