first commit
This commit is contained in:
123
tests/e2e/core/fixtures/base.fixture.ts
Normal file
123
tests/e2e/core/fixtures/base.fixture.ts
Normal file
@@ -0,0 +1,123 @@
|
||||
import { test as base, expect } from '@playwright/test'
|
||||
import { SidebarPage } from '../pages/sidebar.page'
|
||||
import { ProvidersPage } from '../../features/providers/pages/providers.page'
|
||||
import { VirtualKeysPage } from '../../features/virtual-keys/pages/virtual-keys.page'
|
||||
import { DashboardPage } from '../../features/dashboard/pages/dashboard.page'
|
||||
import { LogsPage } from '../../features/logs/pages/logs.page'
|
||||
import { MCPLogsPage } from '../../features/mcp-logs/pages/mcp-logs.page'
|
||||
import { RoutingRulesPage } from '../../features/routing-rules/pages/routing-rules.page'
|
||||
import { MCPRegistryPage } from '../../features/mcp-registry/pages/mcp-registry.page'
|
||||
import { PluginsPage } from '../../features/plugins/pages/plugins.page'
|
||||
import { ObservabilityPage } from '../../features/observability/pages/observability.page'
|
||||
import { ConfigSettingsPage } from '../../features/config/pages/config-settings.page'
|
||||
import { GovernancePage } from '../../features/governance/pages/governance.page'
|
||||
import { MCPAuthConfigPage } from '../../features/mcp-auth-config/pages/mcp-auth-config.page'
|
||||
import { MCPSettingsPage } from '../../features/mcp-settings/pages/mcp-settings.page'
|
||||
import { MCPToolGroupsPage } from '../../features/mcp-tool-groups/pages/mcp-tool-groups.page'
|
||||
import { ModelLimitsPage } from '../../features/model-limits/pages/model-limits.page'
|
||||
|
||||
/**
|
||||
* Custom test fixtures type
|
||||
*/
|
||||
type BifrostFixtures = {
|
||||
closeDevProfiler: void
|
||||
sidebarPage: SidebarPage
|
||||
providersPage: ProvidersPage
|
||||
virtualKeysPage: VirtualKeysPage
|
||||
dashboardPage: DashboardPage
|
||||
logsPage: LogsPage
|
||||
mcpLogsPage: MCPLogsPage
|
||||
routingRulesPage: RoutingRulesPage
|
||||
mcpRegistryPage: MCPRegistryPage
|
||||
pluginsPage: PluginsPage
|
||||
observabilityPage: ObservabilityPage
|
||||
configSettingsPage: ConfigSettingsPage
|
||||
governancePage: GovernancePage
|
||||
modelLimitsPage: ModelLimitsPage
|
||||
mcpSettingsPage: MCPSettingsPage
|
||||
mcpToolGroupsPage: MCPToolGroupsPage
|
||||
mcpAuthConfigPage: MCPAuthConfigPage
|
||||
}
|
||||
|
||||
/**
|
||||
* Extended test with Bifrost-specific fixtures
|
||||
*/
|
||||
export const test = base.extend<BifrostFixtures>({
|
||||
closeDevProfiler: [async ({ page }, use) => {
|
||||
// Automatically dismiss the Dev Profiler overlay whenever it appears.
|
||||
// Uses addLocatorHandler so it triggers before any test action if the profiler is visible.
|
||||
await page.addLocatorHandler(
|
||||
page.getByText('Dev Profiler', { exact: true }),
|
||||
async () => {
|
||||
await page.locator('button[title="Dismiss"]').click({ force: true })
|
||||
}
|
||||
)
|
||||
await use()
|
||||
}, { auto: true }],
|
||||
|
||||
sidebarPage: async ({ page }, use) => {
|
||||
await use(new SidebarPage(page))
|
||||
},
|
||||
|
||||
providersPage: async ({ page }, use) => {
|
||||
await use(new ProvidersPage(page))
|
||||
},
|
||||
|
||||
virtualKeysPage: async ({ page }, use) => {
|
||||
await use(new VirtualKeysPage(page))
|
||||
},
|
||||
|
||||
dashboardPage: async ({ page }, use) => {
|
||||
await use(new DashboardPage(page))
|
||||
},
|
||||
|
||||
logsPage: async ({ page }, use) => {
|
||||
await use(new LogsPage(page))
|
||||
},
|
||||
|
||||
mcpLogsPage: async ({ page }, use) => {
|
||||
await use(new MCPLogsPage(page))
|
||||
},
|
||||
|
||||
routingRulesPage: async ({ page }, use) => {
|
||||
await use(new RoutingRulesPage(page))
|
||||
},
|
||||
|
||||
mcpRegistryPage: async ({ page }, use) => {
|
||||
await use(new MCPRegistryPage(page))
|
||||
},
|
||||
|
||||
pluginsPage: async ({ page }, use) => {
|
||||
await use(new PluginsPage(page))
|
||||
},
|
||||
|
||||
observabilityPage: async ({ page }, use) => {
|
||||
await use(new ObservabilityPage(page))
|
||||
},
|
||||
|
||||
configSettingsPage: async ({ page }, use) => {
|
||||
await use(new ConfigSettingsPage(page))
|
||||
},
|
||||
|
||||
governancePage: async ({ page }, use) => {
|
||||
await use(new GovernancePage(page))
|
||||
},
|
||||
|
||||
modelLimitsPage: async ({ page }, use) => {
|
||||
await use(new ModelLimitsPage(page))
|
||||
},
|
||||
|
||||
mcpSettingsPage: async ({ page }, use) => {
|
||||
await use(new MCPSettingsPage(page))
|
||||
},
|
||||
|
||||
mcpToolGroupsPage: async ({ page }, use) => {
|
||||
await use(new MCPToolGroupsPage(page))
|
||||
},
|
||||
|
||||
mcpAuthConfigPage: async ({ page }, use) => {
|
||||
await use(new MCPAuthConfigPage(page))
|
||||
},
|
||||
})
|
||||
|
||||
export { expect }
|
||||
172
tests/e2e/core/fixtures/test-data.fixture.ts
Normal file
172
tests/e2e/core/fixtures/test-data.fixture.ts
Normal file
@@ -0,0 +1,172 @@
|
||||
import { test as base } from '@playwright/test'
|
||||
import { randomUUID } from 'crypto'
|
||||
|
||||
/**
|
||||
* Test data types
|
||||
*/
|
||||
export interface ProviderKeyConfig {
|
||||
name: string
|
||||
value: string
|
||||
models?: string[]
|
||||
weight?: number
|
||||
}
|
||||
|
||||
export interface CustomProviderConfig {
|
||||
name: string
|
||||
baseProviderType: 'openai' | 'anthropic' | 'gemini' | 'cohere' | 'bedrock' | string
|
||||
baseUrl?: string
|
||||
authType?: 'api_key' | 'bearer' | 'basic' | 'none'
|
||||
isKeyless?: boolean
|
||||
}
|
||||
|
||||
export interface VirtualKeyConfig {
|
||||
name: string
|
||||
description?: string
|
||||
isActive?: boolean
|
||||
providerConfigs?: ProviderConfigItem[]
|
||||
budget?: BudgetConfig
|
||||
rateLimit?: RateLimitConfig
|
||||
teamId?: string
|
||||
customerId?: string
|
||||
}
|
||||
|
||||
export interface ProviderConfigItem {
|
||||
provider: string
|
||||
weight?: number
|
||||
allowedModels?: string[]
|
||||
keyIds?: string[]
|
||||
budget?: BudgetConfig
|
||||
rateLimit?: RateLimitConfig
|
||||
}
|
||||
|
||||
export interface BudgetConfig {
|
||||
maxLimit: number
|
||||
resetDuration: string
|
||||
}
|
||||
|
||||
export interface RateLimitConfig {
|
||||
tokenMaxLimit?: number
|
||||
tokenResetDuration?: string
|
||||
requestMaxLimit?: number
|
||||
requestResetDuration?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Test data fixture type
|
||||
*/
|
||||
type TestDataFixtures = {
|
||||
testData: TestDataFactory
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory for creating test data with unique identifiers
|
||||
*/
|
||||
export class TestDataFactory {
|
||||
private counter = 0
|
||||
private runId = randomUUID()
|
||||
|
||||
/**
|
||||
* Generate a unique ID for test data
|
||||
*/
|
||||
uniqueId(prefix = 'test'): string {
|
||||
this.counter++
|
||||
return `${prefix}-${this.runId}-${this.counter}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Create provider key test data
|
||||
*/
|
||||
createProviderKey(overrides: Partial<ProviderKeyConfig> = {}): ProviderKeyConfig {
|
||||
return {
|
||||
name: this.uniqueId('key'),
|
||||
value: `sk-test-${this.uniqueId()}`,
|
||||
models: ['*'],
|
||||
weight: 1.0,
|
||||
...overrides,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create custom provider test data
|
||||
*/
|
||||
createCustomProvider(overrides: Partial<CustomProviderConfig> = {}): CustomProviderConfig {
|
||||
return {
|
||||
name: this.uniqueId('provider'),
|
||||
baseProviderType: 'openai',
|
||||
baseUrl: 'https://api.example.com',
|
||||
authType: 'api_key',
|
||||
...overrides,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create virtual key test data
|
||||
*/
|
||||
createVirtualKey(overrides: Partial<VirtualKeyConfig> = {}): VirtualKeyConfig {
|
||||
return {
|
||||
name: this.uniqueId('vk'),
|
||||
description: 'Test virtual key',
|
||||
isActive: true,
|
||||
providerConfigs: [],
|
||||
...overrides,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create virtual key with budget
|
||||
*/
|
||||
createVirtualKeyWithBudget(
|
||||
budgetOverrides: Partial<BudgetConfig> = {},
|
||||
vkOverrides: Partial<VirtualKeyConfig> = {}
|
||||
): VirtualKeyConfig {
|
||||
return this.createVirtualKey({
|
||||
budget: {
|
||||
maxLimit: 100,
|
||||
resetDuration: '1M',
|
||||
...budgetOverrides,
|
||||
},
|
||||
...vkOverrides,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Create virtual key with rate limits
|
||||
*/
|
||||
createVirtualKeyWithRateLimit(
|
||||
rateLimitOverrides: Partial<RateLimitConfig> = {},
|
||||
vkOverrides: Partial<VirtualKeyConfig> = {}
|
||||
): VirtualKeyConfig {
|
||||
return this.createVirtualKey({
|
||||
rateLimit: {
|
||||
tokenMaxLimit: 10000,
|
||||
tokenResetDuration: '1h',
|
||||
requestMaxLimit: 1000,
|
||||
requestResetDuration: '1h',
|
||||
...rateLimitOverrides,
|
||||
},
|
||||
...vkOverrides,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Create provider config item for virtual key
|
||||
*/
|
||||
createProviderConfigItem(overrides: Partial<ProviderConfigItem> = {}): ProviderConfigItem {
|
||||
return {
|
||||
provider: 'openai',
|
||||
weight: 1.0,
|
||||
allowedModels: ['*'],
|
||||
keyIds: ['*'],
|
||||
...overrides,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extended test with test data fixture
|
||||
*/
|
||||
export const testWithData = base.extend<TestDataFixtures>({
|
||||
testData: async (_, use) => {
|
||||
await use(new TestDataFactory())
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user