From 6141e51034343567de36b1aca6e555e68e6fb8b6 Mon Sep 17 00:00:00 2001 From: falltrades Date: Fri, 12 Dec 2025 11:04:32 +0100 Subject: [PATCH 1/3] test(playwright): :zap: optimize tests order --- .../integration-tests/user-flow.spec.ts | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/playwright/integration-tests/user-flow.spec.ts b/playwright/integration-tests/user-flow.spec.ts index 0f5acc8b1..c2b9d8480 100644 --- a/playwright/integration-tests/user-flow.spec.ts +++ b/playwright/integration-tests/user-flow.spec.ts @@ -15,23 +15,10 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { const repositoryName = 'socle-project-test' projectsToDelete.push(projectName) - test('Project creation', async ({ page }) => { + test('Project creation and configuration', async ({ page }) => { await page.goto(clientURL) await signInCloudPiNative({ page, credentials: adminUser }) await addProject({ page, projectName }) - await addRandomRepositoryToProject({ - page, - repositoryName, - externalRepoUrlInput: 'https://github.com/cloud-pi-native/socle-project-test.git', - infraRepo: true, - }) - }) - - test('Project configuration', async ({ page }) => { - await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) - await page.getByTestId('menuMyProjects').click() - await page.getByRole('link', { name: projectName }).click() // Enable Nexus Maven plugin await page.getByTestId('test-tab-services').click() await page.getByRole('button', { name: 'Nexus' }).click() @@ -43,13 +30,14 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { await page.getByTestId('replayHooksBtn').click() await expect(page.getByRole('heading', { name: 'Opération en cours...' })).toBeVisible() await expect(page.getByText('Le projet a été reprovisionn')).toBeVisible() - // Check if mirror pipeline is successful - await page.getByTestId('test-tab-services').click() - const page1Promise = page.waitForEvent('popup') - await page.getByRole('link', { name: 'Gitlab' }).click() - const page1 = await page1Promise - await page1.getByTestId('group-name').filter({ hasText: 'mirror' }).click() - await expect(page1.getByTestId('status_success_borderless-icon')).toBeVisible() + // Add repository to project + await page.getByTestId('test-tab-resources').click() + await addRandomRepositoryToProject({ + page, + repositoryName, + externalRepoUrlInput: 'https://github.com/cloud-pi-native/socle-project-test.git', + infraRepo: true, + }) }) test('Pipelines run', async ({ page }) => { @@ -57,16 +45,17 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { await signInCloudPiNative({ page, credentials: adminUser }) await page.getByTestId('menuMyProjects').click() await page.getByRole('link', { name: projectName }).click() - // Run pipeline and check if tests are successful + // Check if mirror pipeline is successful await page.getByTestId('test-tab-services').click() const page1Promise = page.waitForEvent('popup') await page.getByRole('link', { name: 'Gitlab' }).click() const page1 = await page1Promise + await page1.getByTestId('group-name').filter({ hasText: 'mirror' }).click() + await expect(page1.getByTestId('status_success_borderless-icon')).toBeVisible() + // Check if tests are successful + await page1.getByRole('link', { name: projectName }).click() await page1.getByTestId('group-name').filter({ hasText: repositoryName }).click() - await page1.getByRole('button', { name: 'Build' }).hover() - await page1.getByRole('link', { name: 'Pipelines' }).click() - await page1.getByTestId('run-pipeline-button').click() - await page1.getByTestId('run-pipeline-button').click() // Not a duplicate + await page1.getByTestId('ci-icon').click() await expect( page1.getByRole('link', { name: 'Status: Passed test-vault' }), ).toBeVisible() From 1136c7f02b731b67baa65bf9101cf98c0b39a0bb Mon Sep 17 00:00:00 2001 From: falltrades Date: Fri, 12 Dec 2025 12:59:56 +0100 Subject: [PATCH 2/3] test(playwright): :alembic: add Vault kv tests --- playwright/README.md | 3 ++ playwright/e2e-tests/utils.ts | 5 +-- .../integration-tests/user-flow.spec.ts | 40 ++++++++++++++----- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/playwright/README.md b/playwright/README.md index 8b27af016..8e2586ca9 100644 --- a/playwright/README.md +++ b/playwright/README.md @@ -50,6 +50,9 @@ $ export KEYCLOAK_REALM=dso $ export CONSOLE_ADMIN_USERNAME= $ export CONSOLE_ADMIN_PASSWORD= $ export CONSOLE_ADMIN_EMAIL= +$ export CONSOLE_TEST_USERNAME= +$ export CONSOLE_TEST_PASSWORD= +$ export CONSOLE_TEST_EMAIL= $ export CONSOLE_GLOBAL_TIMEOUT='900000' $ export CONSOLE_EXPECT_TIMEOUT='900000' ``` diff --git a/playwright/e2e-tests/utils.ts b/playwright/e2e-tests/utils.ts index b8db9b953..df6d3b060 100644 --- a/playwright/e2e-tests/utils.ts +++ b/playwright/e2e-tests/utils.ts @@ -70,9 +70,8 @@ export async function addProject({ } export async function deleteProject(page: Page, projectName: string) { - await page.getByTestId('menuAdministrationBtn').click() - await page.getByTestId('menuAdministrationProjects').click() - await page.getByRole('row', { name: new RegExp(projectName) }).click() + await page.getByTestId('menuMyProjects').click() + await page.getByRole('link', { name: projectName }).click() await page.getByRole('button', { name: 'Supprimer le projet' }).click() await page.getByTestId('archiveProjectInput').fill('DELETE') await page.getByTestId('confirmDeletionBtn').click() diff --git a/playwright/integration-tests/user-flow.spec.ts b/playwright/integration-tests/user-flow.spec.ts index c2b9d8480..bb3e56bca 100644 --- a/playwright/integration-tests/user-flow.spec.ts +++ b/playwright/integration-tests/user-flow.spec.ts @@ -1,5 +1,5 @@ import { expect, test } from '@playwright/test' -import { adminUser, clientURL, signInCloudPiNative } from '../config/console' +import { testUser, clientURL, signInCloudPiNative } from '../config/console' import { addProject, @@ -17,7 +17,7 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { test('Project creation and configuration', async ({ page }) => { await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) + await signInCloudPiNative({ page, credentials: testUser }) await addProject({ page, projectName }) // Enable Nexus Maven plugin await page.getByTestId('test-tab-services').click() @@ -40,9 +40,31 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { }) }) - test('Pipelines run', async ({ page }) => { + test('Check Vault kv', { tag: '@replayable' }, async ({ page }) => { await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) + await signInCloudPiNative({ page, credentials: testUser }) + await page.getByTestId('menuMyProjects').click() + await page.getByRole('link', { name: projectName }).click() + await page.getByTestId('test-tab-services').click() + const page1Promise = page.waitForEvent('popup') + await page.getByRole('link', { name: 'Vault' }).click() + const page1 = await page1Promise + const page2Promise = page1.waitForEvent('popup') + await page1.getByRole('button', { name: 'Sign in with OIDC Provider' }).click() + await page2Promise + await expect(page1.getByRole('link', { name: 'Vault home' })).toBeVisible() + await page1.goto(`https://vault.sdid-hp.cpin.numerique-interieur.com/ui/vault/secrets/${projectName}/kv/list?page=1`) + // Check that standard user has access to his project kv + await expect(page1.getByText('No secrets yet')).toBeVisible() + await expect(page1.getByRole('link', { name: 'Create secret' })).toBeVisible() + await page1.getByLabel('breadcrumbs').getByRole('link', { name: 'Secrets' }).click() + // Check that forge-dso kv is not accessible for standard user + await expect(page1.getByRole('link', { name: 'forge-dso' })).not.toBeVisible() + }) + + test('Pipelines run', { tag: '@replayable' }, async ({ page }) => { + await page.goto(clientURL) + await signInCloudPiNative({ page, credentials: testUser }) await page.getByTestId('menuMyProjects').click() await page.getByRole('link', { name: projectName }).click() // Check if mirror pipeline is successful @@ -72,7 +94,7 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { test('Prepare ArgoCD deployment', async ({ page }) => { await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) + await signInCloudPiNative({ page, credentials: testUser }) await page.getByTestId('menuMyProjects').click() await page.getByRole('link', { name: projectName }).click() // Create environment for project to trigger ArgoCD deployment @@ -92,7 +114,7 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { test('View Sonar scan report', { tag: '@replayable' }, async ({ page }) => { await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) + await signInCloudPiNative({ page, credentials: testUser }) await page.getByTestId('menuMyProjects').click() await page.getByRole('link', { name: projectName }).click() // Check if sonar scan is available @@ -110,7 +132,7 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { test('ArgoCD deployment', { tag: '@replayable' }, async ({ page }) => { await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) + await signInCloudPiNative({ page, credentials: testUser }) await page.getByTestId('menuMyProjects').click() await page.getByRole('link', { name: projectName }).click() // Check if ArgoCD deployment is successful @@ -132,10 +154,10 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { test('Cleanup user test data', async ({ page }) => { await page.goto(clientURL) - await signInCloudPiNative({ page, credentials: adminUser }) + await signInCloudPiNative({ page, credentials: testUser }) // ArgoCD deployment will be deleted when stage is deleted await page.getByTestId('menuMyProjects').click() - await page.getByRole('link', { name: `${projectName}` }).click() + await page.getByRole('link', { name: projectName }).click() await page.getByRole('cell', { name: 'integ' }).click() await page.getByTestId('showDeleteEnvironmentBtn').click() await page.getByTestId('deleteEnvironmentInput').fill('DELETE') From 474743b452db0f800ba1d6ce2669f36727e082de Mon Sep 17 00:00:00 2001 From: falltrades Date: Fri, 12 Dec 2025 13:49:04 +0100 Subject: [PATCH 3/3] test(playwright): :alembic: add Harbor tests --- .../integration-tests/user-flow.spec.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/playwright/integration-tests/user-flow.spec.ts b/playwright/integration-tests/user-flow.spec.ts index bb3e56bca..24f85d431 100644 --- a/playwright/integration-tests/user-flow.spec.ts +++ b/playwright/integration-tests/user-flow.spec.ts @@ -130,6 +130,26 @@ test.describe('Integration tests user flow', { tag: '@integ' }, () => { ).toBeVisible() }) + test('Check Harbor repository', { tag: '@replayable' }, async ({ page }) => { + await page.goto(clientURL) + await signInCloudPiNative({ page, credentials: testUser }) + await page.getByTestId('menuMyProjects').click() + await page.getByRole('link', { name: projectName }).click() + await page.getByTestId('test-tab-services').click() + const page1Promise = page.waitForEvent('popup') + await page.getByRole('link', { name: 'Harbor' }).click() + const page1 = await page1Promise + await page1.getByRole('button', { name: 'LOGIN WITH keycloak' }).click() + await expect(page1.getByRole('button', { name: 'Administration' })).not.toBeVisible() + await expect(page1.getByText('Guest')).toBeVisible() + await expect(page1.getByRole('heading', { name: 'Private' })).toBeVisible() + await page1.getByRole('link', { name: `${projectName}/java-demo` }).click() + await expect(page1.getByRole('button', { name: 'main' })).toBeVisible() + await expect(page1.getByText('Policy')).not.toBeVisible() + // Check trivy scan result, hopefully will stay at C + await expect(page1.getByRole('button', { name: 'C', exact: true })).toBeVisible() + }) + test('ArgoCD deployment', { tag: '@replayable' }, async ({ page }) => { await page.goto(clientURL) await signInCloudPiNative({ page, credentials: testUser })