After asking for an update, a newer version coming out made the Licence page claim the newer version was requested, with no way to ask for it. Now it shows the version asked for, that a newer one is out, and "Ask for X instead"; the banner shows again. Hub 1.5.0 moves the open request on (`changed`); with an older Hub the site withdraws and asks again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
3.3 KiB
JavaScript
68 lines
3.3 KiB
JavaScript
// Asking for an update again after a newer version came out: the request moves on to it — on the
|
|
// Hub itself (1.5.0, `changed`), or by withdrawing and asking again with an older Hub.
|
|
const mockSettings = new Map();
|
|
jest.mock('../src/config/db', () => ({
|
|
appSetting: {
|
|
findMany: jest.fn(async ({ where }) => [...mockSettings].filter(([key]) => where.key.in.includes(key)).map(([key, value]) => ({ key, value }))),
|
|
upsert: jest.fn(async ({ where, create }) => { mockSettings.set(where.key, create.value); }),
|
|
deleteMany: jest.fn(async ({ where }) => { mockSettings.delete(where.key); }),
|
|
},
|
|
}));
|
|
jest.mock('../src/hub/report', () => ({ APP_VERSION: '1.46.2' }));
|
|
|
|
const { encrypt } = require('../src/utils/encryption');
|
|
const hub = require('../src/hub/client');
|
|
|
|
const reply = (status, body) => ({ ok: status < 400, status, json: async () => body });
|
|
|
|
describe('changing an update request', () => {
|
|
let calls;
|
|
beforeEach(() => {
|
|
mockSettings.clear();
|
|
mockSettings.set('hub_install_id', 'install-1');
|
|
mockSettings.set('hub_install_secret', encrypt('secret'));
|
|
mockSettings.set('hub_update_requested_at', '2026-10-20T09:00:00.000Z');
|
|
mockSettings.set('hub_update_requested_version', '1.47.0');
|
|
calls = [];
|
|
});
|
|
afterEach(() => { delete global.fetch; });
|
|
|
|
test('Hub 1.5.0 moves the open request on to the latest version', async () => {
|
|
global.fetch = jest.fn(async url => {
|
|
calls.push(new URL(url).pathname);
|
|
return reply(200, { requestedAt: '2026-10-28T09:00:00.000Z', version: '1.47.3', alreadyRequested: true, changed: true, previousVersion: '1.47.0' });
|
|
});
|
|
const out = await hub.requestUpdate();
|
|
expect(calls).toEqual(['/api/installs/update-request']);
|
|
expect(out).toMatchObject({ version: '1.47.3', changed: true, previousVersion: '1.47.0' });
|
|
expect(mockSettings.get('hub_update_requested_version')).toBe('1.47.3');
|
|
expect(mockSettings.get('hub_update_requested_at')).toBe('2026-10-28T09:00:00.000Z');
|
|
});
|
|
|
|
test('an older Hub (no `changed`): the old request is withdrawn and made again', async () => {
|
|
let open = true;
|
|
global.fetch = jest.fn(async url => {
|
|
const path = new URL(url).pathname;
|
|
calls.push(path);
|
|
if (path.endsWith('/cancel')) { open = false; return reply(200, { cancelled: true }); }
|
|
return open
|
|
? reply(200, { requestedAt: '2026-10-20T09:00:00.000Z', version: '1.47.3', alreadyRequested: true })
|
|
: reply(201, { requestedAt: '2026-10-28T09:00:00.000Z', version: '1.47.3', alreadyRequested: false });
|
|
});
|
|
const out = await hub.requestUpdate();
|
|
expect(calls).toEqual(['/api/installs/update-request', '/api/installs/update-request/cancel', '/api/installs/update-request']);
|
|
expect(out).toMatchObject({ version: '1.47.3', changed: true, previousVersion: '1.47.0' });
|
|
expect(mockSettings.get('hub_update_requested_version')).toBe('1.47.3');
|
|
});
|
|
|
|
test('asking again for the version already asked for changes nothing', async () => {
|
|
mockSettings.set('hub_update_requested_version', '1.47.3');
|
|
global.fetch = jest.fn(async url => {
|
|
calls.push(new URL(url).pathname);
|
|
return reply(200, { requestedAt: '2026-10-20T09:00:00.000Z', version: '1.47.3', alreadyRequested: true });
|
|
});
|
|
await hub.requestUpdate();
|
|
expect(calls).toEqual(['/api/installs/update-request']);
|
|
});
|
|
});
|