163 lines
4.5 KiB
TypeScript
163 lines
4.5 KiB
TypeScript
import { afterEach, describe, expect, mock, test } from 'bun:test'
|
|
|
|
const originalEnv = { ...process.env }
|
|
|
|
async function importFreshFastModeModule() {
|
|
return import(`./fastMode.ts?ts=${Date.now()}-${Math.random()}`)
|
|
}
|
|
|
|
function installCommonMocks(options?: {
|
|
cachedEnabled?: boolean
|
|
apiKey?: string | null
|
|
oauthToken?: string | null
|
|
hasProfileScope?: boolean
|
|
axiosReject?: boolean
|
|
}) {
|
|
mock.module('axios', () => ({
|
|
default: {
|
|
get: options?.axiosReject
|
|
? async () => {
|
|
throw new Error('network fail')
|
|
}
|
|
: async () => ({ data: { enabled: false, disabled_reason: 'preference' } }),
|
|
isAxiosError: () => false,
|
|
},
|
|
}))
|
|
|
|
mock.module('src/constants/oauth.js', () => ({
|
|
getOauthConfig: () => ({ BASE_API_URL: 'https://api.anthropic.com' }),
|
|
OAUTH_BETA_HEADER: 'test-beta',
|
|
}))
|
|
|
|
mock.module('src/services/analytics/growthbook.js', () => ({
|
|
getFeatureValue_CACHED_MAY_BE_STALE: (_name: string, defaultValue: unknown) =>
|
|
defaultValue,
|
|
}))
|
|
|
|
mock.module('../bootstrap/state.js', () => ({
|
|
getIsNonInteractiveSession: () => false,
|
|
getKairosActive: () => false,
|
|
preferThirdPartyAuthentication: () => false,
|
|
}))
|
|
|
|
mock.module('../services/analytics/index.js', () => ({
|
|
logEvent: () => {},
|
|
}))
|
|
|
|
mock.module('./auth.js', () => ({
|
|
getAnthropicApiKey: () => options?.apiKey ?? null,
|
|
getClaudeAIOAuthTokens: () =>
|
|
options?.oauthToken ? { accessToken: options.oauthToken } : null,
|
|
handleOAuth401Error: async () => {},
|
|
hasProfileScope: () => options?.hasProfileScope ?? false,
|
|
}))
|
|
|
|
mock.module('./bundledMode.js', () => ({
|
|
isInBundledMode: () => true,
|
|
}))
|
|
|
|
mock.module('./config.js', () => ({
|
|
getGlobalConfig: () => ({
|
|
penguinModeOrgEnabled: options?.cachedEnabled === true,
|
|
}),
|
|
saveGlobalConfig: (updater: (current: Record<string, unknown>) => Record<string, unknown>) =>
|
|
updater({ penguinModeOrgEnabled: options?.cachedEnabled === true }),
|
|
}))
|
|
|
|
mock.module('./debug.js', () => ({
|
|
logForDebugging: () => {},
|
|
}))
|
|
|
|
mock.module('./envUtils.js', () => ({
|
|
isEnvTruthy: (value: string | undefined) =>
|
|
!!value && value !== '0' && value.toLowerCase() !== 'false',
|
|
}))
|
|
|
|
mock.module('./model/model.js', () => ({
|
|
getDefaultMainLoopModelSetting: () => 'claude-sonnet-4-6',
|
|
isOpus1mMergeEnabled: () => false,
|
|
parseUserSpecifiedModel: (model: string) => model,
|
|
}))
|
|
|
|
mock.module('./model/providers.js', () => ({
|
|
getAPIProvider: () => 'firstParty',
|
|
}))
|
|
|
|
mock.module('./privacyLevel.js', () => ({
|
|
isEssentialTrafficOnly: () => false,
|
|
}))
|
|
|
|
mock.module('./settings/settings.js', () => ({
|
|
getInitialSettings: () => ({ fastMode: true }),
|
|
getSettingsForSource: () => ({}),
|
|
updateSettingsForSource: () => {},
|
|
}))
|
|
|
|
mock.module('./signal.js', () => ({
|
|
createSignal: () => {
|
|
const subscribe = () => () => {}
|
|
const emit = () => {}
|
|
return { subscribe, emit }
|
|
},
|
|
}))
|
|
}
|
|
|
|
afterEach(() => {
|
|
mock.restore()
|
|
process.env = { ...originalEnv }
|
|
})
|
|
|
|
describe('fastMode ant-only fallback cleanup', () => {
|
|
test('resolveFastModeStatusFromCache does not force-enable from USER_TYPE=ant', async () => {
|
|
process.env.USER_TYPE = 'ant'
|
|
installCommonMocks({ cachedEnabled: false })
|
|
|
|
const {
|
|
resolveFastModeStatusFromCache,
|
|
getFastModeUnavailableReason,
|
|
} = await importFreshFastModeModule()
|
|
|
|
resolveFastModeStatusFromCache()
|
|
|
|
expect(getFastModeUnavailableReason()).toBe(
|
|
'Fast mode is currently unavailable',
|
|
)
|
|
})
|
|
|
|
test('prefetchFastModeStatus without auth does not force-enable from USER_TYPE=ant', async () => {
|
|
process.env.USER_TYPE = 'ant'
|
|
installCommonMocks({ cachedEnabled: false, apiKey: null, oauthToken: null })
|
|
|
|
const {
|
|
prefetchFastModeStatus,
|
|
getFastModeUnavailableReason,
|
|
} = await importFreshFastModeModule()
|
|
|
|
await prefetchFastModeStatus()
|
|
|
|
expect(getFastModeUnavailableReason()).toBe(
|
|
'Fast mode has been disabled by your organization',
|
|
)
|
|
})
|
|
|
|
test('prefetchFastModeStatus network failure does not force-enable from USER_TYPE=ant', async () => {
|
|
process.env.USER_TYPE = 'ant'
|
|
installCommonMocks({
|
|
cachedEnabled: false,
|
|
apiKey: 'test-key',
|
|
axiosReject: true,
|
|
})
|
|
|
|
const {
|
|
prefetchFastModeStatus,
|
|
getFastModeUnavailableReason,
|
|
} = await importFreshFastModeModule()
|
|
|
|
await prefetchFastModeStatus()
|
|
|
|
expect(getFastModeUnavailableReason()).toBe(
|
|
'Fast mode unavailable due to network connectivity issues',
|
|
)
|
|
})
|
|
})
|