Files
orca/src/main/github/pr-refresh-coordinator-test-mocks.ts
T
OrcaWinandOrcaWin 7b2996dc84 perf(github): look up refresh renderer owners by ID (#35015)
* Use targeted owner lookups for PR refresh visibility

* test(github): update document lifetime native lookup mock

* test(github): collapse PR refresh owner lookup matrix into one guard

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:08:17 -07:00

151 lines
4.6 KiB
TypeScript

import { vi, type Mock } from 'vitest'
import { isWslUncPath } from '../../shared/wsl-paths'
type PRRefreshWebContentsMock = {
id: number
isDestroyed: () => boolean
send?: Mock
}
export type PRRefreshCoordinatorMocks = {
sendMock: Mock
sendToTrustedUIRendererMock: Mock
getAllWebContentsMock: Mock<() => PRRefreshWebContentsMock[]>
webContentsFromIdMock: Mock<(id: number) => PRRefreshWebContentsMock | undefined>
getPRForBranchOutcomeMock: Mock
getOriginGitHubApiRepositoryMock: Mock
getRateLimitMock: Mock
noteRepositoryRateLimitSpendMock: Mock
repositoryRateLimitGuardMock: Mock
spendsSharedGitHubComQuotaMock: Mock
}
// Vitest hoists per file; suites register these shared factories locally.
export function createPRRefreshCoordinatorMocks(): PRRefreshCoordinatorMocks {
return {
sendMock: vi.fn(),
sendToTrustedUIRendererMock: vi.fn(),
getAllWebContentsMock: vi.fn(),
webContentsFromIdMock: vi.fn(),
getPRForBranchOutcomeMock: vi.fn(),
getOriginGitHubApiRepositoryMock: vi.fn(),
getRateLimitMock: vi.fn(),
noteRepositoryRateLimitSpendMock: vi.fn(),
repositoryRateLimitGuardMock: vi.fn(),
spendsSharedGitHubComQuotaMock: vi.fn()
}
}
export type ElectronModuleMock = {
webContents: {
getAllWebContents: PRRefreshCoordinatorMocks['getAllWebContentsMock']
fromId: PRRefreshCoordinatorMocks['webContentsFromIdMock']
}
}
export function electronModuleMock(mocks: PRRefreshCoordinatorMocks): ElectronModuleMock {
return {
webContents: {
getAllWebContents: mocks.getAllWebContentsMock,
fromId: mocks.webContentsFromIdMock
}
}
}
export type ClientModuleMock = { getPRForBranchOutcome: Mock }
export function clientModuleMock(mocks: PRRefreshCoordinatorMocks): ClientModuleMock {
return {
getPRForBranchOutcome: mocks.getPRForBranchOutcomeMock
}
}
export type GithubApiRepositoryModuleMock = { getOriginGitHubApiRepository: Mock }
export function githubApiRepositoryModuleMock(
mocks: PRRefreshCoordinatorMocks
): GithubApiRepositoryModuleMock {
return {
getOriginGitHubApiRepository: mocks.getOriginGitHubApiRepositoryMock
}
}
export type RateLimitModuleMock = {
getRateLimit: Mock
noteRepositoryRateLimitSpend: Mock
repositoryRateLimitGuard: Mock
spendsSharedGitHubComQuota: Mock
}
export function rateLimitModuleMock(mocks: PRRefreshCoordinatorMocks): RateLimitModuleMock {
return {
getRateLimit: mocks.getRateLimitMock,
noteRepositoryRateLimitSpend: mocks.noteRepositoryRateLimitSpendMock,
repositoryRateLimitGuard: mocks.repositoryRateLimitGuardMock,
spendsSharedGitHubComQuota: mocks.spendsSharedGitHubComQuotaMock
}
}
export type IpcUiModuleMock = { sendToTrustedUIRenderer: Mock }
export function ipcUiModuleMock(mocks: PRRefreshCoordinatorMocks): IpcUiModuleMock {
return {
sendToTrustedUIRenderer: mocks.sendToTrustedUIRendererMock
}
}
// Module queues and timers must not leak pending work between tests.
export function resetPRRefreshCoordinatorMocks(mocks: PRRefreshCoordinatorMocks): void {
const {
sendMock,
sendToTrustedUIRendererMock,
getAllWebContentsMock,
webContentsFromIdMock,
getPRForBranchOutcomeMock,
getOriginGitHubApiRepositoryMock,
getRateLimitMock,
noteRepositoryRateLimitSpendMock,
repositoryRateLimitGuardMock,
spendsSharedGitHubComQuotaMock
} = mocks
vi.resetModules()
vi.useFakeTimers()
vi.setSystemTime(1_000)
sendMock.mockReset()
sendToTrustedUIRendererMock.mockReset()
sendToTrustedUIRendererMock.mockImplementation((channel, payload) => {
sendMock(channel, payload)
})
getAllWebContentsMock.mockReset()
webContentsFromIdMock.mockReset()
webContentsFromIdMock.mockImplementation((id) =>
getAllWebContentsMock().find((contents) => contents.id === id)
)
getPRForBranchOutcomeMock.mockReset()
getOriginGitHubApiRepositoryMock.mockReset()
getOriginGitHubApiRepositoryMock.mockResolvedValue({
owner: 'acme',
repo: 'widgets',
host: 'github.com'
})
getRateLimitMock.mockReset()
noteRepositoryRateLimitSpendMock.mockReset()
repositoryRateLimitGuardMock.mockReset()
repositoryRateLimitGuardMock.mockReturnValue({ blocked: false })
spendsSharedGitHubComQuotaMock.mockReset()
spendsSharedGitHubComQuotaMock.mockImplementation(
(repository: { host?: string } | null, options?: { cwd?: string; wslDistro?: string }) =>
(!repository?.host || repository.host.toLowerCase() === 'github.com') &&
!options?.wslDistro &&
!(options?.cwd && isWslUncPath(options.cwd))
)
getAllWebContentsMock.mockReturnValue([
{
id: 1,
isDestroyed: () => false,
send: sendMock
}
])
getRateLimitMock.mockResolvedValue({ ok: true })
}