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:
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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$,
|
||||
|
||||
Reference in New Issue
Block a user