1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Switch to using release channel of installed application version as default value for selected update channel

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-05-20 09:56:11 +03:00
parent e32d9a9e7a
commit eb8d316eea
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
4 changed files with 126 additions and 25 deletions

View File

@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`installing update from update channels when started renders 1`] = ` exports[`installing update from update channels given no update channel selection is stored, when started renders 1`] = `
<body> <body>
<div> <div>
<div <div
@ -10,7 +10,7 @@ exports[`installing update from update channels when started renders 1`] = `
</body> </body>
`; `;
exports[`installing update from update channels when started when user checks for updates renders 1`] = ` exports[`installing update from update channels given no update channel selection is stored, when started when user checks for updates renders 1`] = `
<body> <body>
<div> <div>
<div <div
@ -20,7 +20,7 @@ exports[`installing update from update channels when started when user checks fo
</body> </body>
`; `;
exports[`installing update from update channels when started when user checks for updates when new update is discovered renders 1`] = ` exports[`installing update from update channels given no update channel selection is stored, when started when user checks for updates when new update is discovered renders 1`] = `
<body> <body>
<div> <div>
<div <div
@ -30,7 +30,7 @@ exports[`installing update from update channels when started when user checks fo
</body> </body>
`; `;
exports[`installing update from update channels when started when user checks for updates when new update is discovered when download succeeds renders 1`] = ` exports[`installing update from update channels given no update channel selection is stored, when started when user checks for updates when new update is discovered when download succeeds renders 1`] = `
<body> <body>
<div> <div>
<div <div

View File

@ -23,6 +23,8 @@ import type { AskBoolean } from "../../main/ask-boolean/ask-boolean.injectable";
import askBooleanInjectable from "../../main/ask-boolean/ask-boolean.injectable"; import askBooleanInjectable from "../../main/ask-boolean/ask-boolean.injectable";
import showInfoNotificationInjectable from "../../renderer/components/notifications/show-info-notification.injectable"; import showInfoNotificationInjectable from "../../renderer/components/notifications/show-info-notification.injectable";
import checkForUpdatesInjectable from "../../main/update-app/check-for-updates/check-for-updates.injectable"; import checkForUpdatesInjectable from "../../main/update-app/check-for-updates/check-for-updates.injectable";
import appVersionInjectable
from "../../common/get-configuration-file-model/app-version/app-version.injectable";
describe("installing update from update channels", () => { describe("installing update from update channels", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -69,7 +71,7 @@ describe("installing update from update channels", () => {
}); });
}); });
describe("when started", () => { describe("given no update channel selection is stored, when started", () => {
let rendered: RenderResult; let rendered: RenderResult;
let checkForUpdates: () => Promise<void>; let checkForUpdates: () => Promise<void>;
@ -299,4 +301,88 @@ describe("installing update from update channels", () => {
}); });
}); });
}); });
it("given valid update channel selection is stored, when checking for updates, checks for updates from the update channel", async () => {
applicationBuilder.beforeApplicationStart(({ mainDi }) => {
// TODO: Switch to more natural way of setting initial value
// TODO: UserStore is currently responsible for getting and setting initial value
const selectedUpdateChannel = mainDi.inject(selectedUpdateChannelInjectable);
selectedUpdateChannel.setValue(updateChannels.beta.id);
});
await applicationBuilder.render();
const checkForUpdates = applicationBuilder.dis.mainDi.inject(checkForUpdatesInjectable);
checkForUpdates();
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object));
});
it("given invalid update channel selection is stored, when checking for updates, checks for updates from the update channel", async () => {
applicationBuilder.beforeApplicationStart(({ mainDi }) => {
// TODO: Switch to more natural way of setting initial value
// TODO: UserStore is currently responsible for getting and setting initial value
const selectedUpdateChannel = mainDi.inject(selectedUpdateChannelInjectable);
selectedUpdateChannel.setValue("something-invalid" as UpdateChannelId);
});
await applicationBuilder.render();
const checkForUpdates = applicationBuilder.dis.mainDi.inject(checkForUpdatesInjectable);
checkForUpdates();
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.latest, expect.any(Object));
});
it('given no update channel selection is stored and currently using alpha release, when checking for updates, checks for updates from "alpha" channel', async () => {
applicationBuilder.beforeApplicationStart(({ mainDi }) => {
mainDi.override(appVersionInjectable, () => "1.0.0-alpha");
});
await applicationBuilder.render();
const checkForUpdates = applicationBuilder.dis.mainDi.inject(checkForUpdatesInjectable);
checkForUpdates();
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.alpha, expect.any(Object));
});
it('given no update channel selection is stored and currently using beta release, when checking for updates, checks for updates from "beta" channel', async () => {
applicationBuilder.beforeApplicationStart(({ mainDi }) => {
mainDi.override(appVersionInjectable, () => "1.0.0-beta");
});
await applicationBuilder.render();
const checkForUpdates = applicationBuilder.dis.mainDi.inject(checkForUpdatesInjectable);
checkForUpdates();
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object));
});
it("given update channel selection is stored and currently using prerelease, when checking for updates, checks for updates from stored channel", async () => {
applicationBuilder.beforeApplicationStart(({ mainDi }) => {
mainDi.override(appVersionInjectable, () => "1.0.0-alpha");
// TODO: Switch to more natural way of setting initial value
// TODO: UserStore is currently responsible for getting and setting initial value
const selectedUpdateChannel = mainDi.inject(selectedUpdateChannelInjectable);
selectedUpdateChannel.setValue(updateChannels.beta.id);
});
await applicationBuilder.render();
const checkForUpdates = applicationBuilder.dis.mainDi.inject(checkForUpdatesInjectable);
checkForUpdates();
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object));
});
}); });

View File

@ -0,0 +1,27 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { SemVer } from "semver";
import appVersionInjectable from "../../get-configuration-file-model/app-version/app-version.injectable";
import type { UpdateChannelId } from "../update-channels";
import { updateChannels } from "../update-channels";
const defaultUpdateChannelInjectable = getInjectable({
id: "default-update-channel",
instantiate: (di) => {
const appVersion = di.inject(appVersionInjectable);
const currentReleaseChannel = new SemVer(appVersion).prerelease[0]?.toString() as UpdateChannelId;
if (currentReleaseChannel && updateChannels[currentReleaseChannel]) {
return updateChannels[currentReleaseChannel];
}
return updateChannels.latest;
},
});
export default defaultUpdateChannelInjectable;

View File

@ -7,40 +7,28 @@ import type { IComputedValue } from "mobx";
import { action, computed, observable } from "mobx"; import { action, computed, observable } from "mobx";
import type { UpdateChannel, UpdateChannelId } from "../update-channels"; import type { UpdateChannel, UpdateChannelId } from "../update-channels";
import { updateChannels } from "../update-channels"; import { updateChannels } from "../update-channels";
import defaultUpdateChannelInjectable from "./default-update-channel.injectable";
export interface SelectedUpdateChannel { export interface SelectedUpdateChannel {
value: IComputedValue<UpdateChannel>; value: IComputedValue<UpdateChannel>;
setValue: (channelId?: UpdateChannelId) => void; setValue: (channelId?: UpdateChannelId) => void;
} }
// export const defaultUpdateChannel = new SemVer(getAppVersion()).prerelease[0]?.toString() || "latest";
// const updateChannel: PreferenceDescription<string> = {
// fromStore(val) {
// return !val || !updateChannels.has(val)
// ? defaultUpdateChannel
// : val;
// },
// toStore(val) {
// if (!updateChannels.has(val) || val === defaultUpdateChannel) {
// return undefined;
// }
//
// return val;
// },
// };
const selectedUpdateChannelInjectable = getInjectable({ const selectedUpdateChannelInjectable = getInjectable({
id: "selected-update-channel", id: "selected-update-channel",
instantiate: (): SelectedUpdateChannel => { instantiate: (di): SelectedUpdateChannel => {
const state = observable.box(updateChannels.latest); const defaultUpdateChannel = di.inject(defaultUpdateChannelInjectable);
const state = observable.box(defaultUpdateChannel);
return { return {
value: computed(() => state.get()), value: computed(() => state.get()),
setValue: action((channelId) => { setValue: action((channelId) => {
const targetUpdateChannel = channelId ? updateChannels[channelId] : updateChannels.latest; const targetUpdateChannel =
channelId && updateChannels[channelId]
? updateChannels[channelId]
: defaultUpdateChannel;
state.set(targetUpdateChannel); state.set(targetUpdateChannel);
}), }),