Skip to main content
Glama
client.test.ts8.44 kB
import { assertEquals, assertExists, assertRejects, assertStringIncludes, } from "jsr:@std/assert"; import { createJSRConfig, getPackage, getPackageDependencies, getPackageDependents, getPackageMetadata, getPackageScore, getPackageVersion, getPublishingTask, getScope, getStats, getUser, getUserScopes, listPackages, listPackageVersions, listScopeMembers, listScopePackages, searchPackages, testConnection, } from "../mod.ts"; const TEST_CONFIG = createJSRConfig( "https://api.jsr.io", "https://jsr.io", ); Deno.test("createJSRConfig removes trailing slashes", () => { const config = createJSRConfig( "https://api.jsr.io/", "https://jsr.io/", "test-token", ); assertEquals(config.apiUrl, "https://api.jsr.io"); assertEquals(config.registryUrl, "https://jsr.io"); assertEquals(config.apiToken, "test-token"); }); Deno.test("testConnection returns success for valid config", async () => { const result = await testConnection(TEST_CONFIG); assertEquals(result.success, true); assertEquals(result.error, undefined); }); Deno.test("testConnection returns error for invalid config", async () => { const invalidConfig = createJSRConfig( "https://invalid-api-url.example.com", "https://invalid-registry-url.example.com", ); const result = await testConnection(invalidConfig); assertEquals(result.success, false); assertExists(result.error); }); Deno.test("searchPackages returns results", async () => { const results = await searchPackages(TEST_CONFIG, "std", 5, 1); assertExists(results); assertExists(results.items); assertExists(results.total); assertEquals(Array.isArray(results.items), true); }); Deno.test("searchPackages with empty query", async () => { const results = await searchPackages(TEST_CONFIG, undefined, 5, 1); assertExists(results); assertExists(results.items); assertEquals(Array.isArray(results.items), true); }); Deno.test("getPackage returns package details", async () => { const pkg = await getPackage(TEST_CONFIG, "std", "assert"); assertExists(pkg); assertEquals(pkg.scope, "std"); assertEquals(pkg.name, "assert"); assertExists(pkg.description); assertExists(pkg.runtimeCompat); }); Deno.test("getPackage throws for non-existent package", async () => { await assertRejects( async () => await getPackage(TEST_CONFIG, "nonexistent", "package"), Error, "JSR API request failed", ); }); Deno.test("getPackageVersion returns version details", async () => { // Get a known version directly const version = await getPackageVersion( TEST_CONFIG, "std", "assert", "1.0.0", ); assertExists(version); assertEquals(version.version, "1.0.0"); assertExists(version.createdAt); assertExists(version.updatedAt); }); Deno.test("listPackageVersions returns paginated results", async () => { const results = await listPackageVersions(TEST_CONFIG, "std", "assert", 5, 1); assertExists(results); assertExists(results.data); assertExists(results.total); assertExists(results.returned); assertEquals(Array.isArray(results.data), true); assertEquals(results.returned, results.data.length); }); Deno.test("getScope returns scope details", async () => { const scope = await getScope(TEST_CONFIG, "std"); assertExists(scope); assertEquals(scope.scope, "std"); assertExists(scope.createdAt); assertExists(scope.updatedAt); }); Deno.test("listScopePackages returns packages in scope", async () => { const results = await listScopePackages(TEST_CONFIG, "std", 5, 0); assertExists(results); assertExists(results.data); assertEquals(Array.isArray(results.data), true); assertExists(results.total); assertEquals(results.skip, 0); }); Deno.test("getPackageMetadata returns metadata from registry", async () => { const metadata = await getPackageMetadata(TEST_CONFIG, "std", "assert"); assertExists(metadata); assertEquals(metadata.scope, "std"); assertEquals(metadata.name, "assert"); assertExists(metadata.latest); assertExists(metadata.versions); }); Deno.test("listPackages returns all packages", async () => { const results = await listPackages(TEST_CONFIG, 10, 1); assertExists(results); assertExists(results.items); assertEquals(Array.isArray(results.items), true); assertExists(results.total); }); Deno.test("getPackageDependents returns dependent packages", async () => { const results = await getPackageDependents( TEST_CONFIG, "std", "assert", 5, 1, 2, ); assertExists(results); assertExists(results.data); assertEquals(Array.isArray(results.data), true); assertExists(results.total); }); Deno.test("getPackageScore returns package score", async () => { const score = await getPackageScore(TEST_CONFIG, "std", "assert"); assertExists(score); assertExists(score.total); assertExists(score.percentageDocumentedSymbols); assertExists(score.hasReadme); assertExists(score.hasReadmeExamples); assertExists(score.hasDescription); assertExists(score.hasProvenance); assertExists(score.allEntrypointsDocs); assertExists(score.allFastCheck); assertExists(score.atLeastOneRuntimeCompatible); assertExists(score.multipleRuntimesCompatible); }); Deno.test("getPackageDependencies returns dependencies", async () => { const versions = await listPackageVersions(TEST_CONFIG, "std", "path", 1); if (versions.data.length > 0) { const firstVersion = versions.data[0]; const deps = await getPackageDependencies( TEST_CONFIG, "std", "path", firstVersion.version, ); assertExists(deps); assertEquals(Array.isArray(deps), true); } }); Deno.test("getUser returns user details", async () => { const userScopes = await listScopeMembers(TEST_CONFIG, "std"); if (userScopes.length > 0) { const firstMember = userScopes[0]; const user = await getUser(TEST_CONFIG, firstMember.user.id); assertExists(user); assertEquals(user.id, firstMember.user.id); assertExists(user.name); assertExists(user.avatarUrl); } }); Deno.test("getUserScopes returns user's scopes", async () => { const scopeMembers = await listScopeMembers(TEST_CONFIG, "std"); if (scopeMembers.length > 0) { const firstMember = scopeMembers[0]; const scopes = await getUserScopes(TEST_CONFIG, firstMember.user.id); assertExists(scopes); assertEquals(Array.isArray(scopes), true); } }); Deno.test("listScopeMembers returns scope members", async () => { const members = await listScopeMembers(TEST_CONFIG, "std"); assertExists(members); assertEquals(Array.isArray(members), true); if (members.length > 0) { assertExists(members[0].user); assertExists(members[0].user.id); assertExists(members[0].user.name); } }); // Note: listScopeInvites requires authentication, so we can't test it without credentials Deno.test("getPublishingTask throws for non-existent task", async () => { await assertRejects( async () => await getPublishingTask( TEST_CONFIG, "00000000-0000-0000-0000-000000000000", ), Error, "JSR API request failed", ); }); Deno.test("getStats returns registry statistics", async () => { const stats = await getStats(TEST_CONFIG); assertExists(stats); assertExists(stats.newest); assertExists(stats.updated); assertExists(stats.featured); assertEquals(Array.isArray(stats.newest), true); assertEquals(Array.isArray(stats.updated), true); assertEquals(Array.isArray(stats.featured), true); }); Deno.test("API errors include status and message", async () => { try { await getPackage(TEST_CONFIG, "nonexistent", "package"); } catch (error) { assertExists(error); if (error instanceof Error) { assertStringIncludes(error.message, "JSR API request failed"); assertStringIncludes(error.message, "404"); } } }); Deno.test("searchPackages respects pagination", async () => { const page1 = await searchPackages(TEST_CONFIG, "test", 5, 1); const page2 = await searchPackages(TEST_CONFIG, "test", 5, 2); assertExists(page1.items); assertExists(page2.items); if (page1.items.length > 0 && page2.items.length > 0) { const page1Ids = page1.items.map((p) => `${p.scope}/${p.name}`); const page2Ids = page2.items.map((p) => `${p.scope}/${p.name}`); const intersection = page1Ids.filter((id) => page2Ids.includes(id)); assertEquals(intersection.length, 0); } });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wyattjoh/jsr-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server