mirror of
https://github.com/bitwarden/browser
synced 2025-12-16 00:03:56 +00:00
[PM-6654] new app id service for angular (#8229)
* Improve state documentation * Add namespace for application id * Spec out behavior of app id service * Use state providers for app ids * Migrate app Id * Add reactive interface
This commit is contained in:
@@ -28,6 +28,7 @@ import { FixPremiumMigrator } from "./migrations/3-fix-premium";
|
||||
import { PolicyMigrator } from "./migrations/30-move-policy-state-to-state-provider";
|
||||
import { EnableContextMenuMigrator } from "./migrations/31-move-enable-context-menu-to-autofill-settings-state-provider";
|
||||
import { PreferredLanguageMigrator } from "./migrations/32-move-preferred-language";
|
||||
import { AppIdMigrator } from "./migrations/33-move-app-id-to-state-providers";
|
||||
import { RemoveEverBeenUnlockedMigrator } from "./migrations/4-remove-ever-been-unlocked";
|
||||
import { AddKeyTypeToOrgKeysMigrator } from "./migrations/5-add-key-type-to-org-keys";
|
||||
import { RemoveLegacyEtmKeyMigrator } from "./migrations/6-remove-legacy-etm-key";
|
||||
@@ -37,7 +38,7 @@ import { MoveBrowserSettingsToGlobal } from "./migrations/9-move-browser-setting
|
||||
import { MinVersionMigrator } from "./migrations/min-version";
|
||||
|
||||
export const MIN_VERSION = 2;
|
||||
export const CURRENT_VERSION = 32;
|
||||
export const CURRENT_VERSION = 33;
|
||||
export type MinVersion = typeof MIN_VERSION;
|
||||
|
||||
export function createMigrationBuilder() {
|
||||
@@ -72,7 +73,8 @@ export function createMigrationBuilder() {
|
||||
.with(UserNotificationSettingsKeyMigrator, 28, 29)
|
||||
.with(PolicyMigrator, 29, 30)
|
||||
.with(EnableContextMenuMigrator, 30, 31)
|
||||
.with(PreferredLanguageMigrator, 31, CURRENT_VERSION);
|
||||
.with(PreferredLanguageMigrator, 31, 32)
|
||||
.with(AppIdMigrator, 32, CURRENT_VERSION);
|
||||
}
|
||||
|
||||
export async function currentVersion(
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
import { MockProxy, any } from "jest-mock-extended";
|
||||
|
||||
import { MigrationHelper } from "../migration-helper";
|
||||
import { mockMigrationHelper } from "../migration-helper.spec";
|
||||
|
||||
import {
|
||||
ANONYMOUS_APP_ID_KEY,
|
||||
APP_ID_KEY,
|
||||
AppIdMigrator,
|
||||
} from "./33-move-app-id-to-state-providers";
|
||||
|
||||
function exampleJSON() {
|
||||
return {
|
||||
appId: "appId",
|
||||
anonymousAppId: "anonymousAppId",
|
||||
otherStuff: "otherStuff1",
|
||||
};
|
||||
}
|
||||
|
||||
function missingAppIdJSON() {
|
||||
return {
|
||||
anonymousAppId: "anonymousAppId",
|
||||
otherStuff: "otherStuff1",
|
||||
};
|
||||
}
|
||||
|
||||
function missingAnonymousAppIdJSON() {
|
||||
return {
|
||||
appId: "appId",
|
||||
otherStuff: "otherStuff1",
|
||||
};
|
||||
}
|
||||
|
||||
function missingBothJSON() {
|
||||
return {
|
||||
otherStuff: "otherStuff1",
|
||||
};
|
||||
}
|
||||
|
||||
function rollbackJSON() {
|
||||
return {
|
||||
global_applicationId_appId: "appId",
|
||||
global_applicationId_anonymousAppId: "anonymousAppId",
|
||||
otherStuff: "otherStuff1",
|
||||
};
|
||||
}
|
||||
|
||||
describe("AppIdMigrator", () => {
|
||||
let helper: MockProxy<MigrationHelper>;
|
||||
let sut: AppIdMigrator;
|
||||
|
||||
describe("migrate with both ids", () => {
|
||||
beforeEach(() => {
|
||||
helper = mockMigrationHelper(exampleJSON(), 32);
|
||||
sut = new AppIdMigrator(32, 33);
|
||||
});
|
||||
|
||||
it("removes appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).toHaveBeenCalledWith("appId", null);
|
||||
});
|
||||
|
||||
it("removes anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).toHaveBeenCalledWith("anonymousAppId", null);
|
||||
});
|
||||
|
||||
it("sets appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).toHaveBeenCalledWith(APP_ID_KEY, "appId");
|
||||
});
|
||||
|
||||
it("sets anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).toHaveBeenCalledWith(ANONYMOUS_APP_ID_KEY, "anonymousAppId");
|
||||
});
|
||||
});
|
||||
|
||||
describe("migrate with missing appId", () => {
|
||||
beforeEach(() => {
|
||||
helper = mockMigrationHelper(missingAppIdJSON(), 32);
|
||||
sut = new AppIdMigrator(32, 33);
|
||||
});
|
||||
|
||||
it("does not set appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("removes anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).toHaveBeenCalledWith("anonymousAppId", null);
|
||||
});
|
||||
|
||||
it("does not set appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("sets anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).toHaveBeenCalledWith(ANONYMOUS_APP_ID_KEY, "anonymousAppId");
|
||||
});
|
||||
});
|
||||
|
||||
describe("migrate with missing anonymousAppId", () => {
|
||||
beforeEach(() => {
|
||||
helper = mockMigrationHelper(missingAnonymousAppIdJSON(), 32);
|
||||
sut = new AppIdMigrator(32, 33);
|
||||
});
|
||||
|
||||
it("sets appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).toHaveBeenCalledWith(APP_ID_KEY, "appId");
|
||||
});
|
||||
|
||||
it("does not set anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(ANONYMOUS_APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("removes appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).toHaveBeenCalledWith("appId", null);
|
||||
});
|
||||
|
||||
it("does not remove anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).not.toHaveBeenCalledWith("anonymousAppId", any());
|
||||
});
|
||||
});
|
||||
|
||||
describe("migrate with missing appId and anonymousAppId", () => {
|
||||
beforeEach(() => {
|
||||
helper = mockMigrationHelper(missingBothJSON(), 32);
|
||||
sut = new AppIdMigrator(32, 33);
|
||||
});
|
||||
|
||||
it("does not set appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("does not set anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(ANONYMOUS_APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("does not remove appId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).not.toHaveBeenCalledWith("appId", any());
|
||||
});
|
||||
|
||||
it("does not remove anonymousAppId", async () => {
|
||||
await sut.migrate(helper);
|
||||
expect(helper.set).not.toHaveBeenCalledWith("anonymousAppId", any());
|
||||
});
|
||||
});
|
||||
|
||||
describe("rollback with both Ids", () => {
|
||||
beforeEach(() => {
|
||||
helper = mockMigrationHelper(rollbackJSON(), 33);
|
||||
sut = new AppIdMigrator(32, 33);
|
||||
});
|
||||
|
||||
it("removes appId", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.setToGlobal).toHaveBeenCalledWith(APP_ID_KEY, null);
|
||||
});
|
||||
|
||||
it("sets appId", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.set).toHaveBeenCalledWith("appId", "appId");
|
||||
});
|
||||
|
||||
it("removes anonymousAppId", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.setToGlobal).toHaveBeenCalledWith(ANONYMOUS_APP_ID_KEY, null);
|
||||
});
|
||||
|
||||
it("sets anonymousAppId", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.set).toHaveBeenCalledWith("anonymousAppId", "anonymousAppId");
|
||||
});
|
||||
});
|
||||
|
||||
describe("rollback missing both Ids", () => {
|
||||
beforeEach(() => {
|
||||
helper = mockMigrationHelper(missingBothJSON(), 33);
|
||||
sut = new AppIdMigrator(32, 33);
|
||||
});
|
||||
|
||||
it("does not set appId for providers", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("does not set anonymousAppId for providers", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.setToGlobal).not.toHaveBeenCalledWith(ANONYMOUS_APP_ID_KEY, any());
|
||||
});
|
||||
|
||||
it("does not revert appId", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.set).not.toHaveBeenCalledWith("appId", any());
|
||||
});
|
||||
|
||||
it("does not revert anonymousAppId", async () => {
|
||||
await sut.rollback(helper);
|
||||
expect(helper.set).not.toHaveBeenCalledWith("anonymousAppId", any());
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,46 @@
|
||||
import { KeyDefinitionLike, MigrationHelper } from "../migration-helper";
|
||||
import { Migrator } from "../migrator";
|
||||
|
||||
export const APP_ID_STORAGE_KEY = "appId";
|
||||
export const ANONYMOUS_APP_ID_STORAGE_KEY = "anonymousAppId";
|
||||
|
||||
export const APP_ID_KEY: KeyDefinitionLike = {
|
||||
key: APP_ID_STORAGE_KEY,
|
||||
stateDefinition: { name: "applicationId" },
|
||||
};
|
||||
|
||||
export const ANONYMOUS_APP_ID_KEY: KeyDefinitionLike = {
|
||||
key: ANONYMOUS_APP_ID_STORAGE_KEY,
|
||||
stateDefinition: { name: "applicationId" },
|
||||
};
|
||||
|
||||
export class AppIdMigrator extends Migrator<32, 33> {
|
||||
async migrate(helper: MigrationHelper): Promise<void> {
|
||||
const appId = await helper.get<string>(APP_ID_STORAGE_KEY);
|
||||
const anonymousAppId = await helper.get<string>(ANONYMOUS_APP_ID_STORAGE_KEY);
|
||||
|
||||
if (appId != null) {
|
||||
await helper.setToGlobal(APP_ID_KEY, appId);
|
||||
await helper.set(APP_ID_STORAGE_KEY, null);
|
||||
}
|
||||
|
||||
if (anonymousAppId != null) {
|
||||
await helper.setToGlobal(ANONYMOUS_APP_ID_KEY, anonymousAppId);
|
||||
await helper.set(ANONYMOUS_APP_ID_STORAGE_KEY, null);
|
||||
}
|
||||
}
|
||||
|
||||
async rollback(helper: MigrationHelper): Promise<void> {
|
||||
const appId = await helper.getFromGlobal<string>(APP_ID_KEY);
|
||||
const anonymousAppId = await helper.getFromGlobal<string>(ANONYMOUS_APP_ID_KEY);
|
||||
|
||||
if (appId != null) {
|
||||
await helper.set(APP_ID_STORAGE_KEY, appId);
|
||||
await helper.setToGlobal(APP_ID_KEY, null);
|
||||
}
|
||||
if (anonymousAppId != null) {
|
||||
await helper.set(ANONYMOUS_APP_ID_STORAGE_KEY, anonymousAppId);
|
||||
await helper.setToGlobal(ANONYMOUS_APP_ID_KEY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user