mirror of
https://github.com/stablyai/orca.git
synced 2026-11-03 18:47:40 +00:00
* 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>
151 lines
4.6 KiB
TypeScript
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 })
|
|
}
|