Skip to content

Commit 8edbcad

Browse files
zeevdrclaude
andcommitted
test(watcher): cover once() override with subscriptionError once-listener test
Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 5c32eeb commit 8edbcad

1 file changed

Lines changed: 43 additions & 0 deletions

File tree

test/watcher.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,49 @@ describe("ConfigWatcher", () => {
740740
expect(errors[0]?.message).toBe("access denied");
741741
});
742742

743+
it("once listener fires only for the first subscriptionError", async () => {
744+
vi.useFakeTimers();
745+
746+
const watcher = createWatcher();
747+
watcher.field("payments.fee", Number, { default: 0.01 });
748+
mockGetConfigSuccess([]);
749+
750+
const errors: Error[] = [];
751+
watcher.once("subscriptionError", (err) => errors.push(err));
752+
753+
await watcher.start();
754+
755+
const newStream = createMockStream();
756+
configStub.subscribe.mockReturnValue(newStream);
757+
configStub.getConfig.mockImplementationOnce(
758+
(_req: unknown, _meta: unknown, _opts: unknown, cb: (...args: unknown[]) => void) => {
759+
cb(null, { config: { tenantId: "tenant-1", version: 2, values: [] } });
760+
},
761+
);
762+
763+
// First error fires the once listener.
764+
mockStream.emit("error", makeServiceError(status.UNAVAILABLE, "first error"));
765+
await vi.advanceTimersByTimeAsync(60_000);
766+
767+
// Second error on the new stream should NOT fire the once listener again.
768+
const newStream2 = createMockStream();
769+
configStub.subscribe.mockReturnValue(newStream2);
770+
configStub.getConfig.mockImplementationOnce(
771+
(_req: unknown, _meta: unknown, _opts: unknown, cb: (...args: unknown[]) => void) => {
772+
cb(null, { config: { tenantId: "tenant-1", version: 2, values: [] } });
773+
},
774+
);
775+
newStream.emit("error", makeServiceError(status.UNAVAILABLE, "second error"));
776+
await vi.advanceTimersByTimeAsync(60_000);
777+
778+
expect(errors).toHaveLength(1);
779+
expect(errors[0]?.message).toBe("first error");
780+
781+
newStream2.cancel = vi.fn();
782+
await watcher.stop();
783+
vi.useRealTimers();
784+
});
785+
743786
it("reconnects on stream end", async () => {
744787
vi.useFakeTimers();
745788

0 commit comments

Comments
 (0)