Skip to content
Draft
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: 2 additions & 1 deletion e2e/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,11 @@ services:
thunder-setup:
condition: service_completed_successfully
ports:
- "8090:8090"
- "9090:8090"
volumes:
- thunder-db:/opt/thunder/repository/database
- ./thunder-config/deployment.yaml:/opt/thunder/repository/conf/deployment.yaml:ro
- ./thunder-config/gate-config.js:/opt/thunder/apps/gate/config.js:ro
healthcheck:
test: ["CMD", "curl", "-k", "-f", "https://localhost:8090/health/readiness"]
interval: 10s
Expand Down
10 changes: 7 additions & 3 deletions e2e/fixtures/base.fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,23 @@
*/

import {test as base} from '@playwright/test';
import {TEST_USER, SAMPLE_APP} from '../setup/constants';
import {TEST_USER, getSampleApp, getSampleAppTarget, type SampleAppTarget} from '../setup/constants';

export type E2EFixtures = {
testUser: typeof TEST_USER;
sampleApp: typeof SAMPLE_APP;
sampleApp: ReturnType<typeof getSampleApp>;
sampleAppTarget: SampleAppTarget;
};

export const test = base.extend<E2EFixtures>({
testUser: async ({}, use) => {
await use(TEST_USER);
},
sampleApp: async ({}, use) => {
await use(SAMPLE_APP);
await use(getSampleApp());
},
sampleAppTarget: async ({}, use) => {
await use(getSampleAppTarget());
},
});

Expand Down
63 changes: 63 additions & 0 deletions e2e/helpers/angular/auth-helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/**
* Angular-specific authentication helpers for e2e tests.
*
* The Angular sample app triggers sign-in from the landing page (/)
* by clicking the "Sign In" button, which redirects to the IDP.
* This differs from React which has a dedicated /signin route.
*/

import {type Page} from '@playwright/test';
import {getIdpTarget} from '../../setup/constants';
import {getSignInCredentials} from '../auth-helpers';
import {fillIsLoginForm, handleIsLogoutConsent} from '../is/auth-helpers';
import {fillThunderLoginForm} from '../thunder/auth-helpers';
import {ANGULAR_SELECTORS} from './selectors';

/**
* Performs sign-in for the Angular sample app via redirect-based OAuth2.
*
* 1. Navigate to / (landing page)
* 2. Click "Sign In" button → app calls authService.signIn() → redirects to IDP
* 3. Fill IDP login form and submit
* 4. IDP redirects to /callback → SDK exchanges code for tokens → navigates to /dashboard
*/
export async function performAngularSignIn(page: Page): Promise<void> {
const idpTarget = getIdpTarget();
const credentials = getSignInCredentials();

await page.goto('/');

// Click the "Sign In" button in the header (landing page has two — header + hero)
await page.getByRole('banner').getByRole('button', {name: ANGULAR_SELECTORS.landing.signInButtonText}).click();

if (idpTarget === 'is') {
await page.waitForURL('**/authenticationendpoint/**', {timeout: 30_000});
await fillIsLoginForm(page, credentials);
} else {
await page.waitForURL('**/gate/signin**', {timeout: 30_000});
await fillThunderLoginForm(page, credentials);
}

await page.waitForURL('**/dashboard**', {timeout: 30_000});
await page.waitForSelector(ANGULAR_SELECTORS.dashboard.welcomeHeading, {timeout: 15_000});
}

/**
* Performs sign-out for the Angular sample app.
*
* Clicks the user dropdown trigger → "Sign Out" menu item.
* For IS, also handles the logout consent page.
*/
export async function performAngularSignOut(page: Page): Promise<void> {
await page.locator(ANGULAR_SELECTORS.header.userDropdownTrigger).click();
await page.getByText(ANGULAR_SELECTORS.header.signOutButtonText).click();

const idpTarget = getIdpTarget();

if (idpTarget === 'is') {
await handleIsLogoutConsent(page);
}

// Wait for redirect back to the landing page (may include ?state=sign_out_success)
await page.waitForURL(/localhost:\d+\/(\?.*)?$/, {timeout: 15_000});
}
23 changes: 23 additions & 0 deletions e2e/helpers/angular/selectors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* Selectors for the Angular sample app (teamspace-angular).
*
* Angular uses the same CSS class names as the React SDK where possible,
* but some text casing and element structure differs.
*/

