Spaces:
Paused
Paused
| /** | |
| * Tests for Nostr Profile Import | |
| */ | |
| import { describe, it, expect } from "vitest"; | |
| import type { NostrProfile } from "./config-schema.js"; | |
| import { mergeProfiles } from "./nostr-profile-import.js"; | |
| // Note: importProfileFromRelays requires real network calls or complex mocking | |
| // of nostr-tools SimplePool, so we focus on unit testing mergeProfiles | |
| describe("nostr-profile-import", () => { | |
| describe("mergeProfiles", () => { | |
| it("returns empty object when both are undefined", () => { | |
| const result = mergeProfiles(undefined, undefined); | |
| expect(result).toEqual({}); | |
| }); | |
| it("returns imported when local is undefined", () => { | |
| const imported: NostrProfile = { | |
| name: "imported", | |
| displayName: "Imported User", | |
| about: "Bio from relay", | |
| }; | |
| const result = mergeProfiles(undefined, imported); | |
| expect(result).toEqual(imported); | |
| }); | |
| it("returns local when imported is undefined", () => { | |
| const local: NostrProfile = { | |
| name: "local", | |
| displayName: "Local User", | |
| }; | |
| const result = mergeProfiles(local, undefined); | |
| expect(result).toEqual(local); | |
| }); | |
| it("prefers local values over imported", () => { | |
| const local: NostrProfile = { | |
| name: "localname", | |
| about: "Local bio", | |
| }; | |
| const imported: NostrProfile = { | |
| name: "importedname", | |
| displayName: "Imported Display", | |
| about: "Imported bio", | |
| picture: "https://example.com/pic.jpg", | |
| }; | |
| const result = mergeProfiles(local, imported); | |
| expect(result.name).toBe("localname"); // local wins | |
| expect(result.displayName).toBe("Imported Display"); // imported fills gap | |
| expect(result.about).toBe("Local bio"); // local wins | |
| expect(result.picture).toBe("https://example.com/pic.jpg"); // imported fills gap | |
| }); | |
| it("fills all missing fields from imported", () => { | |
| const local: NostrProfile = { | |
| name: "myname", | |
| }; | |
| const imported: NostrProfile = { | |
| name: "theirname", | |
| displayName: "Their Name", | |
| about: "Their bio", | |
| picture: "https://example.com/pic.jpg", | |
| banner: "https://example.com/banner.jpg", | |
| website: "https://example.com", | |
| nip05: "user@example.com", | |
| lud16: "user@getalby.com", | |
| }; | |
| const result = mergeProfiles(local, imported); | |
| expect(result.name).toBe("myname"); | |
| expect(result.displayName).toBe("Their Name"); | |
| expect(result.about).toBe("Their bio"); | |
| expect(result.picture).toBe("https://example.com/pic.jpg"); | |
| expect(result.banner).toBe("https://example.com/banner.jpg"); | |
| expect(result.website).toBe("https://example.com"); | |
| expect(result.nip05).toBe("user@example.com"); | |
| expect(result.lud16).toBe("user@getalby.com"); | |
| }); | |
| it("handles empty strings as falsy (prefers imported)", () => { | |
| const local: NostrProfile = { | |
| name: "", | |
| displayName: "", | |
| }; | |
| const imported: NostrProfile = { | |
| name: "imported", | |
| displayName: "Imported", | |
| }; | |
| const result = mergeProfiles(local, imported); | |
| // Empty strings are still strings, so they "win" over imported | |
| // This is JavaScript nullish coalescing behavior | |
| expect(result.name).toBe(""); | |
| expect(result.displayName).toBe(""); | |
| }); | |
| it("handles null values in local (prefers imported)", () => { | |
| const local: NostrProfile = { | |
| name: undefined, | |
| displayName: undefined, | |
| }; | |
| const imported: NostrProfile = { | |
| name: "imported", | |
| displayName: "Imported", | |
| }; | |
| const result = mergeProfiles(local, imported); | |
| expect(result.name).toBe("imported"); | |
| expect(result.displayName).toBe("Imported"); | |
| }); | |
| }); | |
| }); | |