Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added End-to-End test cases for All pages #978

Merged
merged 7 commits into from
Mar 3, 2025

Conversation

Rajgupta36
Copy link
Collaborator

@Rajgupta36 Rajgupta36 commented Mar 2, 2025

Resolves #944

  • Added Around 60 Test Cases that are compatible with all three browsers.

  • Implemented test cases for the following pages:

    • ChapterPage
    • ProjectPage
    • CommitteesPage
    • UsersPage
    • ContributePage
    • ChapterDetailsPage
    • CommitteeDetailsPage
    • ProjectDetailsPage
    • RepositoryDetailsPage
    • UserDetailsPage

Cross-Browser Testing:

  • Verified that all tests pass on different browsers (Chrome, Firefox, etc.) to ensure consistent behavior across browsers.

Copy link
Contributor

coderabbitai bot commented Mar 2, 2025

Summary by CodeRabbit

  • Tests
    • Expanded automated testing across key pages—such as chapter, committee, project, repository, and user sections—to ensure accurate content display and seamless navigation.
    • Validations confirm proper rendering of headings, summaries, empty state messages, pagination, and interactive elements, helping maintain a consistent and reliable user experience.

Walkthrough

This pull request introduces new end-to-end test suites using Playwright for various page components. The tests simulate user interactions by setting up mock API and GraphQL responses, ensuring proper rendering and functionality across detail and overview/list pages. Key functionalities tested include visibility of headings, summaries, details blocks, conditional messaging, pagination, and navigational interactions. A dedicated suite for the Contribute page is included, which tests dialog behaviors. No changes were made to the declarations of exported or public entities.

Changes

Files Change Summary
frontend/.../ChapterDetails.spec.ts, frontend/.../CommitteeDetails.spec.ts, frontend/.../ProjectDetails.spec.ts, frontend/.../RepositoryDetails.spec.ts, frontend/.../UserDetails.spec.ts New test suites for detail pages. Each suite uses Playwright with mocked GraphQL responses to verify the visibility of headings, summaries, details blocks, statistics, contributors, and interactive elements.
frontend/.../Chapters.spec.tsx, frontend/.../Committees.spec.ts, frontend/.../Projects.spec.ts, frontend/.../Users.spec.tsx New test suites for list/overview pages. They validate proper data rendering, display of empty state messages, pagination functionality, and navigation to detail pages using mocked API responses.
frontend/.../Contribute.spec.ts New test suite for the Contribute page. It tests issue rendering, empty state handling, pagination, dialog interactions, and closure functionality.
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (8)
frontend/__tests__/e2e/pages/Chapters.spec.tsx (1)

44-48: Rename variable for clarity

The variable name contributeButton doesn't match its purpose - it's actually referencing the "View Details" button. Consider renaming it to improve code readability.

- const contributeButton = await page.getByRole('button', { name: 'View Details' })
- await contributeButton.click()
+ const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
+ await viewDetailsButton.click()
frontend/__tests__/e2e/pages/user.spec.tsx (1)

42-49: Variable name doesn't match its purpose.

The variable name contributeButton doesn't accurately reflect that it's a user view button. Consider renaming for better code readability.

