Files
welshman/packages/app/__tests__/relaySelection.test.ts
T
2025-02-28 14:18:02 -08:00

122 lines
3.4 KiB
TypeScript

import * as util from "@welshman/util"
import {afterEach, beforeEach, describe, expect, test, vi} from "vitest"
import * as relaySelectionModule from "../src/relaySelections"
// Mock dependencies
vi.mock("@welshman/util", async imports => {
return {
...(await imports()),
normalizeRelayUrl: vi.fn(url => url),
asDecryptedEvent: vi.fn(event => event),
readList: vi.fn(),
getListTags: vi.fn(() => []),
getRelayTags: vi.fn(() => []),
getRelayTagValues: vi.fn(() => []),
}
})
vi.mock("@welshman/store", async imports => {
return {
...(await imports()),
deriveEventsMapped: vi.fn(() => ({subscribe: () => ({unsubscribe: () => {}})})),
}
})
vi.mock("../src/subscribe.js", () => ({
load: vi.fn().mockResolvedValue([]),
}))
vi.mock("../src/collection.js", () => ({
collection: vi.fn(() => ({
indexStore: {},
deriveItem: vi.fn(),
loadItem: vi.fn(),
})),
}))
describe("relaySelections", () => {
beforeEach(() => {
vi.clearAllMocks()
})
afterEach(() => {
vi.restoreAllMocks()
})
describe("getRelayUrls", () => {
test("returns unique normalized relay URLs", () => {
// Setup
const mockList = {
tags: [
["r", "wss://relay1.com"],
["r", "wss://relay2.com"],
],
}
vi.mocked(util.getListTags).mockReturnValue(mockList.tags)
vi.mocked(util.getRelayTagValues).mockReturnValue([
"wss://relay1.com",
"wss://relay2.com",
"wss://relay1.com",
])
// Execute
const result = relaySelectionModule.getRelayUrls(mockList)
// Verify
expect(util.getListTags).toHaveBeenCalledWith(mockList)
expect(util.getRelayTagValues).toHaveBeenCalledWith(mockList.tags)
expect(util.normalizeRelayUrl).toHaveBeenCalledTimes(3)
expect(result).toEqual(["wss://relay1.com", "wss://relay2.com"])
})
test("returns empty array when list is undefined", () => {
vi.mocked(util.getListTags).mockReturnValue([])
vi.mocked(util.getRelayTagValues).mockReturnValue([])
const result = relaySelectionModule.getRelayUrls(undefined)
expect(result).toEqual([])
})
})
describe("getReadRelayUrls", () => {
test("returns read relay URLs", () => {
// Setup
const mockTags = [
["r", "wss://relay1.com", "read"],
["r", "wss://relay2.com", "write"],
["r", "wss://relay3.com"], // no marker is also read
["r", "wss://relay4.com", "read"],
]
vi.mocked(util.getListTags).mockReturnValue(mockTags)
vi.mocked(util.getRelayTags).mockReturnValue(mockTags)
// Execute
const result = relaySelectionModule.getReadRelayUrls({tags: mockTags})
// Verify
expect(result).toEqual(["wss://relay1.com", "wss://relay3.com", "wss://relay4.com"])
})
})
describe("getWriteRelayUrls", () => {
test("returns write relay URLs", () => {
// Setup
const mockTags = [
["r", "wss://relay1.com", "read"],
["r", "wss://relay2.com", "write"],
["r", "wss://relay3.com"], // no marker is also write
["r", "wss://relay4.com", "write"],
]
vi.mocked(util.getListTags).mockReturnValue(mockTags)
vi.mocked(util.getRelayTags).mockReturnValue(mockTags)
// Execute
const result = relaySelectionModule.getWriteRelayUrls({tags: mockTags})
// Verify
expect(result).toEqual(["wss://relay2.com", "wss://relay3.com", "wss://relay4.com"])
})
})
})