export const ANGULAR_SELECTORS = {
landing: {
signInButtonText: 'Sign In',
},
header: {
userDropdownTrigger: '.asgardeo-user-dropdown__trigger',
signOutButtonText: 'Sign Out',
},
dashboard: {
welcomeHeading: 'h1',
},
profile: {
heading: 'h1',
backToDashboard: 'Back to dashboard',
},
} as const;
7 changes: 4 additions & 3 deletions e2e/helpers/auth-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/

import {type Page} from '@playwright/test';
import {TEST_USER, getIdpTarget} from '../setup/constants';
import {TEST_USER, getIdpTarget, getSampleApp} from '../setup/constants';
import {THUNDER_CONFIG} from '../setup/thunder/constants';
import {SELECTORS} from './selectors';
import {performIsSignIn, handleIsLogoutConsent} from './is/auth-helpers';
Expand All @@ -18,7 +18,7 @@ import {performThunderSignIn} from './thunder/auth-helpers';
* - IS: Uses the provisioned test user (e2e-test-user)
* - Thunder: Uses the pre-created admin user (admin/admin)
*/
function getSignInCredentials(): {username: string; password: string} {
export function getSignInCredentials(): {username: string; password: string} {
const idpTarget = getIdpTarget();

if (idpTarget === 'thunder') {
Expand Down Expand Up @@ -62,8 +62,9 @@ export async function performSignIn(page: Page): Promise<void> {
*/
export async function performEmbeddedSignIn(page: Page): Promise<void> {
const credentials = getSignInCredentials();
const sampleApp = getSampleApp();

await page.goto('/signin');
await page.goto(sampleApp.signInPath);

// Wait for the <SignIn /> component to load and render form fields from the IDP
await page.waitForSelector(SELECTORS.embeddedSignIn.container, {timeout: 30_000});
Expand Down
29 changes: 20 additions & 9 deletions e2e/helpers/is/auth-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,41 @@
*/

import {type Page} from '@playwright/test';
import {SAMPLE_APP} from '../../setup/constants';
import {getSampleApp} from '../../setup/constants';
import {SELECTORS} from '../selectors';
import {IS_SELECTORS} from './selectors';

/**
* Fills the IS login form with credentials and submits.
*
* Assumes the browser is already on the IS authentication endpoint page.
* This is reusable across all frameworks (React, Angular, etc.).
*/
export async function fillIsLoginForm(page: Page, credentials: {username: string; password: string}): Promise<void> {
await page.waitForSelector(IS_SELECTORS.login.usernameInput, {timeout: 15_000});

await page.locator(IS_SELECTORS.login.usernameInput).fill(credentials.username);
await page.locator(IS_SELECTORS.login.passwordInput).fill(credentials.password);
await page.locator(IS_SELECTORS.login.signInButton).click();
}

/**
* Performs sign-in via the redirect-based flow for WSO2 IS.
*
* 1. Navigate to /signin → app calls signIn() → browser redirects to IS authentication endpoint
* 1. Navigate to the sample app's sign-in path → app calls signIn() → browser redirects to IS
* 2. Fill username/password on the IS login page
* 3. Submit → IS redirects back to /callback with auth code
* 4. SDK exchanges code for tokens → CallbackPage navigates to /dashboard
*/
export async function performIsSignIn(page: Page, credentials: {username: string; password: string}): Promise<void> {
await page.goto(SAMPLE_APP.signInPath);
const sampleApp = getSampleApp();

await page.goto(sampleApp.signInPath);

// Wait for redirect to IS's authentication endpoint
await page.waitForURL('**/authenticationendpoint/**', {timeout: 30_000});

// Wait for the IS login form to render
await page.waitForSelector(IS_SELECTORS.login.usernameInput, {timeout: 15_000});

await page.locator(IS_SELECTORS.login.usernameInput).fill(credentials.username);
await page.locator(IS_SELECTORS.login.passwordInput).fill(credentials.password);
await page.locator(IS_SELECTORS.login.signInButton).click();
await fillIsLoginForm(page, credentials);

// After successful auth, IS redirects to /callback, SDK exchanges code for tokens,
// then CallbackPage navigates to /dashboard.
Expand Down
29 changes: 20 additions & 9 deletions e2e/helpers/thunder/auth-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,28 @@
*/

import {type Page} from '@playwright/test';
import {SAMPLE_APP} from '../../setup/constants';
import {getSampleApp} from '../../setup/constants';
import {SELECTORS} from '../selectors';
import {THUNDER_SELECTORS} from './selectors';

/**
* Fills the Thunder Gate login form with credentials and submits.
*
* Assumes the browser is already on the Gate login page.
* This is reusable across all frameworks (React, Angular, etc.).
*/
export async function fillThunderLoginForm(page: Page, credentials: {username: string; password: string}): Promise<void> {
await page.waitForSelector(THUNDER_SELECTORS.gate.usernameInput, {timeout: 15_000});

await page.locator(THUNDER_SELECTORS.gate.usernameInput).fill(credentials.username);
await page.locator(THUNDER_SELECTORS.gate.passwordInput).fill(credentials.password);
await page.getByRole('button', {name: THUNDER_SELECTORS.gate.submitButtonText}).click();
}

/**
* Performs sign-in via the redirect-based flow for Thunder.
*
* 1. Navigate to /signin → app calls signIn() → browser redirects to Thunder's Gate login page
* 1. Navigate to the sample app's sign-in path → app calls signIn() → browser redirects to Gate
* 2. Fill username/password on the Gate page
* 3. Submit → Thunder redirects back to /callback with auth code
* 4. SDK exchanges code for tokens → CallbackPage navigates to /dashboard
Expand All @@ -19,17 +33,14 @@ export async function performThunderSignIn(
page: Page,
credentials: {username: string; password: string},
): Promise<void> {
await page.goto(SAMPLE_APP.signInPath);
const sampleApp = getSampleApp();

await page.goto(sampleApp.signInPath);

// Wait for redirect to Thunder's Gate login page
await page.waitForURL('**/gate/signin**', {timeout: 30_000});

// Wait for the Gate login form to render (it's a React SPA)
await page.waitForSelector(THUNDER_SELECTORS.gate.usernameInput, {timeout: 15_000});

await page.locator(THUNDER_SELECTORS.gate.usernameInput).fill(credentials.username);
await page.locator(THUNDER_SELECTORS.gate.passwordInput).fill(credentials.password);
await page.getByRole('button', {name: THUNDER_SELECTORS.gate.submitButtonText}).click();
await fillThunderLoginForm(page, credentials);

// After successful auth, Thunder redirects to /callback, SDK exchanges code for tokens,
// then CallbackPage navigates to /dashboard.
Expand Down
2 changes: 1 addition & 1 deletion e2e/playwright-report-embedded/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,4 @@
<div id='root'></div>
</body>
</html>
<script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script>
<script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script>
3 changes: 2 additions & 1 deletion e2e/playwright.embedded.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import {defineConfig, devices} from '@playwright/test';
import path from 'path';

const SAMPLE_APP_URL = process.env.SAMPLE_APP_URL ?? 'https://localhost:5173';
const SAMPLE_APP_TARGET = process.env.SAMPLE_APP_TARGET ?? 'react';
const IDP_TARGET = process.env.IDP_TARGET ?? 'is';

export default defineConfig({
testDir: `./tests/${IDP_TARGET}/embedded`,
testDir: `./tests/${SAMPLE_APP_TARGET}/${IDP_TARGET}/embedded`,
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
Expand Down
3 changes: 2 additions & 1 deletion e2e/playwright.redirect.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import {defineConfig, devices} from '@playwright/test';
import path from 'path';

const SAMPLE_APP_URL = process.env.SAMPLE_APP_URL ?? 'https://localhost:5173';
const SAMPLE_APP_TARGET = process.env.SAMPLE_APP_TARGET ?? 'react';
const IDP_TARGET = process.env.IDP_TARGET ?? 'is';

export default defineConfig({
testDir: `./tests/${IDP_TARGET}/redirect`,
testDir: `./tests/${SAMPLE_APP_TARGET}/${IDP_TARGET}/redirect`,
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
Expand Down
Loading
Loading