-   const contributeButton = await page.getByRole('button', {
+   const viewUserButton = await page.getByRole('button', {
      name: 'John Doe John Doe OWASP View',
    })
-   await contributeButton.click()
+   await viewUserButton.click()
frontend/__tests__/e2e/pages/Committees.spec.ts (2)

4-4: Test describe name should be capitalized for consistency.

The test describe name uses lowercase 'committees' which doesn't match the standard capitalization used in other test files.

-test.describe('committees Page Component', () => {
+test.describe('Committees Page Component', () => {

44-49: Variable name doesn't match its purpose.

The variable name contributeButton doesn't accurately reflect that it's a "Learn more" button. Consider renaming for better code readability.

-   const contributeButton = await page.getByRole('button', { name: 'Learn more about Committee' })
+   const learnMoreButton = await page.getByRole('button', { name: 'Learn more about Committee' })
-   await contributeButton.click()
+   await learnMoreButton.click()
frontend/__tests__/e2e/pages/Project.spec.ts (2)

25-25: Fix test description to match implementation.

The test description refers to "No Project found" (singular), but the implementation checks for "No projects found" (plural). Make the description consistent with the implementation.

-  test('displays "No Project found" when there are no project', async ({ page }) => {
+  test('displays "No projects found" when there are no projects', async ({ page }) => {

44-49: Variable name doesn't match its purpose.

The variable name contributeButton doesn't accurately reflect that it's a "View Details" button. Consider renaming for better code readability.

-   const contributeButton = await page.getByRole('button', { name: 'View Details' })
+   const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
-   await contributeButton.click()
+   await viewDetailsButton.click()
frontend/__tests__/e2e/pages/Contribute.spec.ts (2)

45-61: Using a hardcoded dialog ID may lead to brittle tests

The dialog selector [id="dialog\\:\\:r3\\:\\:positioner"] appears to contain a generated ID that might change between runs or environments.

Consider using a more stable selector that doesn't rely on potentially dynamic IDs. For example, use a data attribute specifically for testing:

- page.locator('[id="dialog\\:\\:r3\\:\\:positioner"]').getByText('Contribution 1', { exact: true })
+ page.getByTestId('contribution-dialog').getByText('Contribution 1', { exact: true })

This would require adding a data-testid="contribution-dialog" attribute to your dialog component.


68-68: Follow JavaScript naming conventions

Variable names should use camelCase for consistency with JavaScript/TypeScript conventions.

- const CloseButton = await page.getByRole('button', { name: 'close-modal' })
+ const closeButton = await page.getByRole('button', { name: 'close-modal' })
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bfba31f and 5b4befc.

📒 Files selected for processing (10)
  • frontend/__tests__/e2e/pages/ChapterDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Chapters.spec.tsx (1 hunks)
  • frontend/__tests__/e2e/pages/CommitteeDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Committees.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Contribute.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Project.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/UserDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/user.spec.tsx (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: CodeQL (python)
  • GitHub Check: Run frontend unit tests
  • GitHub Check: Run frontend e2e tests
  • GitHub Check: CodeQL (javascript-typescript)
  • GitHub Check: Run backend tests
🔇 Additional comments (18)
frontend/__tests__/e2e/pages/UserDetails.spec.ts (2)

1-37: Comprehensive test suite with good structure!

This is a well-structured test suite for the UserDetails page that appropriately tests the visibility of all key UI elements. I like how you've organized the tests into logical groups that align with the different sections of the page.

The use of getByRole selectors is excellent for accessibility-driven testing, and the beforeEach hook provides a clean way to set up the mock data and navigation.


28-28: Verify the hardcoded date format

The test is checking for a specific date format "8/7/2024" which appears to be a future date. Consider using a more generic date matcher or ensuring this matches your expected date format across browsers and locales.

frontend/__tests__/e2e/pages/ChapterDetails.spec.ts (2)

1-49: Well-structured chapter details tests

This is a thorough test suite that covers all the important UI elements and interactions on the ChapterDetails page. The tests are logically organized and follow best practices for Playwright testing.

The interactive test for toggling contributors visibility (lines 43-49) is especially valuable as it verifies both the UI state changes and user interactions.


25-31: Comprehensive map testing approach

Excellent job testing the map component thoroughly, including the zoom controls and marker. This level of detail ensures the interactive map functionality works as expected.

frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1)

1-79: Comprehensive test coverage for repository details

This test suite provides excellent coverage of the RepositoryDetails page, checking all major UI components and interactions. The organization into distinct test cases for each section of the page makes the tests clear and maintainable.

frontend/__tests__/e2e/pages/Chapters.spec.tsx (1)

1-49: Well-structured tests for Chapters page

Good job creating a comprehensive test suite that covers rendering, empty states, pagination, and navigation. The tests are well-organized and follow best practices.

frontend/__tests__/e2e/pages/user.spec.tsx (2)

1-15: Well-structured test setup for UserPage component.

The beforeEach hook correctly mocks API responses with user data which is good practice for isolated testing.


17-21: LGTM! Good validation of rendered user data.

The test properly validates that user buttons are visible after page load.

frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (1)

1-100: Excellent comprehensive test coverage.

This test suite thoroughly covers all aspects of the ProjectDetails page, including headings, details, statistics, topics, languages, contributors, issues, releases, and repositories. The toggle functionality test is particularly valuable for interactive elements.

frontend/__tests__/e2e/pages/CommitteeDetails.spec.ts (4)

1-12: Test setup looks well-structured

The test setup correctly mocks GraphQL responses and navigates to the appropriate page, following best practices for isolated frontend testing.


13-16: Simple and effective test for core elements

This test appropriately verifies the main heading and summary text using accessibility-friendly selectors.


18-23: Test effectively validates committee details

The committee details test effectively validates all expected elements. However, I noticed that the date is set to "Dec 13, 2024," which is in the future.

Consider using a past or present date in the mock data to avoid potential test failures when the future date becomes invalid.


25-33: Well-structured top contributors test

The test properly verifies all elements of the top contributors section, including images, names, and contribution counts.

frontend/__tests__/e2e/pages/Contribute.spec.ts (5)

4-15: Setup correctly mocks API responses

The test setup properly intercepts API requests and provides mock data, isolating the frontend for testing.


17-24: Good verification of rendered content

The test effectively checks that all expected elements are visible when issue data is available.


26-36: Excellent empty state handling

Good practice to override the default mock with empty data to test the "No issues found" scenario.


38-43: Pagination test is concise and effective

This test clearly verifies that pagination functionality updates the URL correctly.


63-72: Good dialog interaction testing

This test effectively verifies that the dialog can be closed and the original button remains visible afterward.

Comment on lines 72 to 73
test('should have recent releases', async ({ page }) => {
await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix incorrect heading assertion in recent releases test

The test is asserting for "Recent Issues" heading when it should be checking for "Recent Releases" since this is the releases section test.

- await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
+ await expect(page.getByRole('heading', { name: 'Recent Releases' })).toBeVisible()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('should have recent releases', async ({ page }) => {
await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
test('should have recent releases', async ({ page }) => {
- await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
+ await expect(page.getByRole('heading', { name: 'Recent Releases' })).toBeVisible()

Comment on lines 23 to 33
test('displays "No user found" when there are no users', async ({ page }) => {
await page.route('**/idx/', async (route) => {
await route.fulfill({
status: 200,
body: JSON.stringify({ hits: [], totalPages: 0 }),
})
})

await page.goto('/community/users')
await expect(page.getByText('No Users Found')).toBeVisible()
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix response field inconsistency in empty state test.

The mock response uses totalPages in the empty state test, but nbPages is used in the beforeEach hook. This inconsistency might cause issues if the component expects a specific field.

        body: JSON.stringify({ hits: [], totalPages: 0 }),
+        body: JSON.stringify({ hits: [], nbPages: 0 }),

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines 25 to 32
test('displays "No committees found" when there are no committees', async ({ page }) => {
await page.route('**/idx/', async (route) => {
await route.fulfill({
status: 200,
body: JSON.stringify({ hits: [], totalPages: 0 }),
})
})

await page.goto('/committees')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix response field inconsistency in empty state test.

The mock response uses totalPages in the empty state test, but nbPages is used in the beforeEach hook. This inconsistency might cause issues if the component expects a specific field.

        body: JSON.stringify({ hits: [], totalPages: 0 }),
+        body: JSON.stringify({ hits: [], nbPages: 0 }),

Committable suggestion skipped: line range outside the PR's diff.

})

await page.goto('/committees')
await expect(page.getByText('No committees Found')).toBeVisible()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify error message text matches implementation.

The test expects "No committees Found" with a capital 'F', which might not match the actual implementation. Consider verifying this matches the exact text in the component.


🏁 Script executed:

#!/bin/bash
# Check how "no items found" messages are formatted in the codebase
rg -i "no .* found" --glob "*.tsx" frontend/

Length of output: 2223


Mismatch in error message casing for Committees page
The e2e test in frontend/__tests__/e2e/pages/Committees.spec.ts is currently checking for 'No committees Found', but the component in frontend/src/pages/Committees.tsx (and the corresponding unit tests) use 'No committees found' (with a lowercase "f"). Please update the test assertion to match the exact casing from the component.

  • Action: Change line 34 from:
        - await expect(page.getByText('No committees Found')).toBeVisible()
        + await expect(page.getByText('No committees found')).toBeVisible()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
await expect(page.getByText('No committees Found')).toBeVisible()
await expect(page.getByText('No committees found')).toBeVisible()

await page.goto('/projects')
await expect(page.getByRole('link', { name: 'Project 1' })).toBeVisible()
await expect(page.getByText('This is a summary of Project 1')).toBeVisible()
await expect(page.getByRole('link', { name: "undefined's avatar" })).toBeVisible()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix undefined avatar name in test assertion.

The test is looking for an avatar with the name "undefined's avatar", which indicates a potential issue with the mock data. This will likely fail in actual tests.

Verify and update the mock data to provide proper avatar information, then update this assertion to match the expected avatar name.

Comment on lines 25 to 30
test('displays "No Project found" when there are no project', async ({ page }) => {
await page.route('**/idx/', async (route) => {
await route.fulfill({
status: 200,
body: JSON.stringify({ hits: [], totalPages: 0 }),
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix response field inconsistency in empty state test.

The mock response uses totalPages in the empty state test, but nbPages is used in the beforeEach hook. This inconsistency might cause issues if the component expects a specific field.

        body: JSON.stringify({ hits: [], totalPages: 0 }),
+        body: JSON.stringify({ hits: [], nbPages: 0 }),

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines 97 to 99
await page.getByText('Repo One').click()
expect(expect(page.url()).toContain('repositories/repo-1'))
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix doubled expect statement in URL verification.

The statement has nested expects which is unnecessary and potentially confusing.

-   expect(expect(page.url()).toContain('repositories/repo-1'))
+   expect(page.url()).toContain('repositories/repo-1')
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
await page.getByText('Repo One').click()
expect(expect(page.url()).toContain('repositories/repo-1'))
})
await page.getByText('Repo One').click()
expect(page.url()).toContain('repositories/repo-1')
})

Comment on lines 76 to 82
test('should have project recent releases', async ({ page }) => {
await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
await expect(page.getByRole('heading', { name: 'V1.2.0' })).toBeVisible()
await expect(page.getByRole('img', { name: 'Charlie Dev' })).toBeVisible()
await expect(page.getByText('Charlie Dev')).toBeVisible()
await expect(page.getByText('Jan 20, 2025')).toBeVisible()
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix incorrect heading assertion in recent releases test.

The test is checking for "Recent Issues" heading when it should be checking for "Recent Releases" since this test is for recent releases functionality.

-   await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
+   await expect(page.getByRole('heading', { name: 'Recent Releases' })).toBeVisible()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('should have project recent releases', async ({ page }) => {
await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible()
await expect(page.getByRole('heading', { name: 'V1.2.0' })).toBeVisible()
await expect(page.getByRole('img', { name: 'Charlie Dev' })).toBeVisible()
await expect(page.getByText('Charlie Dev')).toBeVisible()
await expect(page.getByText('Jan 20, 2025')).toBeVisible()
})
test('should have project recent releases', async ({ page }) => {
await expect(page.getByRole('heading', { name: 'Recent Releases' })).toBeVisible()
await expect(page.getByRole('heading', { name: 'V1.2.0' })).toBeVisible()
await expect(page.getByRole('img', { name: 'Charlie Dev' })).toBeVisible()
await expect(page.getByText('Charlie Dev')).toBeVisible()
await expect(page.getByText('Jan 20, 2025')).toBeVisible()
})

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (7)
frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1)

26-26: Fix typo in test description

There's a small typo in the test description.

-  test('should have statics block', async ({ page }) => {
+  test('should have statistics block', async ({ page }) => {
frontend/__tests__/e2e/pages/Projects.spec.ts (1)

24-24: Fix grammatical inconsistency in test description

The test description doesn't match the assertion message. For consistency, either make both singular or both plural.

-  test('displays "No Project found" when there are no project', async ({ page }) => {
+  test('displays "No projects found" when there are no projects', async ({ page }) => {
frontend/__tests__/e2e/pages/Chapters.spec.tsx (1)

42-45: Variable name doesn't match its purpose.

The variable contributeButton is actually a "View Details" button, not a "Contribute" button. This naming inconsistency could lead to confusion.

-  const contributeButton = await page.getByRole('button', { name: 'View Details' })
-  await contributeButton.click()
+  const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
+  await viewDetailsButton.click()
frontend/__tests__/e2e/pages/Committees.spec.ts (2)

4-4: Inconsistent capitalization in test description.

The description begins with lowercase "committees" in the test suite declaration. For consistency with other test files, consider capitalizing the first letter.

-test.describe('committees Page Component', () => {
+test.describe('Committees Page Component', () => {

42-42: Test name doesn't match button functionality.

The test is named "opens window on View Details button click" but the button text is actually "Learn more about Committee". This inconsistency could cause confusion.

-  test('opens window on View Details button click', async ({ page }) => {
+  test('opens committee details on Learn more button click', async ({ page }) => {
frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (2)

28-28: Typo in test description.

The word "statics" should be "statistics" in the test description to accurately reflect what's being tested.

-  test('should have project statics block', async ({ page }) => {
+  test('should have project statistics block', async ({ page }) => {

97-98: Enhance repository navigation test.

The current test only verifies URL changes after clicking on the repository link. Consider adding assertions to verify that the repository details page has loaded correctly.

  await page.getByText('Repo One').click()
  expect(page.url()).toContain('repositories/repo-1')
+  // Wait for navigation to complete and verify repository page content
+  await expect(page.getByRole('heading', { name: 'Repo One' })).toBeVisible()
+  await expect(page.getByText('Repository Details')).toBeVisible()
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5b4befc and b94e6c8.

📒 Files selected for processing (8)
  • frontend/__tests__/e2e/pages/ChapterDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Chapters.spec.tsx (1 hunks)
  • frontend/__tests__/e2e/pages/Committees.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Contribute.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Projects.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Users.spec.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/tests/e2e/pages/Contribute.spec.ts
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: CodeQL (python)
  • GitHub Check: Run frontend e2e tests
  • GitHub Check: CodeQL (javascript-typescript)
  • GitHub Check: Run frontend unit tests
  • GitHub Check: Run backend tests
🔇 Additional comments (6)
frontend/__tests__/e2e/pages/ChapterDetails.spec.ts (1)

1-49: Well-structured test suite for ChapterDetails page

This is a comprehensive test suite that validates all key aspects of the ChapterDetails page. The tests cover:

  • Heading and summary verification
  • Chapter details block content
  • Map with geolocation components
  • Top contributors section
  • UI interaction (show more/less functionality)

The use of specific selectors and clear assertions makes the tests robust and maintainable.

frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1)

72-74: Heading assertion in recent releases test looks correct

The heading assertion for "Recent Releases" is now correct in this test. This matches the previous review comment that was fixed.

frontend/__tests__/e2e/pages/Users.spec.tsx (2)

18-20: Verify user button text assertions

The test is asserting for buttons with the text "John Doe John Doe OWASP View" and "Jane Smith Jane Smith" where the names appear to be duplicated. Please verify this matches the actual UI design.

Is the duplication of names intentional in the UI, or should the test be updated to match the actual button text?


34-38: Test for pagination is well implemented

The pagination test correctly checks both the user interaction (clicking the button) and the expected outcome (URL change).

frontend/__tests__/e2e/pages/Projects.spec.ts (1)

41-45: Good navigation verification test

This test properly verifies that clicking the "View Details" button navigates to the correct project details page.

frontend/__tests__/e2e/pages/Committees.spec.ts (1)

42-43: Variable name doesn't match its purpose.

The variable contributeButton is inconsistent with the button's actual purpose of "Learn more about Committee". This naming mismatch could lead to confusion.

-  const contributeButton = await page.getByRole('button', { name: 'Learn more about Committee' })
-  await contributeButton.click()
+  const learnMoreButton = await page.getByRole('button', { name: 'Learn more about Committee' })
+  await learnMoreButton.click()

})
})
await page.goto('/chapters')
await expect(page.getByText('No Chapters Found')).toBeVisible()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify capitalization consistency in "No Chapters Found" message.

Please verify that the assertion text "No Chapters Found" with capital "C" and "F" matches exactly what's displayed in the actual component. Inconsistent casing could cause test failures.


🏁 Script executed:

#!/bin/bash
# Check how "no chapters found" messages are formatted in the component code
rg -i 'no chapters found' --glob '*.tsx' frontend/src/

Length of output: 122


Fix capitalization inconsistency in the "No Chapters Found" text.

The test in frontend/__tests__/e2e/pages/Chapters.spec.tsx is asserting for 'No Chapters Found', but the component in frontend/src/pages/Chapters.tsx renders it as "No chapters found". Please update one of them so that both the test and the displayed message match exactly.

  • Location(s) to check/update:
    • Test file: frontend/__tests__/e2e/pages/Chapters.spec.tsx (Line 33)
    • Component file: frontend/src/pages/Chapters.tsx

@Rajgupta36 Rajgupta36 changed the title E2e tests for all Added End-to-End test cases for All pages Mar 2, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
frontend/__tests__/e2e/pages/Chapters.spec.tsx (1)

36-40: Consider enhancing pagination test verification.

While testing URL changes is good, consider also verifying that the page content updates after pagination. This would provide stronger assurance that pagination works correctly.

  test('handles page change correctly', async ({ page }) => {
    const nextPageButton = await page.getByRole('button', { name: '2' })
    await nextPageButton.click()
    expect(await page.url()).toContain('page=2')
+   // Verify that the page content updated with page 2 data
+   await expect(page.getByText('Page 2 content')).toBeVisible()
  })
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b94e6c8 and 3cb5bf3.

📒 Files selected for processing (1)
  • frontend/__tests__/e2e/pages/Chapters.spec.tsx (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: CodeQL (python)
  • GitHub Check: Run backend tests
  • GitHub Check: CodeQL (javascript-typescript)
  • GitHub Check: Run frontend unit tests
  • GitHub Check: Run frontend e2e tests
🔇 Additional comments (5)
frontend/__tests__/e2e/pages/Chapters.spec.tsx (5)

1-3: Good test setup with appropriate imports.

The test file is correctly importing Playwright test utilities and mock data. This follows best practices for setting up E2E tests.


4-16: Well-structured test suite with proper API mocking.

The test setup uses Playwright's routing capabilities to mock API responses, which is excellent for creating isolated, deterministic tests. The beforeEach hook ensures a consistent starting point for each test case.


18-23: Good use of accessibility-friendly selectors.

The test uses role-based selectors (getByRole) which is a best practice as it ensures your tests verify elements that are accessible to all users.


25-34: Proper capitalization in "No chapters found" message.

The test correctly uses "No chapters found" with lowercase 'c' and 'f', which matches the component implementation as noted in past review comments.


1-47: Overall well-written test suite with good coverage.

The test suite provides good coverage for the ChaptersPage component, testing rendering, empty state, pagination, and navigation. The tests follow Playwright best practices and are clear and maintainable.

Comment on lines +42 to +46
test('opens window on View Details button click', async ({ page }) => {
const contributeButton = await page.getByRole('button', { name: 'View Details' })
await contributeButton.click()
expect(await page.url()).toContain('chapters/chapter_1')
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Fix variable naming for clarity.

The variable name doesn't match its purpose. It's named contributeButton but it references the "View Details" button.

  test('opens window on View Details button click', async ({ page }) => {
-   const contributeButton = await page.getByRole('button', { name: 'View Details' })
-   await contributeButton.click()
+   const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
+   await viewDetailsButton.click()
    expect(await page.url()).toContain('chapters/chapter_1')
  })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('opens window on View Details button click', async ({ page }) => {
const contributeButton = await page.getByRole('button', { name: 'View Details' })
await contributeButton.click()
expect(await page.url()).toContain('chapters/chapter_1')
})
test('opens window on View Details button click', async ({ page }) => {
const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
await viewDetailsButton.click()
expect(await page.url()).toContain('chapters/chapter_1')
})

@Rajgupta36 Rajgupta36 marked this pull request as ready for review March 2, 2025 19:46
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (1)

28-34: Fix typo in test description: "statics" → "statistics".

The test name contains a minor typo that should be corrected for clarity.

-  test('should have project statics block', async ({ page }) => {
+  test('should have project statistics block', async ({ page }) => {
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3cb5bf3 and 4ad389d.

📒 Files selected for processing (10)
  • frontend/__tests__/e2e/pages/ChapterDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Chapters.spec.tsx (1 hunks)
  • frontend/__tests__/e2e/pages/CommitteeDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Committees.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Contribute.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Projects.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/UserDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Users.spec.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (8)
  • frontend/tests/e2e/pages/UserDetails.spec.ts
  • frontend/tests/e2e/pages/ChapterDetails.spec.ts
  • frontend/tests/e2e/pages/Users.spec.tsx
  • frontend/tests/e2e/pages/Projects.spec.ts
  • frontend/tests/e2e/pages/RepositoryDetails.spec.ts
  • frontend/tests/e2e/pages/Chapters.spec.tsx
  • frontend/tests/e2e/pages/Contribute.spec.ts
  • frontend/tests/e2e/pages/Committees.spec.ts
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: CodeQL (python)
  • GitHub Check: CodeQL (javascript-typescript)
  • GitHub Check: Run backend tests
  • GitHub Check: Run frontend e2e tests
  • GitHub Check: Run frontend unit tests
🔇 Additional comments (8)
frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (4)

1-12: LGTM! Proper test setup with mocked GraphQL response.

The test setup is well-structured with appropriate mocking of GraphQL data and page navigation.


59-65: LGTM! Well-structured toggle functionality test.

The test properly verifies the toggle behavior by checking button state before and after interactions.


76-82: Correctly implemented test for recent releases.

The test now correctly checks for "Recent Releases" heading instead of "Recent Issues", addressing a previous review comment.


97-98: URL verification correctly implemented.

The URL verification now uses the correct assertion syntax, addressing a previous review comment that flagged nested expects.

frontend/__tests__/e2e/pages/CommitteeDetails.spec.ts (4)

1-12: LGTM! Well-structured test setup with proper mocking.

The test setup appropriately mocks GraphQL responses and navigates to the committee details page.


13-16: LGTM! Clear and concise heading/summary verification.

The test effectively verifies both the heading and summary text of the committee page.


18-23: LGTM! Comprehensive committee details verification.

The test covers all essential committee details including last updated date, leaders, and external links.


25-33:

❓ Verification inconclusive

LGTM! Thorough top contributors section testing.

The test comprehensively verifies the visibility of contributor profiles, names, and contribution counts.

Consider adding a toggle test similar to the one in ProjectDetails.spec.ts to verify that the "Show more/less" functionality works for contributors if this feature is available on this page.


🏁 Script executed:

#!/bin/bash
# Check if the CommitteeDetailsPage has a show more/less button for contributors

# Search for show more/less button in the component
rg -A 3 "Show (more|less)" --glob "frontend/src/**/*Committee*.{ts,tsx,js,jsx}"

Length of output: 81


Attention: Top Contributors Test and Potential Toggle Functionality

The top contributors test is comprehensive, verifying that contributor images, names, and contribution counts display correctly on the Committee Details page.

Note: An initial search for a "Show more/less" or toggle functionality in CommitteeDetails components did not return any evidence of such a feature. If the Committee Details page is designed to support toggling (as seen in ProjectDetails.spec.ts), please consider adding a corresponding toggle test once this functionality is confirmed or implemented.

@arkid15r arkid15r enabled auto-merge March 3, 2025 17:01
arkid15r
arkid15r previously approved these changes Mar 3, 2025
Copy link
Collaborator

@arkid15r arkid15r left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More e2e test! LGTM 👍

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
frontend/__tests__/e2e/pages/Projects.spec.ts (1)

41-45: 🛠️ Refactor suggestion

Rename variable for clarity.

The variable name doesn't match its purpose. It's incorrectly named contributeButton but it references the "View Details" button.

test('opens window on View Details button click', async ({ page }) => {
-  const contributeButton = await page.getByRole('button', { name: 'View Details' })
-  await contributeButton.click()
+  const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
+  await viewDetailsButton.click()
  expect(await page.url()).toContain('projects/project_1')
})
frontend/__tests__/e2e/pages/Chapters.spec.tsx (1)

42-46: 🛠️ Refactor suggestion

Rename variable for clarity.

The variable name doesn't match its purpose. It's incorrectly named contributeButton but it references the "View Details" button.

test('opens window on View Details button click', async ({ page }) => {
-  const contributeButton = await page.getByRole('button', { name: 'View Details' })
-  await contributeButton.click()
+  const viewDetailsButton = await page.getByRole('button', { name: 'View Details' })
+  await viewDetailsButton.click()
  expect(await page.url()).toContain('chapters/chapter_1')
})
🧹 Nitpick comments (1)
frontend/__tests__/e2e/pages/Users.spec.tsx (1)

40-46: Improve test name for clarity.

The current test name "opens window on button click" is generic and doesn't clearly describe what functionality is being tested.

-test('opens window on button click', async ({ page }) => {
+test('navigates to user details page when clicking on user button', async ({ page }) => {
  const contributeButton = await page.getByRole('button', {
    name: 'John Doe John Doe OWASP View',
  })
  await contributeButton.click()
  expect(await page.url()).toContain('community/users/user_1')
})
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4ad389d and b0c77c0.

📒 Files selected for processing (10)
  • frontend/__tests__/e2e/pages/ChapterDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Chapters.spec.tsx (1 hunks)
  • frontend/__tests__/e2e/pages/CommitteeDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Committees.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Contribute.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Projects.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/UserDetails.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Users.spec.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
  • frontend/tests/e2e/pages/UserDetails.spec.ts
  • frontend/tests/e2e/pages/ChapterDetails.spec.ts
  • frontend/tests/e2e/pages/CommitteeDetails.spec.ts
  • frontend/tests/e2e/pages/Committees.spec.ts
  • frontend/tests/e2e/pages/Contribute.spec.ts
  • frontend/tests/e2e/pages/RepositoryDetails.spec.ts
🔇 Additional comments (15)
frontend/__tests__/e2e/pages/Users.spec.tsx (4)

4-16: Good test setup with appropriate mocking.

The setup for the Users Page test suite follows best practices by:

  • Mocking API responses to ensure test consistency
  • Setting up routes before each test to maintain a clean state
  • Including pagination data in the mock response

18-21: Well-structured test for verifying user data rendering.

The test correctly verifies that user buttons are rendered with the expected text content. The assertions are appropriately checking for visibility rather than existence.


23-32: Good empty state handling test.

This test effectively verifies the application's behavior when no users are available by:

  • Overriding the default mock with an empty response
  • Checking for the appropriate message display

34-38: Effective pagination test.

The test correctly simulates a user interaction with the pagination controls and verifies the URL is updated accordingly.

frontend/__tests__/e2e/pages/Projects.spec.ts (2)

4-16: Good test setup with appropriate mocking.

The setup for the Projects Page test suite follows best practices by:

  • Mocking API responses with consistent test data
  • Setting up routes before each test
  • Including pagination data in the mock response

18-22: Well-structured test for verifying project data rendering.

The test correctly verifies multiple UI elements:

  • Project title link
  • Summary text
  • View Details button
frontend/__tests__/e2e/pages/Chapters.spec.tsx (3)

4-16: Good test setup with appropriate mocking.

The setup for the Chapters Page test suite follows best practices by:

  • Mocking API responses with consistent test data
  • Setting up routes before each test
  • Including pagination data in the mock response

18-23: Comprehensive test for verifying chapter data rendering.

The test effectively verifies multiple UI elements:

  • Chapter title link
  • Summary text
  • Avatar link
  • View Details button

25-34: Good empty state handling test with proper capitalization.

This test effectively verifies the application's behavior when no chapters are available by:

  • Overriding the default mock with an empty response
  • Checking for the appropriate message display with correct capitalization
frontend/__tests__/e2e/pages/ProjectDetails.spec.ts (6)

4-13: Good test setup with GraphQL mocking.

The setup is well-structured for testing the Project Details page:

  • Properly mocks GraphQL responses instead of REST
  • Uses a consistent approach for route interception
  • Sets up the test environment before each test

15-20: Well-structured test for verifying heading and summary.

The test correctly verifies the main heading and project summary text, following good practices by checking for visibility.


22-28: Comprehensive project details verification.

This test effectively verifies all key project details elements:

  • Section heading
  • Last updated date
  • Project level
  • Project leaders
  • Project URL

30-36: Thorough verification of project statistics.

This test effectively verifies all stat counters are visible:

  • Stars count
  • Forks count
  • Contributors count
  • Issues count
  • Repositories count

52-68: Good testing of interactive elements.

The tests effectively verify both the static display of contributors and the interactive toggling functionality:

  • Checks that contributor images and text are visible
  • Verifies the "Show more"/"Show less" toggle button works correctly
  • Tests the complete interaction flow

87-102: Good test for repository list and navigation.

The test effectively:

  • Verifies all repository statistics are displayed
  • Checks navigation functionality when clicking on a repository
  • Verifies the URL is updated correctly

Comment on lines 40 to 46
test('opens window on button click', async ({ page }) => {
const contributeButton = await page.getByRole('button', {
name: 'John Doe John Doe OWASP View',
})
await contributeButton.click()
expect(await page.url()).toContain('community/users/user_1')
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Rename variable for clarity.

The variable name doesn't match its purpose. It's named contributeButton but it refers to a user button.

test('opens window on button click', async ({ page }) => {
-  const contributeButton = await page.getByRole('button', {
+  const userButton = await page.getByRole('button', {
    name: 'John Doe John Doe OWASP View',
  })
-  await contributeButton.click()
+  await userButton.click()
  expect(await page.url()).toContain('community/users/user_1')
})
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('opens window on button click', async ({ page }) => {
const contributeButton = await page.getByRole('button', {
name: 'John Doe John Doe OWASP View',
})
await contributeButton.click()
expect(await page.url()).toContain('community/users/user_1')
})
test('opens window on button click', async ({ page }) => {
const userButton = await page.getByRole('button', {
name: 'John Doe John Doe OWASP View',
})
await userButton.click()
expect(await page.url()).toContain('community/users/user_1')
})

Comment on lines 24 to 33
test('displays "No Project found" when there are no project', async ({ page }) => {
await page.route('**/idx/', async (route) => {
await route.fulfill({
status: 200,
body: JSON.stringify({ hits: [], nbPages: 0 }),
})
})
await page.goto('/projects')
await expect(page.getByText('No projects found')).toBeVisible()
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Fix grammatical errors in test name and maintain consistency.

The test title contains grammatical errors and doesn't match the message being verified.

-test('displays "No Project found" when there are no project', async ({ page }) => {
+test('displays "No projects found" when there are no projects', async ({ page }) => {
  await page.route('**/idx/', async (route) => {
    await route.fulfill({
      status: 200,
      body: JSON.stringify({ hits: [], nbPages: 0 }),
    })
  })
  await page.goto('/projects')
  await expect(page.getByText('No projects found')).toBeVisible()
})
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('displays "No Project found" when there are no project', async ({ page }) => {
await page.route('**/idx/', async (route) => {
await route.fulfill({
status: 200,
body: JSON.stringify({ hits: [], nbPages: 0 }),
})
})
await page.goto('/projects')
await expect(page.getByText('No projects found')).toBeVisible()
})
test('displays "No projects found" when there are no projects', async ({ page }) => {
await page.route('**/idx/', async (route) => {
await route.fulfill({
status: 200,
body: JSON.stringify({ hits: [], nbPages: 0 }),
})
})
await page.goto('/projects')
await expect(page.getByText('No projects found')).toBeVisible()
})

@arkid15r arkid15r added this pull request to the merge queue Mar 3, 2025
@arkid15r arkid15r removed this pull request from the merge queue due to a manual request Mar 3, 2025
Copy link

sonarqubecloud bot commented Mar 3, 2025

Quality Gate Failed Quality Gate failed

Failed conditions
46.5% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
frontend/__tests__/e2e/pages/Users.spec.tsx (3)

18-21: Consider enhancing the assertion coverage for user data rendering.

While the test correctly verifies the presence of user buttons, it could be improved by also checking other user data elements such as roles, avatars, or additional metadata that might be displayed on the page.

test('renders user data correctly', async ({ page }) => {
  await expect(page.getByRole('button', { name: 'John Doe John Doe OWASP View' })).toBeVisible()
  await expect(page.getByRole('button', { name: 'Jane Smith Jane Smith' })).toBeVisible()
+  // Verify additional user elements if applicable
+  await expect(page.getByText('OWASP Lead')).toBeVisible()
+  // Verify user avatars are rendered correctly
+  await expect(page.locator('[data-testid="user-avatar-user_1"]')).toBeVisible()
}

34-38: Strengthen pagination test with content verification.

The test verifies URL changes but doesn't confirm that the page content actually updates after pagination. Consider adding assertions that verify different content appears on page 2.

test('handles page change correctly', async ({ page }) => {
  const nextPageButton = await page.getByRole('button', { name: '2' })
  await nextPageButton.click()
  expect(await page.url()).toContain('page=2')
+  // Verify that the page has loaded new content
+  // You may need to mock a different response for page 2
+  await page.waitForResponse(response => response.url().includes('/idx/') && response.status() === 200)
+  // Verify content specific to page 2 is visible
+  await expect(page.getByText('Page 2 Content')).toBeVisible()
}

1-47: Consider adding tests for error handling and accessibility.

The current test suite covers the happy path and empty state scenarios but lacks tests for:

  1. API error responses (e.g., 404, 500)
  2. Accessibility validations (e.g., keyboard navigation, screen reader compatibility)
  3. Sort/filter functionality if applicable

These additional tests would improve the robustness of the test suite.

// Example error handling test
test('handles API errors gracefully', async ({ page }) => {
  await page.route('**/idx/', async (route) => {
    await route.fulfill({
      status: 500,
      body: JSON.stringify({ error: 'Internal Server Error' }),
    })
  })
  await page.goto('/community/users')
  // Verify error message is displayed
  await expect(page.getByText('Unable to load users')).toBeVisible()
})

// Example accessibility test
test('supports keyboard navigation', async ({ page }) => {
  await page.keyboard.press('Tab')
  // Verify first interactive element is focused
  const focusedElement = await page.evaluate(() => document.activeElement?.textContent)
  expect(focusedElement).toContain('John Doe')
  
  // Navigate to next element
  await page.keyboard.press('Tab')
  const nextFocusedElement = await page.evaluate(() => document.activeElement?.textContent)
  expect(nextFocusedElement).toContain('Jane Smith')
})
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b0c77c0 and f9aa4cb.

📒 Files selected for processing (2)
  • frontend/__tests__/e2e/pages/Projects.spec.ts (1 hunks)
  • frontend/__tests__/e2e/pages/Users.spec.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/tests/e2e/pages/Projects.spec.ts
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: Run frontend e2e tests
  • GitHub Check: Run frontend unit tests
  • GitHub Check: CodeQL (python)
  • GitHub Check: CodeQL (javascript-typescript)
  • GitHub Check: Run backend tests
🔇 Additional comments (4)
frontend/__tests__/e2e/pages/Users.spec.tsx (4)

1-3: Import structure looks good.

The file imports the necessary test utilities from Playwright and includes the mock data required for the tests.


4-16: Test setup is well-structured and follows best practices.

The test setup effectively:

  • Uses a descriptive test suite name
  • Implements beforeEach to set up consistent test conditions
  • Mocks API responses with appropriate data structure
  • Navigates to the correct page before each test

This approach ensures reliable and deterministic test execution.


23-32: Empty state handling test is well-implemented.

The test effectively:

  1. Mocks an empty response from the API
  2. Verifies the correct empty state message is displayed
  3. Follows the pattern of re-routing within the test for specific conditions

This is a good practice for testing conditional UI states.


40-46: Navigation test is implemented correctly.

The test properly verifies that clicking on a user button navigates to the expected user detail page by checking the URL. The variable naming is clear and descriptive.

@arkid15r arkid15r added this pull request to the merge queue Mar 3, 2025
Merged via the queue into OWASP:main with commit 555c66b Mar 3, 2025
17 of 18 checks passed
ahmedxgouda pushed a commit to ahmedxgouda/Nest that referenced this pull request Mar 3, 2025
* added test cases for chapter and projectdetails page

* added test case for other pages

* update test-cases for firefox

* update assertion text

* Update code

* Apply suggestions

---------

Co-authored-by: Arkadii Yakovets <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Create End-to-End tests for all pages
2 participants