mirror of
https://github.com/bitwarden/browser.git
synced 2024-12-27 17:18:04 +01:00
56bffb04bb
* Move user key memory state to state providers
Note: state service observable change is because these updates are no longer internal to the class, but reporter directly to account service through crypto service on update of a user key
* remove decrypted user key state
Note, we're going to move the encrypted cryptoSymmetric key (and associated master key encrypted user keys) as part of the master key service creation. Crypto service will no longer be responsible for the encrypted forms of user key.
* Deprecate notices belong on abstraction
* Allow for single-direction status updates
This is necessary since we don't want to have to guarantee that the update to logged out occurs after the update to locked.
* Remove deprecated subject
It turns out the set for cryptoMasterKey was also unused 🎉
76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
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<AccountInfo> = {},
|
|
): 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<AccountService>();
|
|
// eslint-disable-next-line rxjs/no-exposed-subjects -- test class
|
|
accountsSubject = new ReplaySubject<Record<UserId, AccountInfo>>(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;
|
|
}
|
|
get accounts$() {
|
|
return this.accountsSubject.asObservable();
|
|
}
|
|
get activeAccount$() {
|
|
return this.activeAccountSubject.asObservable();
|
|
}
|
|
accountLock$: Observable<UserId>;
|
|
accountLogout$: Observable<UserId>;
|
|
|
|
constructor(initialData: Record<UserId, AccountInfo>) {
|
|
this.accountsSubject.next(initialData);
|
|
this.activeAccountSubject.subscribe((data) => (this._activeUserId = data?.id));
|
|
this.activeAccountSubject.next(null);
|
|
}
|
|
|
|
async addAccount(userId: UserId, accountData: AccountInfo): Promise<void> {
|
|
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<void> {
|
|
await this.mock.setAccountName(userId, name);
|
|
}
|
|
|
|
async setAccountEmail(userId: UserId, email: string): Promise<void> {
|
|
await this.mock.setAccountEmail(userId, email);
|
|
}
|
|
|
|
async setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise<void> {
|
|
await this.mock.setAccountStatus(userId, status);
|
|
}
|
|
|
|
async setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise<void> {
|
|
await this.mock.setMaxAccountStatus(userId, maxStatus);
|
|
}
|
|
|
|
async switchAccount(userId: UserId): Promise<void> {
|
|
await this.mock.switchAccount(userId);
|
|
}
|
|
}
|