first commit

This commit is contained in:
Beyhan Oğur
2026-04-26 21:52:23 +03:00
commit 880f412e2c
2662 changed files with 866266 additions and 0 deletions

View 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 }

View 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())
},
})