Skip to content

Commit

Permalink
chore: add basic smoke test for sonarqube with sso (#77)
Browse files Browse the repository at this point in the history
## Description

Fixes #70

---------

Co-authored-by: zamaz <71521611+zachariahmiller@users.noreply.github.com>
Co-authored-by: Wayne Starr <Racer159@users.noreply.github.com>
  • Loading branch information
3 people committed May 22, 2024
1 parent 624399d commit 8db5ada
Show file tree
Hide file tree
Showing 10 changed files with 248 additions and 7 deletions.
7 changes: 7 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,10 @@ jobs:
uses: defenseunicorns/uds-common/.github/actions/save-logs@b2e8b25930c953ef893e7c787fe350f0d8679ee2 # v0.4.2
with:
suffix: ${{ matrix.type }}-${{ matrix.flavor }}-${{ github.run_id }}-${{ github.run_attempt }}

- uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
if: always()
with:
name: playwright-report-${{ matrix.type }}-${{ matrix.flavor }}-${{ github.run_id }}-${{ github.run_attempt }}
path: tests/.playwright/reports/
retention-days: 30
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,7 @@ test/tf/public-ec2-instance/.terraform
terraform.tfstate
terraform.tfstate.backup
.terraform.lock.hcl

# Tests
node_modules/
.playwright/
4 changes: 4 additions & 0 deletions tasks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,20 @@ tasks:
- task: create-sq-test-bundle
- task: setup:k3d-test-cluster
- task: deploy:test-bundle
- task: setup:create-doug-user
- task: test:health-check
- task: test:ingress
- task: test:ui

- name: test-upgrade
description: Test an upgrade from the latest released package to the current branch
actions:
- task: create-sq-latest-release-bundle
- task: setup:k3d-test-cluster
- task: deploy:test-bundle
- task: setup:create-doug-user
- task: create-sq-test-bundle
- task: deploy:test-bundle
- task: test:health-check
- task: test:ingress
- task: test:ui
27 changes: 20 additions & 7 deletions tasks/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ tasks:
- name: health-check
actions:
# StatefulSets don't show conditions themselves so we look for an underlying Pod
- description: Sonarqube StatefulSet Health Check
- description: SonarQube StatefulSet Health Check
wait:
cluster:
kind: Pod
Expand All @@ -12,9 +12,22 @@ tasks:

- name: ingress
actions:
- description: Sonarqube UI Health Check
wait:
network:
protocol: https
address: sonarqube.uds.dev
code: 200
- description: SonarQube UI Status Check
maxRetries: 30
cmd: |
STATUS=$(curl -s 'https://sonarqube.uds.dev/api/system/status' | ./uds zarf tools yq '.status')
echo "SonarQube system status: ${STATUS}"
if [ $STATUS != "UP" ]; then
sleep 10
exit 1
fi
- name: ui
description: SonarQube UI Checks
actions:
- cmd: npm ci
dir: tests
- cmd: npx playwright install --with-deps
dir: tests
- cmd: npx playwright test
dir: tests
28 changes: 28 additions & 0 deletions tests/auth.setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { test as setup, expect } from '@playwright/test';
import { authFile } from './playwright.config';

setup('authenticate', async ({ page, context }) => {
await page.goto('/sessions/new');

await page.locator('.identity-provider-link').click();
await page.getByLabel('Username or email').fill('doug');
await page.getByLabel('Password').fill('unicorn123!@#');

await page.getByRole("button", { name: "Log In" }).click();

await page.waitForURL('/projects'); // successful redirect

// ensure auth cookies were set
const cookies = await context.cookies();
const keycloakCookie = cookies.find(
(cookie) => cookie.name === "KEYCLOAK_SESSION",
);

expect(keycloakCookie).toBeDefined();
expect(keycloakCookie?.value).not.toBe("");
expect(keycloakCookie?.domain).toContain("sso.");

await page.context().storageState({ path: authFile });

await expect(page).toHaveURL('/projects');
})
104 changes: 104 additions & 0 deletions tests/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions tests/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "uds-package-sonarqube",
"license": "Apache-2.0",
"devDependencies": {
"@playwright/test": "^1.43.1",
"@types/node": "^20.12.12",
"typescript": "^5.4.5"
}
}
43 changes: 43 additions & 0 deletions tests/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { defineConfig, devices } from '@playwright/test';

export const playwrightDir = '.playwright';
export const authFile = `${playwrightDir}/auth/user.json`;

/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
fullyParallel: true,
forbidOnly: !!process.env.CI, // fail CI if you accidently leave `test.only` in source
retries: process.env.CI ? 1 : 0,
workers: 1,
reporter: [
// Reporter to use. See https://playwright.dev/docs/test-reporters
['html', { outputFolder: `${playwrightDir}/reports`, open: 'never' }],
['json', { outputFile: `${playwrightDir}/reports/test-results.json`, open: 'never' }],
['list']
],

outputDir: `${playwrightDir}/output`,

use: {
baseURL: process.env.BASE_URL || 'https://sonarqube.uds.dev', // for `await page.goto('/')` etc
trace: 'on-first-retry', // collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer
},

projects: [
{ name: 'setup', testMatch: /.*\.setup\.ts/ }, // authentication

...[
'Desktop Chrome',
'Desktop Firefox',
].map((p) => ({
name: devices[p].defaultBrowserType,
dependencies: ['setup'],
use: {
...devices[p],
storageState: authFile,
},
})),
],
});
19 changes: 19 additions & 0 deletions tests/sonarqube.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { test, expect } from "@playwright/test";

function randomProjectName() {
return `uds-package-sonarqube-${Math.floor((Math.random() * 1000))}`;
}

test('create a project', async ({ page }) => {
await page.goto('/projects/create');

const projectName = randomProjectName();

await page.getByRole('button', { name: 'Manually' }).click();
await page.getByLabel('Project display name*').fill(projectName);
await page.getByRole('button', { name: 'Set Up' }).click();

await expect(page).toHaveURL(`/dashboard?id=${projectName}`);

await expect(page.getByRole('heading', { level: 1 })).toContainText(projectName);
});
10 changes: 10 additions & 0 deletions tests/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"compilerOptions": {
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"module": "commonjs", /* Specify what module code is generated. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
"strict": true, /* Enable all strict type-checking options. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}

0 comments on commit 8db5ada

Please sign in to comment.