mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-11 09:51:30 +00:00
* feat: revamp Runner UI with Timings and Filters sections * fix: use configurable radio name for runner tags * fix: update Run Collection modal ui * refactor: improve runner radios accessibility and ux * fix: address runner review nits * fix: update tag list hover styling * fix: add data-testid for runner button * fix: preserve runner delay when updating request selection config * fix: preserve runner requestItemsOrder on run --------- Co-authored-by: naman-bruno <naman@usebruno.com>
68 lines
3.0 KiB
TypeScript
68 lines
3.0 KiB
TypeScript
import { test, expect } from '../../playwright';
|
|
import { setSandboxMode, runCollection, validateRunnerResults } from '../utils/page/index';
|
|
|
|
test.describe.parallel('Collection Run', () => {
|
|
test('Run bruno-testbench in Developer Mode', async ({ pageWithUserData: page }) => {
|
|
test.setTimeout(2 * 60 * 1000);
|
|
|
|
// Set up developer mode
|
|
await setSandboxMode(page, 'bruno-testbench', 'developer');
|
|
|
|
// Select environment
|
|
await page.locator('.environment-selector').nth(1).click();
|
|
await page.locator('.dropdown-item').getByText('Prod').click();
|
|
|
|
// Run the collection
|
|
await runCollection(page, 'bruno-testbench');
|
|
|
|
// Validate test results
|
|
await validateRunnerResults(page, {
|
|
failed: 0
|
|
});
|
|
});
|
|
|
|
test.fixme('Run bruno-testbench in Safe Mode', async ({ pageWithUserData: page }) => {
|
|
test.setTimeout(2 * 60 * 1000);
|
|
|
|
await page.getByText('bruno-testbench').click();
|
|
await page.locator('.environment-selector').nth(1).click();
|
|
await page.locator('.dropdown-item').getByText('Prod').click();
|
|
const collectionContainer = page.getByTestId('collections').locator('.collection-name').filter({ hasText: 'bruno-testbench' });
|
|
await collectionContainer.hover();
|
|
await collectionContainer.locator('.collection-actions .icon').waitFor({ state: 'visible' });
|
|
await collectionContainer.locator('.collection-actions .icon').click();
|
|
await page.getByText('Run', { exact: true }).click();
|
|
// Wait for the runner tab to open
|
|
// If there are existing results, reset first, otherwise wait for Run Collection button
|
|
const resetButton = page.getByRole('button', { name: 'Reset' });
|
|
const runCollectionButton = page.getByTestId('runner-run-button');
|
|
|
|
// Check if Reset button is visible (means there are existing results)
|
|
const resetVisible = await resetButton.isVisible().catch(() => false);
|
|
if (resetVisible) {
|
|
await resetButton.click();
|
|
// Wait a bit for the reset to complete
|
|
await page.waitForTimeout(500);
|
|
}
|
|
|
|
// Now wait for and click Run Collection button
|
|
await runCollectionButton.waitFor({ state: 'visible', timeout: 10000 });
|
|
await runCollectionButton.click();
|
|
await page.getByRole('button', { name: 'Run Again' }).waitFor({ timeout: 2 * 60 * 1000 });
|
|
|
|
// Parse and validate test results from filter buttons
|
|
const allButton = page.locator('button').filter({ hasText: /^All/ });
|
|
const passedButton = page.locator('button').filter({ hasText: /^Passed/ });
|
|
const failedButton = page.locator('button').filter({ hasText: /^Failed/ });
|
|
const skippedButton = page.locator('button').filter({ hasText: /^Skipped/ });
|
|
|
|
const totalRequests = parseInt(await allButton.locator('span').innerText());
|
|
const passed = parseInt(await passedButton.locator('span').innerText());
|
|
const failed = parseInt(await failedButton.locator('span').innerText());
|
|
const skipped = parseInt(await skippedButton.locator('span').innerText());
|
|
|
|
await expect(failed).toBe(0);
|
|
await expect(passed).toBe(totalRequests - skipped - failed);
|
|
});
|
|
});
|