test(mcp-oauth): remove provider module mock leak
This commit is contained in:
@@ -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 }))
|
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", () => {
|
describe("login command", () => {
|
||||||
let consoleErrorSpy: ReturnType<typeof spyOn>
|
let consoleErrorSpy: ReturnType<typeof spyOn>
|
||||||
let consoleLogSpy: ReturnType<typeof spyOn>
|
let consoleLogSpy: ReturnType<typeof spyOn>
|
||||||
|
let deps: LoginDependencies
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
mock.restore()
|
||||||
mockLogin.mockClear()
|
mockLogin.mockClear()
|
||||||
consoleErrorSpy = spyOn(console, "error").mockImplementation(() => {})
|
consoleErrorSpy = spyOn(console, "error").mockImplementation(() => {})
|
||||||
consoleLogSpy = spyOn(console, "log").mockImplementation(() => {})
|
consoleLogSpy = spyOn(console, "log").mockImplementation(() => {})
|
||||||
|
deps = {
|
||||||
|
createProvider: () => ({
|
||||||
|
login: () => mockLogin(),
|
||||||
|
}),
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@@ -38,7 +32,7 @@ describe("login command", () => {
|
|||||||
const options = {}
|
const options = {}
|
||||||
|
|
||||||
// when
|
// when
|
||||||
const exitCode = await login(serverName, options)
|
const exitCode = await login(serverName, options, deps)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(exitCode).toBe(1)
|
expect(exitCode).toBe(1)
|
||||||
@@ -52,7 +46,7 @@ describe("login command", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// when
|
// when
|
||||||
const exitCode = await login(serverName, options)
|
const exitCode = await login(serverName, options, deps)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(exitCode).toBe(0)
|
expect(exitCode).toBe(0)
|
||||||
@@ -68,7 +62,7 @@ describe("login command", () => {
|
|||||||
mockLogin.mockRejectedValueOnce(new Error("Network error"))
|
mockLogin.mockRejectedValueOnce(new Error("Network error"))
|
||||||
|
|
||||||
// when
|
// when
|
||||||
const exitCode = await login(serverName, options)
|
const exitCode = await login(serverName, options, deps)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(exitCode).toBe(1)
|
expect(exitCode).toBe(1)
|
||||||
@@ -82,7 +76,7 @@ describe("login command", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// when
|
// when
|
||||||
const exitCode = await login(serverName, options)
|
const exitCode = await login(serverName, options, deps)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(exitCode).toBe(1)
|
expect(exitCode).toBe(1)
|
||||||
|
|||||||
@@ -6,7 +6,21 @@ export interface LoginOptions {
|
|||||||
scopes?: string[]
|
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 {
|
try {
|
||||||
const serverUrl = options.serverUrl
|
const serverUrl = options.serverUrl
|
||||||
if (!serverUrl) {
|
if (!serverUrl) {
|
||||||
@@ -14,7 +28,7 @@ export async function login(serverName: string, options: LoginOptions): Promise<
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
const provider = new McpOAuthProvider({
|
const provider = deps.createProvider({
|
||||||
serverUrl,
|
serverUrl,
|
||||||
clientId: options.clientId,
|
clientId: options.clientId,
|
||||||
scopes: options.scopes,
|
scopes: options.scopes,
|
||||||
|
|||||||
Reference in New Issue
Block a user