mirror of
https://github.com/bitwarden/browser.git
synced 2024-09-18 02:41:15 +02:00
d799529428
* Split out api methods into sendApiService * Move SendService and abstraction * Libs updates * Web updates * CLI updates * Desktop updates * libs send service fixes * browser factory additions * Browser updates * Fix service injection for CLI SendReceiveCommand * Deprecate directly calling send state service methods * SendService observables updates * Update components to use new observables * Modify CLI to use state service instead of observables * Remove unnecessary await on get() * Move delete() to InternalSendService * SendService unit tests * Split fileUploadService by send and cipher * send and cipher service factory updates * Add file upload methods to get around circular dependency issues * Move api methods from sendService to sendApiService * Update cipherService to use fileApi methods * libs service injection and component changes * browser service injection and component changes * Desktop component changes * Web component changes * cipher service test fix * Fix file capitalization * CLI service import and command updates * Remove extra abstract fileUploadService * WIP: Condense callbacks for file upload Co-authored-by: Robyn MacCallum <robyntmaccallum@gmail.com> * Send callbacks for file upload * Fix circular service dependencies * Fix response return on upload * Fix function definitions * Service injection fixes and bug fixes * Fix folder casing * Service injection cleanup * Remove deleted file from capital letters whitelist * Create new SendApiService for popup * Move cipherFileUploadService to vault * Move SendFileUploadService methods into SendApiService * Rename methods to remove 'WithServer' * Properly subscribe to sendViews * Fix Send serialization * Implement fromJSON on sendFile and sendText * [PM-1347] Fix send key serialization (#4989) * Properly serialize key on send fromJSON * Remove call that nulled out decrypted sends * Fix null checks in fromJSON methods for models * lint fixes --------- Co-authored-by: Matt Gibson <mgibson@bitwarden.com>
179 lines
5.2 KiB
TypeScript
179 lines
5.2 KiB
TypeScript
import { any, mock, MockProxy } from "jest-mock-extended";
|
|
import { BehaviorSubject, firstValueFrom } from "rxjs";
|
|
|
|
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
|
|
import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service";
|
|
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
|
|
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
|
|
import { StateService } from "@bitwarden/common/abstractions/state.service";
|
|
import { SendData } from "@bitwarden/common/models/data/send.data";
|
|
import { EncString } from "@bitwarden/common/models/domain/enc-string";
|
|
import { Send } from "@bitwarden/common/models/domain/send";
|
|
import { SendView } from "@bitwarden/common/models/view/send.view";
|
|
import { ContainerService } from "@bitwarden/common/services/container.service";
|
|
import { SendService } from "@bitwarden/common/services/send/send.service";
|
|
|
|
describe("SendService", () => {
|
|
const cryptoService = mock<CryptoService>();
|
|
const i18nService = mock<I18nService>();
|
|
const cryptoFunctionService = mock<CryptoFunctionService>();
|
|
const encryptService = mock<EncryptService>();
|
|
|
|
let sendService: SendService;
|
|
|
|
let stateService: MockProxy<StateService>;
|
|
let activeAccount: BehaviorSubject<string>;
|
|
let activeAccountUnlocked: BehaviorSubject<boolean>;
|
|
|
|
beforeEach(() => {
|
|
activeAccount = new BehaviorSubject("123");
|
|
activeAccountUnlocked = new BehaviorSubject(true);
|
|
|
|
stateService = mock<StateService>();
|
|
stateService.activeAccount$ = activeAccount;
|
|
stateService.activeAccountUnlocked$ = activeAccountUnlocked;
|
|
(window as any).bitwardenContainerService = new ContainerService(cryptoService, encryptService);
|
|
|
|
stateService.getEncryptedSends.calledWith(any()).mockResolvedValue({
|
|
"1": sendData("1", "Test Send"),
|
|
});
|
|
|
|
stateService.getDecryptedSends
|
|
.calledWith(any())
|
|
.mockResolvedValue([sendView("1", "Test Send")]);
|
|
|
|
sendService = new SendService(cryptoService, i18nService, cryptoFunctionService, stateService);
|
|
});
|
|
|
|
afterEach(() => {
|
|
activeAccount.complete();
|
|
activeAccountUnlocked.complete();
|
|
});
|
|
|
|
describe("get", () => {
|
|
it("exists", async () => {
|
|
const result = sendService.get("1");
|
|
|
|
expect(result).toEqual(send("1", "Test Send"));
|
|
});
|
|
|
|
it("does not exist", async () => {
|
|
const result = sendService.get("2");
|
|
|
|
expect(result).toBe(undefined);
|
|
});
|
|
});
|
|
|
|
it("getAll", async () => {
|
|
const sends = await sendService.getAll();
|
|
const send1 = sends[0];
|
|
|
|
expect(sends).toHaveLength(1);
|
|
expect(send1).toEqual(send("1", "Test Send"));
|
|
});
|
|
|
|
describe("getFromState", () => {
|
|
it("exists", async () => {
|
|
const result = await sendService.getFromState("1");
|
|
|
|
expect(result).toEqual(send("1", "Test Send"));
|
|
});
|
|
it("does not exist", async () => {
|
|
const result = await sendService.getFromState("2");
|
|
|
|
expect(result).toBe(null);
|
|
});
|
|
});
|
|
|
|
it("getAllDecryptedFromState", async () => {
|
|
await sendService.getAllDecryptedFromState();
|
|
|
|
expect(stateService.getDecryptedSends).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
// InternalSendService
|
|
|
|
it("upsert", async () => {
|
|
await sendService.upsert(sendData("2", "Test 2"));
|
|
|
|
expect(await firstValueFrom(sendService.sends$)).toEqual([
|
|
send("1", "Test Send"),
|
|
send("2", "Test 2"),
|
|
]);
|
|
});
|
|
|
|
it("replace", async () => {
|
|
await sendService.replace({ "2": sendData("2", "test 2") });
|
|
|
|
expect(await firstValueFrom(sendService.sends$)).toEqual([send("2", "test 2")]);
|
|
});
|
|
|
|
it("clear", async () => {
|
|
await sendService.clear();
|
|
|
|
expect(await firstValueFrom(sendService.sends$)).toEqual([]);
|
|
});
|
|
|
|
describe("delete", () => {
|
|
it("exists", async () => {
|
|
await sendService.delete("1");
|
|
|
|
expect(stateService.getEncryptedSends).toHaveBeenCalledTimes(2);
|
|
expect(stateService.setEncryptedSends).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it("does not exist", async () => {
|
|
sendService.delete("1");
|
|
|
|
expect(stateService.getEncryptedSends).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
|
|
// Send object helper functions
|
|
|
|
function sendData(id: string, name: string) {
|
|
const data = new SendData({} as any);
|
|
data.id = id;
|
|
data.name = name;
|
|
data.disabled = false;
|
|
data.accessCount = 2;
|
|
data.accessId = "1";
|
|
data.revisionDate = null;
|
|
data.expirationDate = null;
|
|
data.deletionDate = null;
|
|
data.notes = "Notes!!";
|
|
data.key = null;
|
|
return data;
|
|
}
|
|
|
|
function sendView(id: string, name: string) {
|
|
const data = new SendView({} as any);
|
|
data.id = id;
|
|
data.name = name;
|
|
data.disabled = false;
|
|
data.accessCount = 2;
|
|
data.accessId = "1";
|
|
data.revisionDate = null;
|
|
data.expirationDate = null;
|
|
data.deletionDate = null;
|
|
data.notes = "Notes!!";
|
|
data.key = null;
|
|
return data;
|
|
}
|
|
|
|
function send(id: string, name: string) {
|
|
const data = new Send({} as any);
|
|
data.id = id;
|
|
data.name = new EncString(name);
|
|
data.disabled = false;
|
|
data.accessCount = 2;
|
|
data.accessId = "1";
|
|
data.revisionDate = null;
|
|
data.expirationDate = null;
|
|
data.deletionDate = null;
|
|
data.notes = new EncString("Notes!!");
|
|
data.key = null;
|
|
return data;
|
|
}
|
|
});
|