You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.8 KiB
136 lines
3.8 KiB
import { beforeEach, describe, expect, it, vi } from "vitest"; |
|
import { |
|
canDeleteEvent, |
|
deleteEvent, |
|
} from "../../src/lib/services/deletion.ts"; |
|
import NDK, { NDKEvent, NDKRelaySet } from "@nostr-dev-kit/ndk"; |
|
|
|
describe("Deletion Service", () => { |
|
let mockNdk: NDK; |
|
let mockEvent: NDKEvent; |
|
|
|
beforeEach(() => { |
|
// Create mock NDK instance |
|
mockNdk = { |
|
activeUser: { |
|
pubkey: "test-pubkey-123", |
|
}, |
|
pool: { |
|
relays: new Map([ |
|
["wss://relay1.example.com", { url: "wss://relay1.example.com" }], |
|
["wss://relay2.example.com", { url: "wss://relay2.example.com" }], |
|
]), |
|
}, |
|
} as unknown as NDK; |
|
|
|
// Create mock event |
|
mockEvent = { |
|
id: "event-id-123", |
|
kind: 30041, |
|
pubkey: "test-pubkey-123", |
|
tagAddress: () => "30041:test-pubkey-123:test-identifier", |
|
} as unknown as NDKEvent; |
|
}); |
|
|
|
describe("canDeleteEvent", () => { |
|
it("should return true when user is the event author", () => { |
|
const result = canDeleteEvent(mockEvent, mockNdk); |
|
expect(result).toBe(true); |
|
}); |
|
|
|
it("should return false when user is not the event author", () => { |
|
const differentUserEvent = { |
|
...mockEvent, |
|
pubkey: "different-pubkey-456", |
|
} as unknown as NDKEvent; |
|
|
|
const result = canDeleteEvent(differentUserEvent, mockNdk); |
|
expect(result).toBe(false); |
|
}); |
|
|
|
it("should return false when event is null", () => { |
|
const result = canDeleteEvent(null, mockNdk); |
|
expect(result).toBe(false); |
|
}); |
|
|
|
it("should return false when ndk has no active user", () => { |
|
const ndkWithoutUser = { |
|
...mockNdk, |
|
activeUser: undefined, |
|
} as unknown as NDK; |
|
|
|
const result = canDeleteEvent(mockEvent, ndkWithoutUser); |
|
expect(result).toBe(false); |
|
}); |
|
}); |
|
|
|
describe("deleteEvent", () => { |
|
it("should return error when no eventId or eventAddress provided", async () => { |
|
const result = await deleteEvent({}, mockNdk); |
|
|
|
expect(result.success).toBe(false); |
|
expect(result.error).toBe( |
|
"Either eventId or eventAddress must be provided", |
|
); |
|
}); |
|
|
|
it("should return error when user is not logged in", async () => { |
|
const ndkWithoutUser = { |
|
...mockNdk, |
|
activeUser: undefined, |
|
} as unknown as NDK; |
|
|
|
const result = await deleteEvent( |
|
{ eventId: "test-id" }, |
|
ndkWithoutUser, |
|
); |
|
|
|
expect(result.success).toBe(false); |
|
expect(result.error).toBe("Please log in first"); |
|
}); |
|
|
|
it("should create deletion event with correct tags", async () => { |
|
const mockSign = vi.fn(); |
|
const mockPublish = vi.fn().mockResolvedValue( |
|
new Set(["wss://relay1.example.com"]), |
|
); |
|
|
|
// Mock NDKEvent constructor |
|
const MockNDKEvent = vi.fn().mockImplementation(function (this: any) { |
|
this.kind = 0; |
|
this.created_at = 0; |
|
this.tags = []; |
|
this.content = ""; |
|
this.pubkey = ""; |
|
this.sign = mockSign; |
|
this.publish = mockPublish; |
|
return this; |
|
}); |
|
|
|
// Mock NDKRelaySet |
|
const mockRelaySet = {} as NDKRelaySet; |
|
vi.spyOn(NDKRelaySet, "fromRelayUrls").mockReturnValue(mockRelaySet); |
|
|
|
// Replace global NDKEvent temporarily |
|
const originalNDKEvent = (globalThis as any).NDKEvent; |
|
(global as any).NDKEvent = MockNDKEvent; |
|
|
|
const result = await deleteEvent( |
|
{ |
|
eventId: "event-123", |
|
eventAddress: "30041:pubkey:identifier", |
|
eventKind: 30041, |
|
reason: "Test deletion", |
|
}, |
|
mockNdk, |
|
); |
|
|
|
// Restore original |
|
(global as any).NDKEvent = originalNDKEvent; |
|
|
|
expect(MockNDKEvent).toHaveBeenCalled(); |
|
expect(mockSign).toHaveBeenCalled(); |
|
expect(mockPublish).toHaveBeenCalled(); |
|
}); |
|
}); |
|
});
|
|
|