Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions playwright/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ $ export KEYCLOAK_REALM=dso
$ export CONSOLE_ADMIN_USERNAME=<admin_dso_username>
$ export CONSOLE_ADMIN_PASSWORD=<admin_dso_password>
$ export CONSOLE_ADMIN_EMAIL=<admin_dso_email>
$ export CONSOLE_TEST_USERNAME=<user_dso_username>
$ export CONSOLE_TEST_PASSWORD=<user_dso_password>
$ export CONSOLE_TEST_EMAIL=<user_dso_email>
$ export CONSOLE_GLOBAL_TIMEOUT='900000'
$ export CONSOLE_EXPECT_TIMEOUT='900000'
```
Expand Down
5 changes: 2 additions & 3 deletions playwright/e2e-tests/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
95 changes: 63 additions & 32 deletions playwright/integration-tests/user-flow.spec.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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 signInCloudPiNative({ page, credentials: testUser })
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()
Expand All @@ -43,30 +30,54 @@ 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
// 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('Check Vault kv', { 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: 'Gitlab' }).click()
await page.getByRole('link', { name: 'Vault' }).click()
const page1 = await page1Promise
await page1.getByTestId('group-name').filter({ hasText: 'mirror' }).click()
await expect(page1.getByTestId('status_success_borderless-icon')).toBeVisible()
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', async ({ page }) => {
test('Pipelines run', { 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()
// 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()
Expand All @@ -83,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
Expand All @@ -103,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
Expand All @@ -119,9 +130,29 @@ 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: adminUser })
await signInCloudPiNative({ page, credentials: testUser })
await page.getByTestId('menuMyProjects').click()
await page.getByRole('link', { name: projectName }).click()
// Check if ArgoCD deployment is successful
Expand All @@ -143,10 +174,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')
Expand Down
Loading