mirror of
https://github.com/usebruno/bruno.git
synced 2026-07-07 14:08:38 +00:00
* feat: move import collection from git url and spec url from enterprise edition to opensource
* fix: corrected a typo
* test: add unit and e2e tests for import collection migration
* fix: guard against missing userAgentData platform in getOSName — Default platform to '' to prevent TypeError when navigator.userAgentData is unavailable (GitNotFoundModal/index.js)
fix: UID mismatch between status tracking and UI rendering in bulk import — Preserve synthetic file-${index} UID on converted collections so initialStatus, rename tracking, and the render loop all use the same key (BulkImportCollectionLocation/index.js)
fix: isConfirmDisabled returning non-boolean value — Changed .length checks to explicit comparisons (> 0, === 0) so the function always returns true/false (CloneGitRespository/index.js)
fix: missing ipcRenderer declaration in cloneGitRepository and scanForBrunoFiles — Added const { ipcRenderer } = window; to both actions to prevent ReferenceError at runtime (collections/actions.js)
fix: use strict equality in filterItemsInCollection — Changed == to === for item.name and item.type comparisons (importers/common.js)
fix: variable shadowing in transformItemsInCollection and hydrateSeqInCollection — Renamed forEach callback parameter from collection to col to avoid shadowing the outer parameter (importers/common.js)
fix: scanForBrunoFiles traversing node_modules and .git directories — Added exclusion for node_modules and .git to match getCollectionStats pattern, preventing app freezes on large repos (filesystem.js)
fix: diff hunk header using string character count instead of line count — Preserved prefixedLines array to compute lineCount before joining, so the @@ header has the correct line count (git.js)
fix: test locators not scoped to modal in bulk import e2e test — Changed page.getByTestId to bulkImportModal.getByTestId for grouping dropdown interactions (002-all-collection-types.spec.ts)
fix: missing afterEach cleanup in GitHub repository import test — Added closeAllCollections hook to match sibling test specs, replaced unused dotenv/config import (github-repository-import.spec.ts)
* fix: batch name tracking and git utility fixes
- Fix usedNamesInBatch tracking original name instead of final name, which
could produce duplicate environment names within the same batch
(BulkImportCollectionLocation/index.js)
- Remove unused lodash import (git.js)
- Add missing early return in fetchRemotes when gitRootPath is falsy,
preventing getSimpleGitInstanceForPath from running with undefined (git.js)
* fix: correct variable naming and state management in CloneGitRepository component
- Renamed `collectionpaths` to `collectionPaths` for consistency and clarity.
- Updated references throughout the component to use the corrected variable name.
- Removed error toast notification to streamline error handling during repository cloning.
103 lines
5.1 KiB
TypeScript
103 lines
5.1 KiB
TypeScript
import { test, expect } from '../../../playwright';
|
|
import { closeAllCollections, openCollection } from '../../utils/page';
|
|
|
|
test.describe('OpenAPI URL Import', () => {
|
|
test.afterEach(async ({ page }) => {
|
|
// cleanup: close all collections
|
|
await closeAllCollections(page);
|
|
});
|
|
|
|
test('Swagger/OpenAPI URL import', async ({ page, createTmpDir }) => {
|
|
const openapiUrl = 'https://petstore.swagger.io/v2/swagger.json';
|
|
|
|
await page.getByTestId('collections-header-add-menu').click();
|
|
await page.locator('.tippy-box .dropdown-item').filter({ hasText: 'Import collection' }).click();
|
|
|
|
// Wait for import collection modal to be ready
|
|
const importModal = page.getByTestId('import-collection-modal');
|
|
await importModal.waitFor({ state: 'visible' });
|
|
|
|
await page.getByTestId('url-tab').click();
|
|
await page.getByTestId('url-input').waitFor({ state: 'visible' });
|
|
await page.getByTestId('url-input').fill(openapiUrl);
|
|
await page.locator('#import-url-button').click();
|
|
|
|
// Wait for the loader to disappear
|
|
await page.locator('#import-collection-loader').waitFor({ state: 'hidden' });
|
|
|
|
// Verify that the collection location modal appears with OpenAPI settings
|
|
const locationModal = page.getByTestId('import-collection-location-modal');
|
|
await expect(locationModal.getByText('Swagger Petstore')).toBeVisible();
|
|
|
|
// Verify OpenAPI settings are available in the location modal
|
|
await expect(locationModal.getByText('Folder arrangement')).toBeVisible();
|
|
await expect(locationModal.getByTestId('grouping-dropdown')).toBeVisible();
|
|
|
|
// Select a location and import with default grouping (tags)
|
|
await page.locator('#collection-location').fill(await createTmpDir('swagger-petstore'));
|
|
await locationModal.getByRole('button', { name: 'Import' }).click();
|
|
|
|
// Verify the collection was imported successfully and configure it
|
|
await expect(page.locator('#sidebar-collection-name').getByText('Swagger Petstore')).toBeVisible();
|
|
await openCollection(page, 'Swagger Petstore');
|
|
|
|
// Verify these folder names are present (tag-based grouping)
|
|
await expect(page.locator('.collection-item-name').getByText('pet')).toBeVisible();
|
|
await expect(page.locator('.collection-item-name').getByText('store')).toBeVisible();
|
|
await expect(page.locator('.collection-item-name').getByText('user')).toBeVisible();
|
|
});
|
|
|
|
test('Swagger/OpenAPI URL import with path-based grouping', async ({ page, createTmpDir }) => {
|
|
const openapiUrl = 'https://petstore.swagger.io/v2/swagger.json';
|
|
|
|
await page.getByTestId('collections-header-add-menu').click();
|
|
await page.locator('.tippy-box .dropdown-item').filter({ hasText: 'Import collection' }).click();
|
|
|
|
// Wait for import collection modal to be ready
|
|
const importModal = page.getByTestId('import-collection-modal');
|
|
await importModal.waitFor({ state: 'visible' });
|
|
|
|
await page.getByTestId('url-tab').click();
|
|
await page.getByTestId('url-input').waitFor({ state: 'visible' });
|
|
await page.getByTestId('url-input').fill(openapiUrl);
|
|
await page.locator('#import-url-button').click();
|
|
|
|
// Wait for the loader to disappear
|
|
await page.locator('#import-collection-loader').waitFor({ state: 'hidden' });
|
|
|
|
// Verify that the collection location modal appears with OpenAPI settings
|
|
const locationModal = page.getByTestId('import-collection-location-modal');
|
|
await expect(locationModal.getByText('Swagger Petstore')).toBeVisible();
|
|
|
|
// Verify OpenAPI settings are available in the location modal
|
|
await expect(locationModal.getByText('Folder arrangement')).toBeVisible();
|
|
|
|
// Select path-based grouping from the dropdown
|
|
await locationModal.getByTestId('grouping-dropdown').click();
|
|
|
|
// Wait for dropdown options to be visible and select path-based grouping
|
|
await page.getByTestId('grouping-option-path').waitFor({ state: 'visible' });
|
|
await page.getByTestId('grouping-option-path').click();
|
|
|
|
// Select a location and import with path-based grouping
|
|
await page.locator('#collection-location').fill(await createTmpDir('swagger-petstore-path'));
|
|
await locationModal.getByRole('button', { name: 'Import' }).click();
|
|
|
|
// Verify the collection was imported successfully and configure it
|
|
await expect(page.locator('#sidebar-collection-name').getByText('Swagger Petstore')).toBeVisible();
|
|
await openCollection(page, 'Swagger Petstore');
|
|
|
|
// Verify that the collection has been imported with path-based grouping
|
|
// Should have folders based on URL paths like 'pet', 'store', 'user'
|
|
await expect(page.locator('.collection-item-name').getByText('pet')).toBeVisible();
|
|
await expect(page.locator('.collection-item-name').getByText('store')).toBeVisible();
|
|
await expect(page.locator('.collection-item-name').getByText('user')).toBeVisible();
|
|
|
|
// Expand the pet folder to check for nested path structure
|
|
await page.locator('.collection-item-name').getByText('pet').click();
|
|
|
|
// Verify that the pet folder contains path-based subfolders like '{petId}'
|
|
await expect(page.locator('.collection-item-name').getByText('{petId}')).toBeVisible();
|
|
});
|
|
});
|