diff --git a/tests/e2e/attempt-to-create-session-with-invalid-number-of-participants-less-than-2.e2e.test.ts b/tests/e2e/attempt-to-create-session-with-invalid-number-of-participants-less-than-2.e2e.test.ts new file mode 100644 index 0000000..ece4f95 --- /dev/null +++ b/tests/e2e/attempt-to-create-session-with-invalid-number-of-participants-less-than-2.e2e.test.ts @@ -0,0 +1,31 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Session Creation', () => { + test('Attempt to Create Session with Invalid Number of Participants (Less than 2)', async ({ page }) => { + // Ensure the user is logged in and on the session creation page. + await page.goto('https://unisono.aglink.duckdns.org/login'); + await page.getByRole('textbox', { name: 'Passphrase' }).fill('HonorableHumansPrivilegeIsToBeAllowedHere'); + await page.getByRole('button', { name: 'Enter' }).click(); + await expect(page).toHaveURL(/.*\/session\/.*/); + + // 2. Enter a valid topic (e.g., "Project Alpha Planning") into the "Topic" textbox. + await page.getByRole('textbox', { name: 'Topic' }).fill('Project Alpha Planning'); + + // 3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. + await page.getByRole('textbox', { name: 'Details (Optional)' }).fill('Discuss Q4 goals and allocate resources'); + + // 4. Enter "1" into the "Number of Expected Responses" spinbutton. + await page.getByRole('spinbutton', { name: 'Number of Expected Responses' }).fill('1'); + + // 5. Click the "Start Session" button. + await page.getByRole('button', { name: 'Start Session' }).click(); + + // Expected Results: + // - An error message indicating that the number of participants must be at least 2 is displayed. + await expect(page.getByText('Must be an integer between 2 and 12')).toBeVisible(); + + // - The session is not created, and the user remains on the session creation page. + await expect(page).toHaveURL(/.*\/session\/.*/); + await expect(page.getByRole('heading', { name: 'Harmonize Desires' })).toBeVisible(); + }); +}); diff --git a/tests/e2e/attempt-to-create-session-with-invalid-number-of-participants-more-than-12.e2e.test.ts b/tests/e2e/attempt-to-create-session-with-invalid-number-of-participants-more-than-12.e2e.test.ts new file mode 100644 index 0000000..cc32d54 --- /dev/null +++ b/tests/e2e/attempt-to-create-session-with-invalid-number-of-participants-more-than-12.e2e.test.ts @@ -0,0 +1,31 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Session Creation', () => { + test('Attempt to Create Session with Invalid Number of Participants (More than 12)', async ({ page }) => { + // Ensure the user is logged in and on the session creation page. + await page.goto('https://unisono.aglink.duckdns.org/login'); + await page.getByRole('textbox', { name: 'Passphrase' }).fill('HonorableHumansPrivilegeIsToBeAllowedHere'); + await page.getByRole('button', { name: 'Enter' }).click(); + await expect(page).toHaveURL(/.*\/session\/.*/); + + // 2. Enter a valid topic (e.g., "Project Alpha Planning") into the "Topic" textbox. + await page.getByRole('textbox', { name: 'Topic' }).fill('Project Alpha Planning'); + + // 3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. + await page.getByRole('textbox', { name: 'Details (Optional)' }).fill('Discuss Q4 goals and allocate resources'); + + // 4. Enter "13" into the "Number of Expected Responses" spinbutton. + await page.getByRole('spinbutton', { name: 'Number of Expected Responses' }).fill('13'); + + // 5. Click the "Start Session" button. + await page.getByRole('button', { name: 'Start Session' }).click(); + + // Expected Results: + // - An error message indicating that the number of participants cannot exceed 12 is displayed. + await expect(page.getByText('Must be an integer between 2 and 12')).toBeVisible(); + + // - The session is not created, and the user remains on the session creation page. + await expect(page).toHaveURL(/.*\/session\/.*/); + await expect(page.getByRole('heading', { name: 'Harmonize Desires' })).toBeVisible(); + }); +}); diff --git a/tests/e2e/attempt-to-create-session-with-missing-topic.e2e.test.ts b/tests/e2e/attempt-to-create-session-with-missing-topic.e2e.test.ts new file mode 100644 index 0000000..443efd9 --- /dev/null +++ b/tests/e2e/attempt-to-create-session-with-missing-topic.e2e.test.ts @@ -0,0 +1,31 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Session Creation', () => { + test('Attempt to Create Session with Missing Topic', async ({ page }) => { + // Ensure the user is logged in and on the session creation page. + await page.goto('https://unisono.aglink.duckdns.org/login'); + await page.getByRole('textbox', { name: 'Passphrase' }).fill('HonorableHumansPrivilegeIsToBeAllowedHere'); + await page.getByRole('button', { name: 'Enter' }).click(); + await expect(page).toHaveURL(/.*\/session\/.*/); + + // 2. Leave the "Topic" textbox empty. + // (This step is implicitly handled by not filling the topic field) + + // 3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. + await page.getByRole('textbox', { name: 'Details (Optional)' }).fill('Discuss Q4 goals and allocate resources'); + + // 4. Enter a valid number of participants (e.g., "3") into the "Number of Expected Responses" spinbutton. + await page.getByRole('spinbutton', { name: 'Number of Expected Responses' }).fill('3'); + + // 5. Click the "Start Session" button. + await page.getByRole('button', { name: 'Start Session' }).click(); + + // Expected Results: + // - An error message indicating that the "Topic" field is required is displayed. + await expect(page.getByText('Topic is required')).toBeVisible(); + + // - The session is not created, and the user remains on the session creation page. + await expect(page).toHaveURL(/.*\/session\/.*/); + await expect(page.getByRole('heading', { name: 'Harmonize Desires' })).toBeVisible(); + }); +}); diff --git a/tests/e2e/create-session-with-valid-data.e2e.test.ts b/tests/e2e/create-session-with-valid-data.e2e.test.ts new file mode 100644 index 0000000..ecb286b --- /dev/null +++ b/tests/e2e/create-session-with-valid-data.e2e.test.ts @@ -0,0 +1,36 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Session Creation', () => { + test('Create Session with Valid Data', async ({ page }) => { + // Ensure the user is logged in and on the session creation page. + await page.goto('https://unisono.aglink.duckdns.org/login'); + await page.getByRole('textbox', { name: 'Passphrase' }).fill('HonorableHumansPrivilegeIsToBeAllowedHere'); + await page.getByRole('button', { name: 'Enter' }).click(); + await expect(page).toHaveURL(/.*\/session\/.*/); + + // 2. Enter a valid topic (e.g., "Project Alpha Planning") into the "Topic" textbox. + await page.getByRole('textbox', { name: 'Topic' }).fill('Project Alpha Planning'); + + // 3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. + await page.getByRole('textbox', { name: 'Details (Optional)' }).fill('Discuss Q4 goals and allocate resources'); + + // 4. Enter a valid number of participants (e.g., "3") into the "Number of Expected Responses" spinbutton. + await page.getByRole('spinbutton', { name: 'Number of Expected Responses' }).fill('3'); + + // 5. Click the "Start Session" button. + await page.getByRole('button', { name: 'Start Session' }).click(); + + // Expected Results: + // - A new session is created. + // - The user is redirected to the active session page. + await expect(page).toHaveURL(/.*\/session\/.*/); + + // - The session details (Topic, Details, Number of Expected Responses) are displayed correctly. + await expect(page.getByRole('heading', { name: 'Project Alpha Planning' })).toBeVisible(); + await expect(page.getByText('Details: Discuss Q4 goals and allocate resources')).toBeVisible(); + await expect(page.getByText('Expected Responses: 3')).toBeVisible(); + + // - A "Copy Link" button is visible. + await expect(page.getByRole('button', { name: 'Copy Link' })).toBeVisible(); + }); +}); diff --git a/tests/e2e/successful-login-with-valid-passphrase.e2e.test.ts b/tests/e2e/successful-login-with-valid-passphrase.e2e.test.ts new file mode 100644 index 0000000..4a50c84 --- /dev/null +++ b/tests/e2e/successful-login-with-valid-passphrase.e2e.test.ts @@ -0,0 +1,27 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Authentication', () => { + test('Successful Login with Valid Passphrase', async ({ page }) => { + // 1. Navigate to the application URL + await page.goto('https://unisono.aglink.duckdns.org'); + + // 2. On the login page, enter the valid AUTH_PASSPHRASE into the "Passphrase" textbox. + await page.getByRole('textbox', { name: 'Passphrase' }).fill('HonorableHumansPrivilegeIsToBeAllowedHere'); + + // 3. Click the "Enter" button. + await page.getByRole('button', { name: 'Enter' }).click(); + + // Expected Results: + // - The user is redirected to a new session creation page (e.g., /session/). + await expect(page).toHaveURL(/.*\/session\/.*/); + + // - The "Harmonize Desires" heading is visible. + await expect(page.getByRole('heading', { name: 'Harmonize Desires' })).toBeVisible(); + + // - The session creation form (Topic, Details, Number of Expected Responses, Start Session button) is displayed. + await expect(page.getByRole('textbox', { name: 'Topic' })).toBeVisible(); + await expect(page.getByRole('textbox', { name: 'Details (Optional)' })).toBeVisible(); + await expect(page.getByRole('spinbutton', { name: 'Number of Expected Responses' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'Start Session' })).toBeVisible(); + }); +}); diff --git a/tests/e2e/unsuccessful-login-with-invalid-passphrase.e2e.test.ts b/tests/e2e/unsuccessful-login-with-invalid-passphrase.e2e.test.ts new file mode 100644 index 0000000..bdd663f --- /dev/null +++ b/tests/e2e/unsuccessful-login-with-invalid-passphrase.e2e.test.ts @@ -0,0 +1,21 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Authentication', () => { + test('Unsuccessful Login with Invalid Passphrase', async ({ page }) => { + // 1. Navigate to the application URL + await page.goto('https://unisono.aglink.duckdns.org/login'); + + // 2. On the login page, enter an invalid passphrase (e.g., "incorrect-passphrase") into the "Passphrase" textbox. + await page.getByRole('textbox', { name: 'Passphrase' }).fill('incorrect-passphrase'); + + // 3. Click the "Enter" button. + await page.getByRole('button', { name: 'Enter' }).click(); + + // Expected Results: + // - An error message indicating invalid credentials is displayed. + await expect(page.locator('.MuiAlert-standardError', { hasText: 'Invalid passphrase' })).toBeVisible(); + + // - The user remains on the login page. + await expect(page).toHaveURL(/.*\/login/); + }); +}); diff --git a/tests/unisono-test-plan.md b/tests/unisono-test-plan.md new file mode 100644 index 0000000..21fc6c3 --- /dev/null +++ b/tests/unisono-test-plan.md @@ -0,0 +1,93 @@ +# Unisono Application - Comprehensive Test Plan + +## Application Overview + +The Unisono application facilitates harmonizing desires among participants through real-time collaboration. Users can create sessions, define a topic and optional details, specify the number of expected responses, and then share a link for others to join. The application uses a passphrase for authentication. + +## Test Scenarios + +### 1. Authentication + +#### 1.1 Successful Login with Valid Passphrase +**Steps:** +1. Navigate to the application URL (e.g., `https://unisono.aglink.duckdns.org`). +2. On the login page, enter the valid `AUTH_PASSPHRASE` into the "Passphrase" textbox. +3. Click the "Enter" button. + +**Expected Results:** +- The user is redirected to a new session creation page (e.g., `/session/`). +- The "Harmonize Desires" heading is visible. +- The session creation form (Topic, Details, Number of Expected Responses, Start Session button) is displayed. + +#### 1.2 Unsuccessful Login with Invalid Passphrase +**Steps:** +1. Navigate to the application URL (e.g., `https://unisono.aglink.duckdns.org`). +2. On the login page, enter an invalid passphrase (e.g., "incorrect-passphrase") into the "Passphrase" textbox. +3. Click the "Enter" button. + +**Expected Results:** +- An error message indicating invalid credentials is displayed. +- The user remains on the login page. + +### 2. Session Creation + +#### 2.1 Create Session with Valid Data +**Steps:** +1. Ensure the user is logged in and on the session creation page. +2. Enter a valid topic (e.g., "Project Alpha Planning") into the "Topic" textbox. +3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. +4. Enter a valid number of participants (e.g., "3") into the "Number of Expected Responses" spinbutton. +5. Click the "Start Session" button. + +**Expected Results:** +- A new session is created. +- The user is redirected to the active session page. +- The session details (Topic, Details, Number of Expected Responses) are displayed correctly. +- A "Copy Link" button is visible. + +#### 2.2 Attempt to Create Session with Missing Topic +**Steps:** +1. Ensure the user is logged in and on the session creation page. +2. Leave the "Topic" textbox empty. +3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. +4. Enter a valid number of participants (e.g., "3") into the "Number of Expected Responses" spinbutton. +5. Click the "Start Session" button. + +**Expected Results:** +- An error message indicating that the "Topic" field is required is displayed. +- The session is not created, and the user remains on the session creation page. + +#### 2.3 Attempt to Create Session with Invalid Number of Participants (Less than 2) +**Steps:** +1. Ensure the user is logged in and on the session creation page. +2. Enter a valid topic (e.g., "Project Alpha Planning") into the "Topic" textbox. +3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. +4. Enter "1" into the "Number of Expected Responses" spinbutton. +5. Click the "Start Session" button. + +**Expected Results:** +- An error message indicating that the number of participants must be at least 2 is displayed. +- The session is not created, and the user remains on the session creation page. + +#### 2.4 Attempt to Create Session with Invalid Number of Participants (More than 12) +**Steps:** +1. Ensure the user is logged in and on the session creation page. +2. Enter a valid topic (e.g., "Project Alpha Planning") into the "Topic" textbox. +3. Enter optional details (e.g., "Discuss Q4 goals and allocate resources") into the "Details (Optional)" textbox. +4. Enter "13" into the "Number of Expected Responses" spinbutton. +5. Click the "Start Session" button. + +**Expected Results:** +- An error message indicating that the number of participants cannot exceed 12 is displayed. +- The session is not created, and the user remains on the session creation page. + +### 3. Copy Link Feature + +#### 3.1 Verify Copy Link Button Functionality +**Steps:** +1. Ensure a session has been successfully created and the user is on the active session page. +2. Click the "Copy Link" button. + +**Expected Results:** +- A success message (e.g., "Link copied to clipboard!") is displayed. +- The session URL is copied to the clipboard.