From d3ef8df5c67391173eeba5e1f0ba9e22bb7b3ac5 Mon Sep 17 00:00:00 2001 From: Karan Negi <142792314+KaranNegi20Feb@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:25:34 +0530 Subject: [PATCH 1/5] Corrected redirection to Github and Nest profile --- frontend/src/api/queries/projectQueries.ts | 2 ++ frontend/src/components/CardDetailsPage.tsx | 9 +++++++-- frontend/src/components/ItemCardList.tsx | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/api/queries/projectQueries.ts b/frontend/src/api/queries/projectQueries.ts index 99c6ef6b30..5f02283397 100644 --- a/frontend/src/api/queries/projectQueries.ts +++ b/frontend/src/api/queries/projectQueries.ts @@ -16,10 +16,12 @@ export const GET_PROJECT_DATA = gql` title commentsCount createdAt + url author { avatarUrl login name + url } } recentReleases { diff --git a/frontend/src/components/CardDetailsPage.tsx b/frontend/src/components/CardDetailsPage.tsx index bb40436d01..44faba246f 100644 --- a/frontend/src/components/CardDetailsPage.tsx +++ b/frontend/src/components/CardDetailsPage.tsx @@ -100,8 +100,13 @@ const DetailsCard = ({
{formatDate(item.createdAt)} - - {item.commentsCount} comments + {item.commentsCount && ( + <> + + {item.commentsCount} comments + + )} +
)} /> diff --git a/frontend/src/components/ItemCardList.tsx b/frontend/src/components/ItemCardList.tsx index 4c0dee610c..7b623ef2c5 100644 --- a/frontend/src/components/ItemCardList.tsx +++ b/frontend/src/components/ItemCardList.tsx @@ -35,7 +35,7 @@ const ItemCardList = ({ className="mr-2 h-6 w-6 rounded-full" /> {item?.author?.name || item?.author?.login} From 55e4b3918576572bedcd73bc0f70676ac7468e6e Mon Sep 17 00:00:00 2001 From: Karan Negi <142792314+KaranNegi20Feb@users.noreply.github.com> Date: Sun, 2 Mar 2025 14:24:39 +0530 Subject: [PATCH 2/5] Correction p2: redirection to Github and Nest profile --- frontend/src/components/CardDetailsPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/CardDetailsPage.tsx b/frontend/src/components/CardDetailsPage.tsx index 5320c1c9c2..9da810691f 100644 --- a/frontend/src/components/CardDetailsPage.tsx +++ b/frontend/src/components/CardDetailsPage.tsx @@ -96,12 +96,12 @@ const DetailsCard = ({
{formatDate(item.createdAt)} - {item.commentsCount && ( + {item?.commentsCount? ( <> {item.commentsCount} comments - )} + ):null}
)} From 0968912a719f367cfc26451132fc78fba5ec4dc0 Mon Sep 17 00:00:00 2001 From: Karan Negi <142792314+KaranNegi20Feb@users.noreply.github.com> Date: Sun, 2 Mar 2025 14:35:58 +0530 Subject: [PATCH 3/5] Correction p2: redirection to Github and Nest profile --- frontend/src/components/CardDetailsPage.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/CardDetailsPage.tsx b/frontend/src/components/CardDetailsPage.tsx index 9da810691f..3107dfd424 100644 --- a/frontend/src/components/CardDetailsPage.tsx +++ b/frontend/src/components/CardDetailsPage.tsx @@ -96,13 +96,12 @@ const DetailsCard = ({
{formatDate(item.createdAt)} - {item?.commentsCount? ( + {item?.commentsCount ? ( <> - - {item.commentsCount} comments + + {item.commentsCount} comments - ):null} - + ) : null}
)} /> From f527f9eb269ad59f148e6d6281993618ec2e149c Mon Sep 17 00:00:00 2001 From: Karan Negi <142792314+KaranNegi20Feb@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:52:25 +0530 Subject: [PATCH 4/5] Fixed redirection issues and updated related tests --- frontend/__tests__/e2e/pages/home.spec.ts | 1 - .../unit/pages/ProjectDetails.test.tsx | 3 -- .../unit/pages/RepositoryDetails.test.tsx | 3 -- frontend/src/components/ItemCardList.tsx | 29 +++++++++---------- 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/frontend/__tests__/e2e/pages/home.spec.ts b/frontend/__tests__/e2e/pages/home.spec.ts index 16a3ea6c03..bc79573834 100644 --- a/frontend/__tests__/e2e/pages/home.spec.ts +++ b/frontend/__tests__/e2e/pages/home.spec.ts @@ -47,7 +47,6 @@ test.describe('Home Page', () => { test('should have recent issues', async ({ page }) => { await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible() await expect(page.getByRole('heading', { name: 'Issue 1' })).toBeVisible() - await expect(page.getByText('Author 1').first()).toBeVisible() await expect(page.getByText('Feb 24,').first()).toBeVisible() await expect(page.getByText('5 comments')).toBeVisible() }) diff --git a/frontend/__tests__/unit/pages/ProjectDetails.test.tsx b/frontend/__tests__/unit/pages/ProjectDetails.test.tsx index 0e1e72afa7..d090f12929 100644 --- a/frontend/__tests__/unit/pages/ProjectDetails.test.tsx +++ b/frontend/__tests__/unit/pages/ProjectDetails.test.tsx @@ -134,9 +134,6 @@ describe('ProjectDetailsPage', () => { issues.forEach((issue) => { expect(screen.getByText(issue.title)).toBeInTheDocument() - - expect(screen.getAllByText(issue.author.name).length).toBeGreaterThan(0) - expect(screen.getByText(`${issue.commentsCount} comments`)).toBeInTheDocument() }) }) diff --git a/frontend/__tests__/unit/pages/RepositoryDetails.test.tsx b/frontend/__tests__/unit/pages/RepositoryDetails.test.tsx index c012839c16..b46b7b9160 100644 --- a/frontend/__tests__/unit/pages/RepositoryDetails.test.tsx +++ b/frontend/__tests__/unit/pages/RepositoryDetails.test.tsx @@ -135,9 +135,6 @@ describe('RepositoryDetailsPage', () => { issues.forEach((issue) => { expect(screen.getByText(issue.title)).toBeInTheDocument() - - expect(screen.getAllByText(issue.author.name).length).toBeGreaterThan(0) - expect(screen.getByText(`${issue.commentsCount} comments`)).toBeInTheDocument() }) }) diff --git a/frontend/src/components/ItemCardList.tsx b/frontend/src/components/ItemCardList.tsx index 7b623ef2c5..98e8a0523e 100644 --- a/frontend/src/components/ItemCardList.tsx +++ b/frontend/src/components/ItemCardList.tsx @@ -20,29 +20,26 @@ const ItemCardList = ({ {data && data.length > 0 ? (
{data.map((item, index) => ( -
-

- - {item.title || item.name} - -

-
-
-
+
+ -
{renderDetails(item)}
+
{renderDetails(item)}
))} From e44cdcb0a9ed11105da9b221a5912b419f8dbc38 Mon Sep 17 00:00:00 2001 From: Karan Negi <142792314+KaranNegi20Feb@users.noreply.github.com> Date: Tue, 4 Mar 2025 10:42:50 +0530 Subject: [PATCH 5/5] Resolved merge conflicts --- .../e2e/pages/ProjectDetails.spec.ts | 101 ++++++++++++++++++ .../e2e/pages/RepositoryDetails.spec.ts | 79 ++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 frontend/__tests__/e2e/pages/ProjectDetails.spec.ts create mode 100644 frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts diff --git a/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts b/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts new file mode 100644 index 0000000000..59f1d6c256 --- /dev/null +++ b/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts @@ -0,0 +1,101 @@ +import { test, expect } from '@playwright/test' +import { mockProjectDetailsData } from '@unit/data/mockProjectDetailsData' + +test.describe('Project Details Page', () => { + test.beforeEach(async ({ page }) => { + await page.route('**/graphql/', async (route) => { + await route.fulfill({ + status: 200, + json: { data: mockProjectDetailsData }, + }) + }) + await page.goto('/projects/test-project') + }) + + test('should have a heading and summary', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Test Project' })).toBeVisible() + await expect( + page.getByText('An example project showcasing GraphQL and Django integration.') + ).toBeVisible() + }) + + test('should have project details block', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Project Details' })).toBeVisible() + await expect(page.getByText('Last Updated: Feb 7, 2025')).toBeVisible() + await expect(page.getByText('Level: Lab')).toBeVisible() + await expect(page.getByText('Project Leaders: alice, bob')).toBeVisible() + await expect(page.getByText('URL: https://github.com/')).toBeVisible() + }) + + test('should have project statics block', async ({ page }) => { + await expect(page.getByText('2.2K Stars')).toBeVisible() + await expect(page.getByText('10 Forks')).toBeVisible() + await expect(page.getByText('1.2K Contributors')).toBeVisible() + await expect(page.getByText('10 Issues')).toBeVisible() + await expect(page.getByText('3 Repositories')).toBeVisible() + }) + + test('should have project topics', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Topics' })).toBeVisible() + await expect(page.getByText('graphql', { exact: true })).toBeVisible() + await expect(page.getByText('django', { exact: true })).toBeVisible() + await expect(page.getByText('backend')).toBeVisible() + }) + + test('should have project languages', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Languages' })).toBeVisible() + await expect(page.getByText('Python', { exact: true })).toBeVisible() + await expect(page.getByText('GraphQL', { exact: true })).toBeVisible() + await expect(page.getByText('JavaScript', { exact: true })).toBeVisible() + }) + + test('should have top contributors', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Top Contributors' })).toBeVisible() + await expect(page.getByRole('img', { name: 'Contributor 1' })).toBeVisible() + await expect(page.getByText('Contributor 1')).toBeVisible() + await expect(page.getByText('30 Contributions')).toBeVisible() + await expect(page.getByRole('img', { name: 'Contributor 2' })).toBeVisible() + await expect(page.getByText('Contributor 2')).toBeVisible() + await expect(page.getByText('29 Contributions')).toBeVisible() + }) + + test('toggle top contributors', async ({ page }) => { + await expect(page.getByRole('button', { name: 'Show more' })).toBeVisible() + await page.getByRole('button', { name: 'Show more' }).click() + await expect(page.getByRole('button', { name: 'Show less' })).toBeVisible() + await page.getByRole('button', { name: 'Show less' }).click() + await expect(page.getByRole('button', { name: 'Show more' })).toBeVisible() + }) + + test('should have project recent issues', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Fix authentication bug' })).toBeVisible() + await expect(page.getByRole('img', { name: 'Dave Debugger' })).toBeVisible() + await expect(page.getByText('Feb 5, 2025')).toBeVisible() + await expect(page.getByText('5 comments')).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('Jan 20, 2025')).toBeVisible() + }) + + test('should have project repositories', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Repositories' })).toBeVisible() + await expect(page.getByText('Repo One')).toBeVisible() + await expect(page.getByText('Stars95')).toBeVisible() + await expect(page.getByText('Forks12')).toBeVisible() + await expect(page.getByText('Contributors40')).toBeVisible() + await expect(page.getByText('Issues6')).toBeVisible() + await expect(page.getByText('Repo Two')).toBeVisible() + await expect(page.getByText('Stars60')).toBeVisible() + await expect(page.getByText('Forks8')).toBeVisible() + await expect(page.getByText('Contributors30')).toBeVisible() + await expect(page.getByText('Issues3', { exact: true })).toBeVisible() + + await page.getByText('Repo One').click() + expect(page.url()).toContain('repositories/repo-1') + }) +}) diff --git a/frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts b/frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts new file mode 100644 index 0000000000..ecfd7c9729 --- /dev/null +++ b/frontend/__tests__/e2e/pages/RepositoryDetails.spec.ts @@ -0,0 +1,79 @@ +import { test, expect } from '@playwright/test' +import { mockRepositoryData } from '@unit/data/mockRepositoryData' + +test.describe('Repository Details Page', () => { + test.beforeEach(async ({ page }) => { + await page.route('**/graphql/', async (route) => { + await route.fulfill({ + status: 200, + json: { data: mockRepositoryData }, + }) + }) + await page.goto('/projects/test-project/repositories/test-repository') + }) + + test('should have a heading and summary', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Test Repo' })).toBeVisible() + await expect(page.getByText('A sample test repository')).toBeVisible() + }) + + test('should have repository details block', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Repository Details' })).toBeVisible() + await expect(page.getByText('Last Updated: Jan 1, 2024')).toBeVisible() + await expect(page.getByText('License: MIT')).toBeVisible() + await expect(page.getByText('Size: 1200 KB')).toBeVisible() + await expect(page.getByRole('link', { name: 'https://github.com/test-repo' })).toBeVisible() + }) + + test('should have statics block', async ({ page }) => { + await expect(page.getByText('50K Stars')).toBeVisible() + await expect(page.getByText('3K Forks')).toBeVisible() + await expect(page.getByText('5 Contributors')).toBeVisible() + await expect(page.getByText('2 Issues')).toBeVisible() + await expect(page.getByText('10 Commits')).toBeVisible() + }) + + test('should have topics', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Topics' })).toBeVisible() + await expect(page.getByText('JavaScript', { exact: true })).toBeVisible() + await expect(page.getByText('TypeScript', { exact: true })).toBeVisible() + }) + + test('should have languages', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Languages' })).toBeVisible() + await expect(page.getByText('web', { exact: true })).toBeVisible() + await expect(page.getByText('security', { exact: true })).toBeVisible() + }) + test('should have top contributors', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Top Contributors' })).toBeVisible() + await expect(page.getByRole('img', { name: 'Contributor 1' })).toBeVisible() + await expect(page.getByText('Contributor 1')).toBeVisible() + await expect(page.getByText('30 Contributions')).toBeVisible() + await expect(page.getByRole('img', { name: 'Contributor 2' })).toBeVisible() + await expect(page.getByText('Contributor 2')).toBeVisible() + await expect(page.getByText('29 Contributions')).toBeVisible() + }) + + test('toggle top contributors', async ({ page }) => { + await expect(page.getByRole('button', { name: 'Show more' })).toBeVisible() + await page.getByRole('button', { name: 'Show more' }).click() + await expect(page.getByRole('button', { name: 'Show less' })).toBeVisible() + await page.getByRole('button', { name: 'Show less' }).click() + await expect(page.getByRole('button', { name: 'Show more' })).toBeVisible() + }) + + test('should have recent issues', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Recent Issues' })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Bug fix required' })).toBeVisible() + await expect(page.getByRole('img', { name: 'Test User 1' })).toBeVisible() + await expect(page.getByText('Jan 2, 2024')).toBeVisible() + await expect(page.getByText('4 comments')).toBeVisible() + }) + + test('should have recent releases', async ({ page }) => { + await expect(page.getByRole('heading', { name: 'Recent Releases' })).toBeVisible() + await expect(page.getByRole('heading', { name: 'v1.0.0' })).toBeVisible() + await expect(page.getByRole('img', { name: 'Test User 2' })).toBeVisible() + await expect(page.getByText('Jan 1, 2024', { exact: true })).toBeVisible() + }) +})