Files
hope-events/backend/tests/hubUpdateRequest.test.js
T
joshuaandClaude Opus 5.5 dd537a1a16 Fix: update request for an older version than the latest (1.47.4)
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>
2026-10-28 12:16:56 +02:00

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']);
});
});