2022-02-28 15:28:02 +00:00
|
|
|
import { expect } from '@playwright/test';
|
|
|
|
|
2022-10-11 08:56:12 +00:00
|
|
|
import { loadFixture } from '../../playwright/paths';
|
|
|
|
import { test } from '../../playwright/test';
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
test('can make oauth2 requests', async ({ app, page }) => {
|
2022-07-25 11:34:34 +00:00
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
test.setTimeout(6 * 60 * 1000);
|
|
|
|
} else {
|
|
|
|
test.slow();
|
|
|
|
}
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
const sendButton = page.locator('[data-testid="request-pane"] button:has-text("Send")');
|
|
|
|
const statusTag = page.locator('[data-testid="response-status-tag"]:visible');
|
|
|
|
const responseBody = page.locator('[data-testid="CodeEditor"]:visible', {
|
|
|
|
has: page.locator('.CodeMirror-activeline'),
|
|
|
|
});
|
|
|
|
|
2022-10-12 20:26:11 +00:00
|
|
|
const projectView = page.locator('#wrapper');
|
2023-08-28 13:53:37 +00:00
|
|
|
await projectView.getByRole('button', { name: 'Create in project' }).click();
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
const text = await loadFixture('oauth.yaml');
|
|
|
|
await app.evaluate(async ({ clipboard }, text) => clipboard.writeText(text), text);
|
|
|
|
|
2023-08-28 13:53:37 +00:00
|
|
|
await page.getByRole('menuitemradio', { name: 'Import' }).click();
|
2023-09-24 23:12:50 +00:00
|
|
|
await page.locator('[data-test-id="import-from-clipboard"]').click();
|
2023-03-31 10:53:22 +00:00
|
|
|
await page.getByRole('button', { name: 'Scan' }).click();
|
2023-06-27 18:46:43 +00:00
|
|
|
await page.getByRole('dialog').getByRole('button', { name: 'Import' }).click();
|
2023-06-27 15:43:51 +00:00
|
|
|
await page.getByText('CollectionOAuth Testingjust now').click();
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
// Authorization code
|
2023-08-22 16:12:29 +00:00
|
|
|
await projectView.getByLabel('Request Collection').getByRole('row', { name: 'Authorization Code' }).click();
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
// No PKCE
|
2023-08-22 16:12:29 +00:00
|
|
|
await projectView.getByLabel('Request Collection').getByRole('row', { name: 'No PKCE' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/me');
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
const [authorizationCodePage] = await Promise.all([
|
2022-07-12 17:14:07 +00:00
|
|
|
app.waitForEvent('window'),
|
2022-02-28 15:28:02 +00:00
|
|
|
sendButton.click(),
|
|
|
|
]);
|
|
|
|
|
|
|
|
await authorizationCodePage.waitForLoadState();
|
2022-03-07 13:10:35 +00:00
|
|
|
await authorizationCodePage.waitForFunction("document.cookie !== ''");
|
2022-02-28 15:28:02 +00:00
|
|
|
await authorizationCodePage.locator('[name="login"]').fill('admin');
|
|
|
|
await authorizationCodePage.locator('[name="password"]').fill('admin');
|
|
|
|
await authorizationCodePage.locator('button:has-text("Sign-in")').click();
|
|
|
|
|
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"sub": "admin"');
|
|
|
|
|
|
|
|
// Navigate to the OAuth2 Tab and refresh the token from there
|
2023-01-20 14:49:52 +00:00
|
|
|
await page.getByRole('tab', { name: 'OAuth 2' }).click();
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
const tokenInput = page.locator('[for="Access-Token"] > input');
|
|
|
|
const prevToken = await tokenInput.inputValue();
|
|
|
|
await page.locator('button:has-text("Refresh Token")').click();
|
|
|
|
await expect(tokenInput).not.toHaveValue(prevToken);
|
|
|
|
|
|
|
|
// Clear the session and tokens and fetch a token manually
|
|
|
|
await page.locator('text=Advanced Options').click();
|
|
|
|
await page.locator('button:has-text("Clear OAuth 2 session")').click();
|
|
|
|
await page.locator('button:text-is("Clear")').click();
|
|
|
|
|
|
|
|
const [refreshPage] = await Promise.all([
|
2022-07-12 17:14:07 +00:00
|
|
|
app.waitForEvent('window'),
|
2022-02-28 15:28:02 +00:00
|
|
|
page.locator('button:has-text("Fetch Tokens")').click(),
|
|
|
|
]);
|
|
|
|
|
|
|
|
await refreshPage.waitForLoadState();
|
2022-03-07 13:10:35 +00:00
|
|
|
// expect an _interaction cookie to be set with the sign in form
|
|
|
|
await refreshPage.waitForFunction("document.cookie !== ''");
|
2022-02-28 15:28:02 +00:00
|
|
|
await refreshPage.locator('[name="login"]').fill('admin');
|
|
|
|
await refreshPage.locator('[name="password"]').fill('admin');
|
|
|
|
await refreshPage.locator('button:has-text("Sign-in")').click();
|
|
|
|
|
|
|
|
await expect(tokenInput).not.toHaveValue('');
|
|
|
|
|
|
|
|
// PKCE SHA256
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'PKCE SHA256' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/me');
|
|
|
|
await expect(page.locator('#Grant-Type')).toHaveValue('authorization_code');
|
|
|
|
await expect(page.locator('#Code-Challenge-Method')).toHaveValue('S256');
|
2022-03-07 13:10:35 +00:00
|
|
|
await sendButton.click();
|
2022-02-28 15:28:02 +00:00
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"sub": "admin"');
|
|
|
|
|
|
|
|
// PKCE Plain
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'PKCE Plain' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/me');
|
|
|
|
await expect(page.locator('#Grant-Type')).toHaveValue('authorization_code');
|
|
|
|
await expect(page.locator('#Code-Challenge-Method')).toHaveValue('plain');
|
2022-02-28 15:28:02 +00:00
|
|
|
await sendButton.click();
|
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"sub": "admin"');
|
|
|
|
|
|
|
|
// Reset the OAuth 2 session from Preferences
|
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
await page.keyboard.press('Meta+,');
|
|
|
|
} else {
|
|
|
|
await page.keyboard.press('Control+,');
|
|
|
|
}
|
|
|
|
await page.locator('button:has-text("Clear OAuth 2 session")').click();
|
|
|
|
await page.keyboard.press('Escape');
|
|
|
|
|
|
|
|
// Implicit
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'Implicit' }).click();
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
// ID Token
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'ID Token' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/id-token');
|
|
|
|
await expect(page.locator('#Grant-Type')).toHaveValue('implicit');
|
2022-02-28 15:28:02 +00:00
|
|
|
|
|
|
|
const [implicitPage] = await Promise.all([
|
2022-07-12 17:14:07 +00:00
|
|
|
app.waitForEvent('window'),
|
2022-02-28 15:28:02 +00:00
|
|
|
sendButton.click(),
|
|
|
|
]);
|
|
|
|
await implicitPage.waitForLoadState();
|
2022-03-07 13:10:35 +00:00
|
|
|
await implicitPage.waitForFunction("document.cookie !== ''");
|
2022-02-28 15:28:02 +00:00
|
|
|
await implicitPage.locator('[name="login"]').fill('admin');
|
|
|
|
await implicitPage.locator('[name="password"]').fill('admin');
|
|
|
|
await implicitPage.locator('button:has-text("Sign-in")').click();
|
|
|
|
|
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"sub": "admin"');
|
|
|
|
|
|
|
|
// ID and Access Token
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'ID and Access Token' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/me');
|
|
|
|
await expect(page.locator('#Grant-Type')).toHaveValue('implicit');
|
2022-02-28 15:28:02 +00:00
|
|
|
await sendButton.click();
|
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"sub": "admin"');
|
|
|
|
|
|
|
|
// Reset the OAuth 2 session from Preferences
|
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
await page.keyboard.press('Meta+,');
|
|
|
|
} else {
|
|
|
|
await page.keyboard.press('Control+,');
|
|
|
|
}
|
|
|
|
await page.locator('button:has-text("Clear OAuth 2 session")').click();
|
|
|
|
await page.keyboard.press('Escape');
|
|
|
|
|
|
|
|
// Client Credentials
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'Client Credentials' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/client-credential');
|
|
|
|
await expect(page.locator('#Grant-Type')).toHaveValue('client_credentials');
|
2022-02-28 15:28:02 +00:00
|
|
|
await sendButton.click();
|
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"clientId": "client_credentials"');
|
|
|
|
|
|
|
|
// Reset the OAuth 2 session from Preferences
|
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
await page.keyboard.press('Meta+,');
|
|
|
|
} else {
|
|
|
|
await page.keyboard.press('Control+,');
|
|
|
|
}
|
|
|
|
await page.locator('button:has-text("Clear OAuth 2 session")').click();
|
|
|
|
await page.keyboard.press('Escape');
|
|
|
|
|
|
|
|
// Resource Owner Password Credentials
|
2023-08-22 16:12:29 +00:00
|
|
|
await page.getByLabel('Request Collection').getByRole('row', { name: 'Resource Owner Password Credentials' }).click();
|
2022-11-08 10:50:53 +00:00
|
|
|
await expect(page.locator('.app')).toContainText('http://127.0.0.1:4010/oidc/me');
|
|
|
|
await expect(page.locator('#Grant-Type')).toHaveValue('password');
|
2022-02-28 15:28:02 +00:00
|
|
|
await sendButton.click();
|
|
|
|
await expect(statusTag).toContainText('200 OK');
|
|
|
|
await expect(responseBody).toContainText('"sub": "foo"');
|
|
|
|
});
|