1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-10 05:30:01 +00:00

achievement hub event output tests

This commit is contained in:
✨ Audrey ✨
2025-03-20 13:16:08 -04:00
parent df296c97bd
commit 112f3e416a
2 changed files with 42 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
import { BehaviorSubject, ReplaySubject, Subject, firstValueFrom } from "rxjs";
import { BehaviorSubject, ReplaySubject, Subject, firstValueFrom, of, timeout } from "rxjs";
import { ConsoleLogService } from "../../platform/services/console-log.service";
import { consoleSemanticLoggerProvider } from "../log";
@@ -9,7 +9,7 @@ import {
TotallyAttachedAchievement,
TotallyAttachedValidator,
} from "./examples/example-validators";
import { itemAdded$ } from "./examples/user-events";
import { ItemAddedEvent } from "./examples/user-events";
import {
AchievementEarnedEvent,
AchievementEvent,
@@ -30,9 +30,10 @@ describe("AchievementHub", () => {
const achievements$ = new Subject<AchievementEvent>();
const hub = new AchievementHub(validators$, events$, achievements$);
const results$ = new ReplaySubject<AchievementEvent>(3);
hub.all$().subscribe(results$);
achievements$.next(ItemCreatedEarnedEvent);
achievements$.complete();
hub.all$().subscribe(results$);
const result = firstValueFrom(results$);
await expect(result).resolves.toEqual(ItemCreatedEarnedEvent);
@@ -48,7 +49,7 @@ describe("AchievementHub", () => {
// hub starts listening when achievements$ completes
achievements$.complete();
itemAdded$.subscribe(events$);
events$.next(ItemAddedEvent);
const result = firstValueFrom(results$);
await expect(result).resolves.toMatchObject({
@@ -58,13 +59,41 @@ describe("AchievementHub", () => {
});
describe("new$", () => {
it("", async () => {
it("emits achievements derived from events", async () => {
const validators$ = new BehaviorSubject<AchievementValidator[]>([TotallyAttachedValidator]);
const events$ = new Subject<UserActionEvent>();
const achievements$ = new Subject<AchievementEvent>();
const hub = new AchievementHub(validators$, events$, achievements$, 10, testLog);
const results$ = new ReplaySubject<AchievementEvent>(3);
hub.new$().subscribe(results$);
// hub starts listening when achievements$ completes
achievements$.complete();
events$.next(ItemAddedEvent);
const result = firstValueFrom(results$);
await expect(result).resolves.toMatchObject({
achievement: { type: "earned", name: TotallyAttachedAchievement },
});
});
it("omits achievement emissions before subscription", async () => {
const validators$ = new Subject<AchievementValidator[]>();
const events$ = new Subject<UserActionEvent>();
const achievements$ = new Subject<AchievementEvent>();
const hub = new AchievementHub(validators$, events$, achievements$);
const results$ = new ReplaySubject<AchievementEvent>(3);
hub.new$().subscribe(results$);
const results$ = new ReplaySubject<AchievementEvent | null>(3);
achievements$.next(ItemCreatedEarnedEvent);
achievements$.complete();
// there are no emissions, so use a timeout to inject a `null` sentinel value
hub
.new$()
.pipe(timeout({ first: 10, with: () => of(null) }))
.subscribe(results$);
const result = firstValueFrom(results$);
await expect(result).resolves.toBeNull();
});
});

View File

@@ -3,7 +3,7 @@ import { Observable, of } from "rxjs";
import { UserId } from "../../../types/guid";
import { UserActionEvent } from "../types";
const itemAdded$: Observable<UserActionEvent> = of({
const ItemAddedEvent: UserActionEvent = {
"@timestamp": Date.now(),
user: {
id: "1E2EDBC3-4449-4583-A4AC-ACDFA5C2EC71" as UserId,
@@ -25,7 +25,9 @@ const itemAdded$: Observable<UserActionEvent> = of({
action: "vault-item-added",
labels: { "vault-item-type": "login", "vault-item-uri-quantity": 1 },
tags: ["with-attachment"],
});
};
const itemAdded$ = of(ItemAddedEvent);
const itemUpdated$: Observable<UserActionEvent> = of({
"@timestamp": Date.now(),
@@ -171,6 +173,7 @@ const credentialGenerated$: Observable<UserActionEvent> = of({
});
export {
ItemAddedEvent,
itemAdded$,
itemUpdated$,
itemDeleted$,