|
1 | | -import { afterEach, beforeEach, describe, expect, it } from "vitest"; |
| 1 | +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; |
2 | 2 | import { EventGenerator, RelayPoolMock } from "../test"; |
3 | | -import NDK, { type NDKEvent, type NDKFilter, NDKKind, type NDKRelay, NDKRelaySet, NDKSubscription } from "./index"; |
| 3 | +import NDK, { |
| 4 | + NDKSubscriptionCacheUsage, |
| 5 | + type NDKEvent, |
| 6 | + type NDKFilter, |
| 7 | + NDKKind, |
| 8 | + type NDKRelay, |
| 9 | + NDKRelaySet, |
| 10 | + NDKSubscription, |
| 11 | +} from "./index"; |
4 | 12 |
|
5 | 13 | describe("NDKSubscription", () => { |
6 | 14 | let ndk: NDK; |
@@ -120,4 +128,48 @@ describe("NDKSubscription", () => { |
120 | 128 | expect(eoseReceived).toBe(true); |
121 | 129 | expect(closedReceived).toBe(true); |
122 | 130 | }); |
| 131 | + |
| 132 | + it("should not cache ephemeral events", async () => { |
| 133 | + // Mock cache adapter |
| 134 | + const mockCacheAdapter = { |
| 135 | + setEvent: vi.fn(), |
| 136 | + query: vi.fn().mockResolvedValue([]), |
| 137 | + }; |
| 138 | + // @ts-expect-error - We're intentionally replacing the cache for testing |
| 139 | + ndk.cacheAdapter = mockCacheAdapter; |
| 140 | + |
| 141 | + // Create replaceable and ephemeral events |
| 142 | + const replaceableEvent = EventGenerator.createEvent(10002, "replaceable"); |
| 143 | + await replaceableEvent.sign(); |
| 144 | + const ephemeralEvent = EventGenerator.createEvent(20000, "ephemeral"); |
| 145 | + await ephemeralEvent.sign(); |
| 146 | + |
| 147 | + // Get the first relay |
| 148 | + const relaysArray = Array.from(pool.relays); |
| 149 | + const mockRelay = relaysArray[0]; |
| 150 | + const relaySet = new NDKRelaySet(new Set([mockRelay as unknown as NDKRelay]), ndk); |
| 151 | + const filter: NDKFilter = { |
| 152 | + kinds: [replaceableEvent.kind as number, ephemeralEvent.kind as number], |
| 153 | + }; |
| 154 | + const sub = new NDKSubscription(ndk, filter, { |
| 155 | + subId: "test-subscription-cache", |
| 156 | + skipVerification: true, |
| 157 | + skipValidation: true, |
| 158 | + relaySet, |
| 159 | + cacheUsage: NDKSubscriptionCacheUsage.ONLY_RELAY, |
| 160 | + }); |
| 161 | + |
| 162 | + // Start subscription and simulate events |
| 163 | + sub.start(); |
| 164 | + await mockRelay.simulateEvent(replaceableEvent, sub.subId!); |
| 165 | + await mockRelay.simulateEvent(ephemeralEvent, sub.subId!); |
| 166 | + mockRelay.simulateEOSE(sub.subId!); |
| 167 | + // Verify cache adapter was only called for the replaceable event |
| 168 | + expect(mockCacheAdapter.setEvent).toHaveBeenCalledTimes(1); |
| 169 | + expect(mockCacheAdapter.setEvent).toHaveBeenCalledWith( |
| 170 | + expect.objectContaining({ id: replaceableEvent.id }), |
| 171 | + expect.any(Array), |
| 172 | + expect.any(Object) |
| 173 | + ); |
| 174 | + }); |
123 | 175 | }); |
0 commit comments