Files
orca/src/shared/constants.test.ts
T
weekbinandNeil e48d83a5e1 Fix MiniMax China usage routing and credential handling (#14929)
* feat(minimax): endpoint selector, API key auth, weekly usage window (#14264)

The MiniMax (MiniMax) Coding Plan usage fetch was hardcoded to the
overseas platform (platform.minimax.io) and a single 5h session
window, so users on the CN endpoint (www.minimaxi.com) got nothing.

Three changes:

- Add `minimaxEndpoint` (`overseas`|`cn`) and
  `minimaxApiKeyConfigured` settings fields with sensible defaults
  that preserve current behavior. The CN endpoint also accepts an
  API key (safeStorage-encrypted via a new
  `minimax-api-key-store.ts` + IPC pair) for users without a
  browser session cookie. Status-bar visibility now OR's both
  credential flags.
- Cookie-jar origin now tracks the active endpoint. Previously
  cookies were stored under the overseas origin and silently
  dropped when the user picked CN — fixed by threading
  `endpointMode` through the request context, the manual cookie
  header path, and the cookie-jar clear.
- Parse the weekly window in addition to the 5h session and
  surface both as per-window chips (`5h [bar] 10%   wk [bar] 20%`).
  The status bar's compact section prefers the session window; the
  popover keeps the existing `Session` / `Weekly` labels. The
  MiniMax fetcher is split into three files (data / parse / main)
  to stay under the 300-line cap.

i18n is scoped to the Settings-page text (en + zh only); the 5H/7D
duration shorthands stay English across locales by project convention.

Tests: 9 new/updated files; cookies + API key exercised end-to-end
via the rate-limit service with the upstream-refactored test files
(`service-minimax-usage.test.ts`,
`web-preload-api-settings.test.ts`,
`web-preload-api-agent-providers.test.ts`,
`service-test-harness.ts`, and the runtime-home / reset-credit
fixtures).

Refs #14264

* Keep merge formatting scoped to MiniMax

* Keep MiniMax credential status in rate-limit test fixtures

* Use the China console origin for MiniMax request referer

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-09-06 19:20:50 -07:00

190 lines
7.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
DEFAULT_TERMINAL_INACTIVE_PANE_OPACITY,
getDefaultNotificationSettings,
getDefaultPrimarySelectionMiddleClickPaste,
getDefaultTerminalRightClickToPaste,
getDefaultSettings
} from './constants'
describe('getDefaultSettings', () => {
it('uses platform-consistent separators for the default workspace directory', () => {
expect(getDefaultSettings('/Users/alice').workspaceDir).toBe('/Users/alice/orca/workspaces')
expect(getDefaultSettings('C:\\Users\\alice').workspaceDir).toBe(
'C:\\Users\\alice\\orca\\workspaces'
)
})
it('enables gitignored file decorations by default', () => {
expect(getDefaultSettings('/tmp').showGitIgnoredFiles).toBe(true)
})
it('uses list view for Source Control changes by default', () => {
expect(getDefaultSettings('/tmp').sourceControlViewMode).toBe('list')
})
it('keeps Source Control changes first by default', () => {
expect(getDefaultSettings('/tmp').sourceControlGroupOrder).toBe('changes-first')
})
it('defaults mobile pairing to discovered network addresses', () => {
expect(getDefaultSettings('/tmp').mobilePairingCustomAddress).toBeNull()
expect(getDefaultSettings('/tmp').mobilePairingCustomAddresses).toEqual([])
})
it('keeps first-work branch auto-renaming on by default for new settings', () => {
expect(getDefaultSettings('/tmp').autoRenameBranchFromWork).toBe(true)
expect(getDefaultSettings('/tmp').autoRenameBranchFromWorkDefaultedOn).toBe(true)
})
it('uses a block terminal cursor by default for new settings', () => {
expect(getDefaultSettings('/tmp').terminalCursorStyle).toBe('block')
expect(getDefaultSettings('/tmp').terminalCursorStyleDefaultedToBlock).toBe(true)
})
it('allows OSC 52 clipboard writes by default for new settings', () => {
expect(getDefaultSettings('/tmp').terminalAllowOsc52Clipboard).toBe(true)
expect(getDefaultSettings('/tmp').terminalAllowOsc52ClipboardDefaultedOnForAllUsers).toBe(true)
})
it('enables separate light terminal theme by default', () => {
expect(getDefaultSettings('/tmp').terminalUseSeparateLightTheme).toBe(true)
})
it('keeps inactive terminal panes readable by default', () => {
expect(getDefaultSettings('/tmp').terminalInactivePaneOpacity).toBe(
DEFAULT_TERMINAL_INACTIVE_PANE_OPACITY
)
})
it('asks before closing terminals with running processes by default', () => {
expect(getDefaultSettings('/tmp').skipCloseTerminalWithRunningProcessConfirm).toBe(false)
})
it('uses system language by default', () => {
expect(getDefaultSettings('/tmp').uiLanguage).toBe('system')
})
it('defaults the menu bar icon on so the value round-trips across platforms', () => {
expect(getDefaultSettings('/tmp').showMenuBarIcon).toBe(true)
})
it('shows terminal link actions by default', () => {
expect(getDefaultSettings('/tmp').terminalLinkActionPopoverEnabled).toBe(true)
})
it('confirms before closing pinned tabs by default', () => {
expect(getDefaultSettings('/tmp').confirmClosePinnedTab).toBe(true)
})
it('keeps file-editor word wrapping enabled by default', () => {
expect(getDefaultSettings('/tmp').editorWordWrap).toBe(true)
})
it('keeps rich Markdown spellcheck enabled by default', () => {
expect(getDefaultSettings('/tmp').richMarkdownSpellcheckEnabled).toBe(true)
})
it('enables Source Control AI by default without pinning a separate agent', () => {
expect(getDefaultSettings('/tmp').commitMessageAi).toMatchObject({
enabled: true,
agentId: null,
selectedModelByAgent: {}
})
expect(getDefaultSettings('/tmp').sourceControlAi).toMatchObject({
enabled: true,
agentId: null,
selectedModelByAgent: {},
instructionsByOperation: {
commitMessage: '',
pullRequest: '',
branchName: ''
}
})
})
it('keeps compact worktree cards disabled by default', () => {
expect(getDefaultSettings('/tmp').compactWorktreeCards).toBe(false)
})
it('keeps per-workspace environments disabled by default', () => {
expect(getDefaultSettings('/tmp').experimentalEphemeralVms).toBe(false)
})
it('keeps the agent dashboard popout disabled by default', () => {
expect(getDefaultSettings('/tmp').experimentalAgentDashboardPopout).toBeUndefined()
expect(getDefaultSettings('/tmp').experimentalAgentDashboardShowIdle).toBeUndefined()
})
it('routes fresh Codex profiles through the real-home rollout by default', () => {})
it('defaults local Windows projects to the host runtime', () => {
expect(getDefaultSettings('/tmp').localWindowsRuntimeDefault).toEqual({
kind: 'windows-host'
})
})
it('suppresses notifications for the focused worktree by default for new users', () => {
expect(getDefaultNotificationSettings().suppressWhenFocused).toBe(true)
expect(getDefaultSettings('/tmp').notifications.suppressWhenFocused).toBe(true)
})
it('defaults agent launch args to yolo mode where the CLI supports it', () => {
const settings = getDefaultSettings('/tmp')
expect(settings.agentDefaultArgs).toMatchObject({
claude: '--dangerously-skip-permissions',
codex: '--dangerously-bypass-approvals-and-sandbox',
gemini: '--yolo',
cursor: '--yolo',
copilot: '--yolo',
grok: '--permission-mode bypassPermissions'
})
expect(settings.agentDefaultArgs).not.toHaveProperty('opencode')
expect(settings.agentDefaultArgs).not.toHaveProperty('kilo')
expect(settings.agentDefaultEnv).toMatchObject({
goose: { GOOSE_MODE: 'auto' }
})
expect(settings.agentYoloDefaultsMigrated).toBe(true)
})
})
describe('getDefaultPrimarySelectionMiddleClickPaste', () => {
it('enables primary selection paste on Linux by default', () => {
expect(getDefaultPrimarySelectionMiddleClickPaste('linux')).toBe(true)
})
it('enables primary selection paste on macOS by default', () => {
expect(getDefaultPrimarySelectionMiddleClickPaste('darwin')).toBe(true)
})
it('leaves primary selection paste opt-in on Windows', () => {
expect(getDefaultPrimarySelectionMiddleClickPaste('win32')).toBe(false)
})
})
describe('getDefaultTerminalRightClickToPaste', () => {
it('defaults on only for Windows', () => {
expect(getDefaultTerminalRightClickToPaste('win32')).toBe(true)
expect(getDefaultTerminalRightClickToPaste('darwin')).toBe(false)
expect(getDefaultTerminalRightClickToPaste('linux')).toBe(false)
})
})
describe('MiniMax defaults', () => {
it('starts MiniMax with empty group id and the canonical default model', () => {
const settings = getDefaultSettings('/tmp')
// Why: the fetcher reads these defaults on first launch. An empty
// group id is the signal that the fetcher must pull the value from
// the cookie itself, and "general" matches the model name the
// MiniMax usage endpoint exposes by default.
expect(settings.minimaxGroupId).toBe('')
expect(settings.minimaxUsageModels).toBe('general')
})
it('defaults the MiniMax endpoint to overseas', () => {
const settings = getDefaultSettings('/tmp')
expect(settings.minimaxEndpoint).toBe('overseas')
})
})