test: restore global mock isolation (#1980)

This commit is contained in:
JATMN
2026-07-17 00:07:56 +08:00
committed by GitHub
parent 2516eef039
commit 47123b4b38
5 changed files with 26 additions and 94 deletions
+5
View File
@@ -13,10 +13,14 @@ import {
} from '../test/sharedMutationLock.js'
type SettingsModule = typeof import('../utils/settings/settings.js')
type ProviderStartupOverridesModule = typeof import('../utils/providerStartupOverrides.js')
const actualSettingsModule = (await import(
`../utils/settings/settings.ts?providerManagerSettingsActual=${Date.now()}-${Math.random()}`
)) as SettingsModule
const actualProviderStartupOverridesModule = (await import(
`../utils/providerStartupOverrides.ts?providerManagerStartupOverridesActual=${Date.now()}-${Math.random()}`
)) as ProviderStartupOverridesModule
const SYNC_START = '\x1B[?2026h'
const SYNC_END = '\x1B[?2026l'
@@ -574,6 +578,7 @@ afterEach(() => {
try {
mock.restore()
mock.module('../utils/settings/settings.js', () => actualSettingsModule)
mock.module('../utils/providerStartupOverrides.js', () => actualProviderStartupOverridesModule)
for (const [key, value] of Object.entries(ORIGINAL_ENV)) {
if (value === undefined) {
+4
View File
@@ -1,4 +1,6 @@
import { afterAll, describe, expect, mock, test } from 'bun:test'
import * as actualConfig from '../../utils/config.js'
import * as actualSettings from '../../utils/settings/settings.js'
import {
acquireSharedMutationLock,
releaseSharedMutationLock,
@@ -34,6 +36,8 @@ mock.module('../../utils/config.js', () => ({
afterAll(() => {
try {
mock.restore()
mock.module('../../utils/settings/settings.js', () => actualSettings)
mock.module('../../utils/config.js', () => actualConfig)
} finally {
releaseSharedMutationLock()
}
+8
View File
@@ -3,7 +3,11 @@ import {
acquireSharedMutationLock,
releaseSharedMutationLock,
} from '../../test/sharedMutationLock.js'
import * as actualAnalytics from '../analytics/index.js'
import * as actualConfig from '../../utils/config.js'
import * as actualSettings from '../../utils/settings/settings.js'
import type { Tip } from './types.js'
import * as actualTipRegistry from './tipRegistry.js'
const settingsRef: {
value: {
@@ -49,6 +53,10 @@ mock.module('../analytics/index.js', () => ({
afterAll(() => {
try {
mock.restore()
mock.module('../../utils/settings/settings.js', () => actualSettings)
mock.module('../../utils/config.js', () => actualConfig)
mock.module('./tipRegistry.js', () => actualTipRegistry)
mock.module('../analytics/index.js', () => actualAnalytics)
} finally {
releaseSharedMutationLock()
}
+2 -92
View File
@@ -17,78 +17,6 @@ import type { SettingsJson } from './settings/types.js'
const actualSettings = { ...realSettings }
function restoredGovernancePolicyModule() {
const getForbiddenCommitMessagePatterns = (): string[] => {
const patterns: string[] = []
const sourceNames = [
'userSettings',
'projectSettings',
'localSettings',
'policySettings',
'flagSettings',
]
for (const source of sourceNames) {
const sourcePatterns =
actualSettings.getSettingsForSource(source as never)?.git
?.forbiddenCommitMessagePatterns ?? []
for (const pattern of sourcePatterns) {
if (!patterns.includes(pattern)) {
patterns.push(pattern)
}
}
}
return patterns
}
const findForbiddenCommitMessagePattern = (message: string): string | null => {
const normalizedMessage = message.toLocaleLowerCase()
for (const pattern of getForbiddenCommitMessagePatterns()) {
if (pattern && normalizedMessage.includes(pattern.toLocaleLowerCase())) {
return pattern
}
}
return null
}
const sourceHasGitFlag = (
key: 'addAICoAuthor' | 'addGeneratedWithFooter',
value: boolean,
): boolean =>
[
'userSettings',
'projectSettings',
'localSettings',
'policySettings',
'flagSettings',
].some(
source =>
actualSettings.getSettingsForSource(source as never)?.git?.[key] ===
value,
)
return {
getGitAttributionOptIns: () => {
const git = actualSettings.getInitialSettings().git
return {
addAICoAuthor: git?.addAICoAuthor === true,
addGeneratedWithFooter: git?.addGeneratedWithFooter === true,
}
},
isGeneratedCommitAttributionBlocked: () =>
sourceHasGitFlag('addAICoAuthor', false),
isGeneratedPrAttributionBlocked: () =>
sourceHasGitFlag('addGeneratedWithFooter', false),
isGitAttributionBlocked: () =>
sourceHasGitFlag('addAICoAuthor', false) ||
sourceHasGitFlag('addGeneratedWithFooter', false),
getForbiddenCommitMessagePatterns,
findForbiddenCommitMessagePattern,
isMemoryWriteApprovalRequired: () =>
actualSettings.getInitialSettings().memory?.requireApprovalBeforeWrite !==
false,
}
}
let getAttributionTexts: (typeof import('./attribution.js'))['getAttributionTexts']
let getDefaultCommitCoAuthorEmail: (typeof import('./attribution.js'))[
'getDefaultCommitCoAuthorEmail'
@@ -218,25 +146,6 @@ beforeEach(async () => {
getSettings_DEPRECATED: () => testSettings,
getSettingsForSource: () => testSettings,
}))
mock.module('./governancePolicy.js', () => ({
getGitAttributionOptIns: () => ({
addAICoAuthor: testSettings.git?.addAICoAuthor === true,
addGeneratedWithFooter:
testSettings.git?.addGeneratedWithFooter === true,
}),
isGeneratedCommitAttributionBlocked: () =>
testSettings.git?.addAICoAuthor === false,
isGeneratedPrAttributionBlocked: () =>
testSettings.git?.addGeneratedWithFooter === false,
isGitAttributionBlocked: () =>
testSettings.git?.addAICoAuthor === false ||
testSettings.git?.addGeneratedWithFooter === false,
getForbiddenCommitMessagePatterns: () =>
testSettings.git?.forbiddenCommitMessagePatterns ?? [],
findForbiddenCommitMessagePattern: () => null,
isMemoryWriteApprovalRequired: () =>
testSettings.memory?.requireApprovalBeforeWrite !== false,
}))
const attribution = await import(
`./attribution.ts?attributionTest=${Date.now()}-${Math.random()}`
)
@@ -253,8 +162,9 @@ afterEach(() => {
testSettings = {}
setClientType(originalClientType)
setMainLoopModelOverride(originalMainLoopModelOverride)
mock.module('./model/model.js', () => actualModel)
mock.module('./model/providers.js', () => actualProviders)
mock.module('./settings/settings.js', () => actualSettings)
mock.module('./governancePolicy.js', restoredGovernancePolicyModule)
restoreEnv()
})
+7 -2
View File
@@ -1,9 +1,14 @@
import { describe, expect, mock, test } from 'bun:test'
import { clearStartupProviderOverrides } from './providerStartupOverrides.js'
async function importStartupOverridesForTest() {
return import(
`./providerStartupOverrides.ts?startupOverridesTest=${Date.now()}-${Math.random()}`
)
}
describe('clearStartupProviderOverrides', () => {
test('removes stale provider env from user settings and global config env', () => {
test('removes stale provider env from user settings and global config env', async () => {
const { clearStartupProviderOverrides } = await importStartupOverridesForTest()
const updateUserSettings = mock(() => ({ error: null }))
const saveConfig = mock((updater: (current: {
env: Record<string, string>