import { afterAll, beforeAll, describe, expect, it } from "vitest"
import { API_KEY, callTool, connect, textOf, type Session } from "./helpers"

const EXPECTED_TOOLS = [
	"memory",
	"recall",
	"listProjects",
	"whoAmI",
	"memory-graph",
]

describe.skipIf(!API_KEY)("MCP — discovery & identity", () => {
	let s: Session

	beforeAll(async () => {
		s = await connect()
	})
	afterAll(async () => {
		await s?.close()
	})

	it("handshakes and lists the expected tools", async () => {
		const { tools } = await s.client.listTools()
		const names = tools.map((t) => t.name)
		for (const t of EXPECTED_TOOLS) expect(names).toContain(t)
	})

	it("lists profile & projects resources", async () => {
		const { resources } = await s.client.listResources()
		const uris = resources.map((r) => r.uri)
		expect(uris).toContain("supermemory://profile")
		expect(uris).toContain("supermemory://projects")
	})

	it("lists the context prompt", async () => {
		const { prompts } = await s.client.listPrompts()
		expect(prompts.map((p) => p.name)).toContain("context")
	})

	it("whoAmI resolves to the authenticated account", async () => {
		const res = await callTool(s.client, "whoAmI")
		expect(res.isError).toBeFalsy()
		const parsed = JSON.parse(textOf(res))
		expect(parsed.userId).toBeTruthy()
	})

	it("listProjects returns content", async () => {
		const res = await callTool(s.client, "listProjects", { refresh: true })
		expect(res.isError).toBeFalsy()
		expect(textOf(res).length).toBeGreaterThan(0)
	})
})
