Files
bruno/tests/auth/oauth1/oauth1.spec.ts
lohit cd06f28430 fix: rename signatureEncoding to signatureMethod for OAuth1 in opencollection types (#7724)
Align with @opencollection/types 0.9.1 which renamed the OAuth1 field from
signatureEncoding to signatureMethod. Update converters, filestore, and all
YML test fixtures. Increase OAuth1 UI test timeouts from 30s to 60s.
2026-04-09 23:36:39 +05:30

161 lines
6.7 KiB
TypeScript

import { test, expect } from '../../../playwright';
import {
closeAllCollections, createCollection, createRequest, openRequest,
selectRequestPaneTab, saveRequest
} from '../../utils/page';
const label = (page, text: string) => page.locator('label').filter({ hasText: new RegExp(`^${text}$`) });
const sectionLabel = (page, text: string) => page.locator('.oauth1-section-label').filter({ hasText: text });
const dropdownItem = (page, text: string) => page.locator('.dropdown-item').filter({ hasText: text });
const fieldRow = (page, text: string) => label(page, text).locator('..');
const editorIn = (row) => row.locator('.single-line-editor-wrapper .CodeMirror');
const typeInField = async (page, fieldName: string, value: string) => {
await editorIn(fieldRow(page, fieldName)).click();
await page.keyboard.type(value);
};
const selectAuthMode = async (page) => {
await page.locator('.auth-mode-label').click();
await dropdownItem(page, 'OAuth 1.0').click();
};
test.describe('OAuth 1.0 Authentication', () => {
test.afterAll(async ({ page }) => {
await closeAllCollections(page);
});
test('Request auth UI', async ({ page, createTmpDir }) => {
test.setTimeout(60_000);
// Setup
await createCollection(page, 'oauth1-test', await createTmpDir());
await createRequest(page, 'oauth1-request', 'oauth1-test', { url: 'https://example.com/api' });
await openRequest(page, 'oauth1-test', 'oauth1-request');
await selectRequestPaneTab(page, 'Auth');
await selectAuthMode(page);
// Sections
await test.step('Three sections are visible', async () => {
for (const name of ['Configuration', 'Signature', 'Advanced']) {
await expect(sectionLabel(page, name)).toBeVisible();
}
});
// HMAC fields (top-level, always visible)
await test.step('HMAC mode shows correct fields', async () => {
for (const name of ['Consumer Key', 'Consumer Secret', 'Token', 'Token Secret']) {
await expect(label(page, name)).toBeVisible();
}
await expect(label(page, 'Private Key')).not.toBeVisible();
});
// Advanced section is collapsed by default
await test.step('Advanced fields are hidden by default', async () => {
for (const name of ['Callback URL', 'Verifier', 'Timestamp', 'Nonce', 'Version', 'Realm']) {
await expect(label(page, name)).not.toBeVisible();
}
});
// Expand Advanced section
await test.step('Clicking Advanced expands the section', async () => {
await sectionLabel(page, 'Advanced').click();
for (const name of ['Callback URL', 'Verifier', 'Timestamp', 'Nonce', 'Version', 'Realm']) {
await expect(label(page, name)).toBeVisible();
}
});
// Signature method dropdown
await test.step('All 7 signature methods in dropdown', async () => {
const sigDropdown = fieldRow(page, 'Signature Method').locator('.oauth1-dropdown-selector');
await sigDropdown.click();
for (const method of ['HMAC-SHA1', 'HMAC-SHA256', 'HMAC-SHA512', 'RSA-SHA1', 'RSA-SHA256', 'RSA-SHA512', 'PLAINTEXT']) {
await expect(dropdownItem(page, method)).toBeVisible();
}
});
// RSA mode toggles fields
await test.step('RSA mode shows Private Key, hides Consumer Secret', async () => {
await dropdownItem(page, 'RSA-SHA256').click();
const sigDropdown = fieldRow(page, 'Signature Method').locator('.oauth1-dropdown-selector');
await expect(sigDropdown.locator('.oauth1-dropdown-label')).toContainText('RSA-SHA256');
await expect(label(page, 'Private Key')).toBeVisible();
await expect(label(page, 'Consumer Secret')).not.toBeVisible();
// Private Key editor accepts input
const pkEditor = page.locator('.private-key-editor-wrapper .CodeMirror');
await expect(pkEditor).toBeVisible();
await pkEditor.click();
await page.keyboard.type('test-private-key');
// Switch back to HMAC-SHA1
await sigDropdown.click();
await dropdownItem(page, 'HMAC-SHA1').click();
await expect(label(page, 'Consumer Secret')).toBeVisible();
await expect(label(page, 'Private Key')).not.toBeVisible();
});
// Collapse and re-expand Advanced
await test.step('Clicking Advanced again collapses the section', async () => {
await sectionLabel(page, 'Advanced').click();
await expect(label(page, 'Callback URL')).not.toBeVisible();
await expect(label(page, 'Timestamp')).not.toBeVisible();
// Re-expand for subsequent steps
await sectionLabel(page, 'Advanced').click();
await expect(label(page, 'Callback URL')).toBeVisible();
});
// Fill fields
await test.step('Fill form fields', async () => {
await typeInField(page, 'Consumer Key', 'my-consumer-key');
await typeInField(page, 'Token', 'my-token');
await typeInField(page, 'Timestamp', '1234567890');
});
// Add Params To dropdown
await test.step('Add Params To dropdown cycles options', async () => {
const apDropdown = fieldRow(page, 'Add Params To').locator('.oauth1-dropdown-selector');
await expect(apDropdown.locator('.oauth1-dropdown-label')).toContainText('Header');
await apDropdown.click();
await dropdownItem(page, 'Query Params').click();
await expect(apDropdown.locator('.oauth1-dropdown-label')).toContainText('Query Params');
await apDropdown.click();
await dropdownItem(page, 'Header').click();
});
// Include Body Hash checkbox
await test.step('Include Body Hash checkbox toggles', async () => {
const checkbox = page.locator('input[type="checkbox"]');
const bodyHashLabel = page.locator('label').filter({ hasText: 'Include Body Hash' });
await expect(checkbox).not.toBeChecked();
await bodyHashLabel.click();
await expect(checkbox).toBeChecked();
await bodyHashLabel.click();
await expect(checkbox).not.toBeChecked();
});
await saveRequest(page);
});
test('Collection settings auth', async ({ page }) => {
test.setTimeout(60_000);
const collectionRow = page.getByTestId('collections').locator('#sidebar-collection-name').filter({ hasText: 'oauth1-test' });
await collectionRow.click();
await page.locator('.tab.auth').click();
await selectAuthMode(page);
await test.step('Sections are visible, Advanced collapsed by default', async () => {
for (const name of ['Configuration', 'Signature', 'Advanced']) {
await expect(sectionLabel(page, name)).toBeVisible();
}
// Advanced fields hidden by default
await expect(label(page, 'Callback URL')).not.toBeVisible();
});
await test.step('Fill and save', async () => {
await typeInField(page, 'Consumer Key', 'collection-consumer-key');
await page.getByRole('button', { name: 'Save' }).click();
});
});
});