import { mock } from "jest-mock-extended"; import { Observable, ReplaySubject } from "rxjs"; import { AccountInfo, AccountService } from "../src/auth/abstractions/account.service"; import { AuthenticationStatus } from "../src/auth/enums/authentication-status"; import { UserId } from "../src/types/guid"; export function mockAccountServiceWith( userId: UserId, info: Partial = {}, ): FakeAccountService { const fullInfo: AccountInfo = { ...info, ...{ name: "name", email: "email", status: AuthenticationStatus.Locked, }, }; const service = new FakeAccountService({ [userId]: fullInfo }); service.activeAccountSubject.next({ id: userId, ...fullInfo }); return service; } export class FakeAccountService implements AccountService { mock = mock(); // eslint-disable-next-line rxjs/no-exposed-subjects -- test class accountsSubject = new ReplaySubject>(1); // eslint-disable-next-line rxjs/no-exposed-subjects -- test class activeAccountSubject = new ReplaySubject<{ id: UserId } & AccountInfo>(1); private _activeUserId: UserId; get activeUserId() { return this._activeUserId; } accounts$ = this.accountsSubject.asObservable(); activeAccount$ = this.activeAccountSubject.asObservable(); accountLock$: Observable; accountLogout$: Observable; constructor(initialData: Record) { this.accountsSubject.next(initialData); this.activeAccountSubject.subscribe((data) => (this._activeUserId = data?.id)); this.activeAccountSubject.next(null); } async addAccount(userId: UserId, accountData: AccountInfo): Promise { const current = this.accountsSubject["_buffer"][0] ?? {}; this.accountsSubject.next({ ...current, [userId]: accountData }); await this.mock.addAccount(userId, accountData); } async setAccountName(userId: UserId, name: string): Promise { await this.mock.setAccountName(userId, name); } async setAccountEmail(userId: UserId, email: string): Promise { await this.mock.setAccountEmail(userId, email); } async setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise { await this.mock.setAccountStatus(userId, status); } async setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise { await this.mock.setMaxAccountStatus(userId, maxStatus); } async switchAccount(userId: UserId): Promise { const next = userId == null ? null : { id: userId, ...this.accountsSubject["_buffer"]?.[0]?.[userId] }; this.activeAccountSubject.next(next); await this.mock.switchAccount(userId); } }