chore: add tests
This commit is contained in:
53
src/modules/atproto/getUrl.spec.ts
Normal file
53
src/modules/atproto/getUrl.spec.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"
|
||||
|
||||
vi.mock("@/modules/atproto/getAuthor", () => ({
|
||||
getAuthor: vi.fn()
|
||||
}))
|
||||
|
||||
import { getAuthor } from "@/modules/atproto/getAuthor"
|
||||
|
||||
import { getUrl } from "./getUrl"
|
||||
|
||||
describe("getUrl", () => {
|
||||
beforeEach(() => {
|
||||
vi.mocked(getAuthor).mockReset()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
vi.restoreAllMocks()
|
||||
})
|
||||
|
||||
it("returns null when the author cannot be resolved", async () => {
|
||||
vi.mocked(getAuthor).mockResolvedValue(null)
|
||||
expect(
|
||||
await getUrl({ did: "did:plc:abc", rkey: "r1" })
|
||||
).toBeNull()
|
||||
})
|
||||
|
||||
it("builds a getRecord URL with the right query params on the author's PDS", async () => {
|
||||
vi.mocked(getAuthor).mockResolvedValue({
|
||||
handle: "alice.bsky.social",
|
||||
pds: "https://pds.example.com"
|
||||
})
|
||||
|
||||
const url = await getUrl({ did: "did:plc:abc", rkey: "rkey1" })
|
||||
const parsed = new URL(url as string)
|
||||
|
||||
expect(parsed.origin).toBe("https://pds.example.com")
|
||||
expect(parsed.pathname).toBe("/xrpc/com.atproto.repo.getRecord")
|
||||
expect(parsed.searchParams.get("repo")).toBe("did:plc:abc")
|
||||
expect(parsed.searchParams.get("collection")).toBe("space.remanso.note")
|
||||
expect(parsed.searchParams.get("rkey")).toBe("rkey1")
|
||||
})
|
||||
|
||||
it("passes the did to getAuthor", async () => {
|
||||
vi.mocked(getAuthor).mockResolvedValue({
|
||||
handle: "h",
|
||||
pds: "https://pds.example.com"
|
||||
})
|
||||
|
||||
await getUrl({ did: "did:web:example.com", rkey: "r2" })
|
||||
|
||||
expect(getAuthor).toHaveBeenCalledWith("did:web:example.com")
|
||||
})
|
||||
})
|
||||
54
src/modules/atproto/parseAtUri.spec.ts
Normal file
54
src/modules/atproto/parseAtUri.spec.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import { describe, expect, it } from "vitest"
|
||||
|
||||
import { parseAtUri } from "./parseAtUri"
|
||||
|
||||
describe("parseAtUri", () => {
|
||||
it("parses a did:plc AT URI", () => {
|
||||
expect(
|
||||
parseAtUri("at://did:plc:abc123/app.bsky.feed.post/rkey-xyz")
|
||||
).toEqual({
|
||||
did: "did:plc:abc123",
|
||||
rkey: "rkey-xyz"
|
||||
})
|
||||
})
|
||||
|
||||
it("parses a did:web AT URI", () => {
|
||||
expect(
|
||||
parseAtUri("at://did:web:example.com/space.remanso.note/note-1")
|
||||
).toEqual({
|
||||
did: "did:web:example.com",
|
||||
rkey: "note-1"
|
||||
})
|
||||
})
|
||||
|
||||
it("treats rkeys with slashes as a single trailing segment", () => {
|
||||
expect(
|
||||
parseAtUri("at://did:plc:abc/space.remanso.note/multi/segment")
|
||||
).toEqual({
|
||||
did: "did:plc:abc",
|
||||
rkey: "multi/segment"
|
||||
})
|
||||
})
|
||||
|
||||
it("throws when the URI does not start with at://", () => {
|
||||
expect(() =>
|
||||
parseAtUri("https://did:plc:abc/collection/rkey")
|
||||
).toThrow(/Invalid AT URI/)
|
||||
})
|
||||
|
||||
it("throws when the DID prefix is missing", () => {
|
||||
expect(() => parseAtUri("at://abc/collection/rkey")).toThrow(
|
||||
/Invalid AT URI/
|
||||
)
|
||||
})
|
||||
|
||||
it("throws when the collection or rkey is missing", () => {
|
||||
expect(() => parseAtUri("at://did:plc:abc/onlycollection")).toThrow(
|
||||
/Invalid AT URI/
|
||||
)
|
||||
})
|
||||
|
||||
it("throws on empty input", () => {
|
||||
expect(() => parseAtUri("")).toThrow(/Invalid AT URI/)
|
||||
})
|
||||
})
|
||||
41
src/modules/atproto/shortDid.spec.ts
Normal file
41
src/modules/atproto/shortDid.spec.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { describe, expect, it } from "vitest"
|
||||
|
||||
import { fromShortDid, toShortDid } from "./shortDid"
|
||||
|
||||
describe("toShortDid", () => {
|
||||
it("strips did:plc: prefix", () => {
|
||||
expect(toShortDid("did:plc:abc123")).toBe("abc123")
|
||||
})
|
||||
|
||||
it("strips did: prefix but keeps the method when non-plc", () => {
|
||||
expect(toShortDid("did:web:example.com")).toBe("web:example.com")
|
||||
})
|
||||
|
||||
it("returns input unchanged when there is no did: prefix", () => {
|
||||
expect(toShortDid("abc123")).toBe("abc123")
|
||||
})
|
||||
})
|
||||
|
||||
describe("fromShortDid", () => {
|
||||
it("adds did:plc: prefix to bare identifiers", () => {
|
||||
expect(fromShortDid("abc123")).toBe("did:plc:abc123")
|
||||
})
|
||||
|
||||
it("adds did: prefix when method is already present", () => {
|
||||
expect(fromShortDid("web:example.com")).toBe("did:web:example.com")
|
||||
})
|
||||
|
||||
it("passes through fully-qualified DIDs unchanged", () => {
|
||||
expect(fromShortDid("did:plc:abc123")).toBe("did:plc:abc123")
|
||||
expect(fromShortDid("did:web:example.com")).toBe("did:web:example.com")
|
||||
})
|
||||
})
|
||||
|
||||
describe("round-trip toShortDid → fromShortDid", () => {
|
||||
it.each(["did:plc:abc123", "did:web:example.com", "did:key:zXyZ"])(
|
||||
"is identity for %s",
|
||||
(did) => {
|
||||
expect(fromShortDid(toShortDid(did))).toBe(did)
|
||||
}
|
||||
)
|
||||
})
|
||||
Reference in New Issue
Block a user