test(mcp-oauth): remove provider module mock leak

This commit is contained in:
YeonGyu-Kim
2026-04-04 19:33:17 +09:00
parent f8398dbec3
commit 032f23a4d9
2 changed files with 30 additions and 22 deletions
+14 -20
View File
@@ -1,30 +1,24 @@
import { afterAll, afterEach, beforeEach, describe, expect, it, mock, spyOn } from "bun:test"
import { afterEach, beforeEach, describe, expect, it, mock, spyOn } from "bun:test"
import { login } from "./login"
import type { LoginDependencies } from "./login"
const mockLogin = mock(() => Promise.resolve({ accessToken: "test-token", expiresAt: 1710000000 }))
mock.module("../../features/mcp-oauth/provider", () => ({
McpOAuthProvider: class MockMcpOAuthProvider {
constructor(public options: { serverUrl: string; clientId?: string; scopes?: string[] }) {}
async login() {
return mockLogin()
}
},
}))
afterAll(() => {
mock.restore()
})
const { login } = await import("./login")
describe("login command", () => {
let consoleErrorSpy: ReturnType<typeof spyOn>
let consoleLogSpy: ReturnType<typeof spyOn>
let deps: LoginDependencies
beforeEach(() => {
mock.restore()
mockLogin.mockClear()
consoleErrorSpy = spyOn(console, "error").mockImplementation(() => {})
consoleLogSpy = spyOn(console, "log").mockImplementation(() => {})
deps = {
createProvider: () => ({
login: () => mockLogin(),
}),
}
})
afterEach(() => {
@@ -38,7 +32,7 @@ describe("login command", () => {
const options = {}
// when
const exitCode = await login(serverName, options)
const exitCode = await login(serverName, options, deps)
// then
expect(exitCode).toBe(1)
@@ -52,7 +46,7 @@ describe("login command", () => {
}
// when
const exitCode = await login(serverName, options)
const exitCode = await login(serverName, options, deps)
// then
expect(exitCode).toBe(0)
@@ -68,7 +62,7 @@ describe("login command", () => {
mockLogin.mockRejectedValueOnce(new Error("Network error"))
// when
const exitCode = await login(serverName, options)
const exitCode = await login(serverName, options, deps)
// then
expect(exitCode).toBe(1)
@@ -82,7 +76,7 @@ describe("login command", () => {
}
// when
const exitCode = await login(serverName, options)
const exitCode = await login(serverName, options, deps)
// then
expect(exitCode).toBe(1)
+16 -2
View File
@@ -6,7 +6,21 @@ export interface LoginOptions {
scopes?: string[]
}
export async function login(serverName: string, options: LoginOptions): Promise<number> {
export type McpOAuthProviderLike = Pick<McpOAuthProvider, "login">
export interface LoginDependencies {
createProvider: (options: Required<Pick<LoginOptions, "serverUrl">> & Omit<LoginOptions, "serverUrl">) => McpOAuthProviderLike
}
const defaultLoginDependencies: LoginDependencies = {
createProvider: (options) => new McpOAuthProvider(options),
}
export async function login(
serverName: string,
options: LoginOptions,
deps: LoginDependencies = defaultLoginDependencies,
): Promise<number> {
try {
const serverUrl = options.serverUrl
if (!serverUrl) {
@@ -14,7 +28,7 @@ export async function login(serverName: string, options: LoginOptions): Promise<
return 1
}
const provider = new McpOAuthProvider({
const provider = deps.createProvider({
serverUrl,
clientId: options.clientId,
scopes: options.scopes,