fix: remove Android self-install updater (#1125)

* fix: remove Android self-install updater

* fix: open Android updates in native browser
This commit is contained in:
Tommaso Casaburi
2026-05-06 17:56:00 +07:00
committed by GitHub
parent 7c028c1f36
commit aaa0d88d6a
14 changed files with 108 additions and 586 deletions
+50 -38
View File
@@ -1,11 +1,12 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
const testState = vi.hoisted(() => ({
androidDownloadAndInstallUpdateMock: vi.fn(),
capacitorPlatform: 'web',
browserOpenMock: vi.fn(),
electronDownloadAndInstallUpdateMock: vi.fn(),
electronGetPlatformMock: vi.fn(),
fetchMock: vi.fn(),
openMock: vi.fn(),
}));
vi.mock('@capacitor/core', () => ({
@@ -14,9 +15,9 @@ vi.mock('@capacitor/core', () => ({
},
}));
vi.mock('../../plugins/app-updater', () => ({
default: {
downloadAndInstallUpdate: (options: unknown) => testState.androidDownloadAndInstallUpdateMock(options),
vi.mock('@capacitor/browser', () => ({
Browser: {
open: (options: unknown) => testState.browserOpenMock(options),
},
}));
@@ -38,13 +39,16 @@ const loadModule = async () => {
describe('app-update', () => {
beforeEach(() => {
vi.clearAllMocks();
testState.androidDownloadAndInstallUpdateMock.mockReset();
testState.capacitorPlatform = 'web';
testState.browserOpenMock.mockReset();
testState.electronDownloadAndInstallUpdateMock.mockReset();
testState.electronGetPlatformMock.mockReset();
testState.fetchMock.mockReset();
testState.openMock.mockReset();
testState.openMock.mockReturnValue({ closed: false });
vi.stubEnv('VITE_APP_VERSION', '0.8.1');
vi.stubGlobal('fetch', testState.fetchMock);
vi.stubGlobal('open', testState.openMock);
window.electronApi = undefined;
Object.defineProperty(navigator, 'serviceWorker', {
configurable: true,
@@ -103,14 +107,13 @@ describe('app-update', () => {
applyAvailableAppUpdate({
runtime: 'android',
targetVersion: '9.9.9',
assetName: '5chan-9.9.9.apk',
downloadUrl: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9.apk',
releaseUrl: 'https://github.com/bitsocialnet/5chan/releases/tag/v9.9.9',
}),
).rejects.toThrow('App updates are disabled for this build');
expect(isAppUpdateEnabled).toBe(false);
expect(testState.fetchMock).not.toHaveBeenCalled();
expect(testState.androidDownloadAndInstallUpdateMock).not.toHaveBeenCalled();
expect(testState.browserOpenMock).not.toHaveBeenCalled();
expect(testState.openMock).not.toHaveBeenCalled();
});
it('selects the matching electron release asset for the current desktop platform', async () => {
@@ -267,17 +270,12 @@ describe('app-update', () => {
expect(result).toBeNull();
});
it('selects the latest android apk release asset', async () => {
it('resolves Android updates to the GitHub release page', async () => {
testState.capacitorPlatform = 'android';
testState.fetchMock.mockResolvedValueOnce(
createFetchResponse({
tag_name: 'v9.9.9',
assets: [
{
name: '5chan-9.9.9.apk',
browser_download_url: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9.apk',
},
],
assets: [],
}),
);
@@ -287,23 +285,32 @@ describe('app-update', () => {
expect(result).toEqual({
runtime: 'android',
targetVersion: '9.9.9',
assetName: '5chan-9.9.9.apk',
downloadUrl: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9.apk',
releaseUrl: 'https://github.com/bitsocialnet/5chan/releases/tag/v9.9.9',
});
});
it('accepts configured local test asset hosts for native e2e builds', async () => {
vi.stubEnv('VITE_APP_UPDATE_ALLOWED_DOWNLOAD_HOSTS', '10.0.2.2');
testState.capacitorPlatform = 'android';
it('accepts configured local test asset hosts for desktop e2e builds', async () => {
vi.stubEnv('VITE_APP_UPDATE_ALLOWED_DOWNLOAD_HOSTS', '127.0.0.1');
window.electronApi = {
isElectron: true,
getPlatform: () => testState.electronGetPlatformMock(),
downloadAndInstallUpdate: (options) => testState.electronDownloadAndInstallUpdateMock(options),
copyToClipboard: vi.fn(),
automateUploadMedia: vi.fn(),
} as Window['electronApi'];
testState.electronGetPlatformMock.mockResolvedValue({
platform: 'linux',
arch: 'x64',
version: 'v20.0.0',
});
testState.fetchMock.mockResolvedValueOnce(
createFetchResponse({
tag_name: 'v9.9.9',
html_url: 'http://10.0.2.2:4010/releases/v9.9.9',
html_url: 'http://127.0.0.1:4010/releases/v9.9.9',
assets: [
{
name: '5chan-9.9.9.apk',
browser_download_url: 'http://10.0.2.2:4010/assets/5chan-9.9.9.apk',
name: '5chan-9.9.9-x64.AppImage',
browser_download_url: 'http://127.0.0.1:4010/assets/5chan-9.9.9-x64.AppImage',
},
],
}),
@@ -313,11 +320,11 @@ describe('app-update', () => {
const result = await resolveAvailableAppUpdate();
expect(result).toEqual({
runtime: 'android',
runtime: 'electron',
targetVersion: '9.9.9',
assetName: '5chan-9.9.9.apk',
downloadUrl: 'http://10.0.2.2:4010/assets/5chan-9.9.9.apk',
releaseUrl: 'http://10.0.2.2:4010/releases/v9.9.9',
assetName: '5chan-9.9.9-x64.AppImage',
downloadUrl: 'http://127.0.0.1:4010/assets/5chan-9.9.9-x64.AppImage',
releaseUrl: 'http://127.0.0.1:4010/releases/v9.9.9',
});
});
@@ -341,7 +348,7 @@ describe('app-update', () => {
expect(reloadMock).toHaveBeenCalledTimes(1);
});
it('routes native update installs through the matching platform bridge', async () => {
it('routes desktop update installs through the electron platform bridge', async () => {
window.electronApi = {
isElectron: true,
getPlatform: () => testState.electronGetPlatformMock(),
@@ -358,21 +365,26 @@ describe('app-update', () => {
downloadUrl: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9-x64.Setup.exe',
releaseUrl: 'https://github.com/bitsocialnet/5chan/releases/tag/v9.9.9',
});
await applyAvailableAppUpdate({
runtime: 'android',
targetVersion: '9.9.9',
assetName: '5chan-9.9.9.apk',
downloadUrl: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9.apk',
releaseUrl: 'https://github.com/bitsocialnet/5chan/releases/tag/v9.9.9',
});
expect(testState.electronDownloadAndInstallUpdateMock).toHaveBeenCalledWith({
url: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9-x64.Setup.exe',
fileName: '5chan-9.9.9-x64.Setup.exe',
});
expect(testState.androidDownloadAndInstallUpdateMock).toHaveBeenCalledWith({
url: 'https://github.com/bitsocialnet/5chan/releases/download/v9.9.9/5chan-9.9.9.apk',
fileName: '5chan-9.9.9.apk',
expect(testState.browserOpenMock).not.toHaveBeenCalled();
expect(testState.openMock).not.toHaveBeenCalled();
});
it('opens the GitHub release page when applying an Android update', async () => {
const { applyAvailableAppUpdate } = await loadModule();
await applyAvailableAppUpdate({
runtime: 'android',
targetVersion: '9.9.9',
releaseUrl: 'https://github.com/bitsocialnet/5chan/releases/tag/v9.9.9',
});
expect(testState.browserOpenMock).toHaveBeenCalledWith({
url: 'https://github.com/bitsocialnet/5chan/releases/tag/v9.9.9',
});
expect(testState.openMock).not.toHaveBeenCalled();
});
});