From 27c5f0b543c3f66d50c2cbba082e147585156ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=A8=20Audrey=20=E2=9C=A8?= Date: Wed, 12 Mar 2025 14:06:21 -0400 Subject: [PATCH] validator filter tests --- .../achievements/event-processor.spec.ts | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/libs/common/src/tools/achievements/event-processor.spec.ts b/libs/common/src/tools/achievements/event-processor.spec.ts index 301fbb9a0ce..e958da820fe 100644 --- a/libs/common/src/tools/achievements/event-processor.spec.ts +++ b/libs/common/src/tools/achievements/event-processor.spec.ts @@ -1,8 +1,8 @@ -import { BehaviorSubject, ReplaySubject, bufferCount, firstValueFrom } from "rxjs"; +import { BehaviorSubject, ReplaySubject, bufferCount, concat, first, firstValueFrom } from "rxjs"; import { validate } from "./event-processor"; import { ItemCreatedProgressEvent } from "./example-achievements"; -import { itemAdded$ } from "./example-events"; +import { itemAdded$, itemUpdated$ } from "./example-events"; import { ItemCreatedAchievement, ItemCreatedProgress, @@ -54,8 +54,8 @@ describe("event-processor", () => { it("tracks achievement progress and earns an achievement", async () => { const validators$ = new BehaviorSubject([ItemCreatedValidator]); const captured$ = new BehaviorSubject([]); - const achievements$ = new ReplaySubject(2); - const result = firstValueFrom(achievements$.pipe(bufferCount(2))); + const achievements$ = new ReplaySubject(3); + const result = firstValueFrom(achievements$.pipe(bufferCount(3))); itemAdded$.pipe(validate(validators$, captured$)).subscribe(achievements$); @@ -67,5 +67,35 @@ describe("event-processor", () => { ]; await expect(result).resolves.toMatchObject(expected); }); + + it("skips records that fail the validator's filter criteria", async () => { + const validators$ = new BehaviorSubject([ItemCreatedTracker]); + const captured$ = new BehaviorSubject([]); + const achievements$ = new ReplaySubject(2); + const result = firstValueFrom(achievements$.pipe(bufferCount(2))); + + // `ItemCreatedTracker` filters out update events + concat(itemUpdated$, itemAdded$) + .pipe(validate(validators$, captured$)) + .subscribe(achievements$); + + const expected = [{ achievement: { type: "progress", name: ItemCreatedProgress, value: 1 } }]; + await expect(result).resolves.toMatchObject(expected); + }); + + it("only emits when its validators return events", async () => { + const validators$ = new BehaviorSubject([ItemCreatedTracker]); + const captured$ = new BehaviorSubject([]); + const achievements$ = new BehaviorSubject(undefined); + + // `ItemCreatedTracker` filters `itemUpdated$` emissions. There are no others + // to process. When `itemUpdated$` completes, `first()` emits `null`, which + // replaces the `undefined` value in `achievements$`. + concat(itemUpdated$) + .pipe(validate(validators$, captured$), first(null, null)) + .subscribe(achievements$); + + await expect(achievements$.value).toBeNull(); + }); }); });