Files
BetterDesk/web-nodejs/tests/commercializationClockDocker.test.js
T
UNITRONIX e1bd92a7e4 fix(docker): hot-reload billing clock settings in split deployments
Persist panel-managed NTP settings in the Go server database and apply them without requiring systemd or host Docker access in split image deployments. Keep native restart behavior and make failed restart transactions dismissible in the UI.

Refs #431

Thanks: INSOLVE (Honorary); Marco Jakobs (@jacotec); MyNameisStitch (@MyNameisStitch); Redspin (@playerumpknow)
2026-09-20 17:26:32 +02:00

83 lines
2.6 KiB
JavaScript

'use strict';
const request = require('supertest');
const { createTestApp, withAuth } = require('./helpers');
const mockGetRuntimeClockSettings = jest.fn().mockResolvedValue({
ntp_servers: 'pool.ntp.org',
max_skew_ms: 2000,
require_synced_clock: true,
trust_os_ntp: true,
});
const mockSaveClockSettings = jest.fn().mockResolvedValue({
settings: {
ntp_servers: 'time.example.com',
max_skew_ms: 3500,
require_synced_clock: false,
trust_os_ntp: false,
},
status: { synced: true },
restart: null,
dockerMode: true,
});
const mockRegisterChange = jest.fn();
const mockDismissFailed = jest.fn();
jest.mock('../services/database', () => ({
logAction: jest.fn().mockResolvedValue(undefined),
}));
jest.mock('../services/betterdeskApi', () => ({
apiClient: {},
}));
jest.mock('../services/billingClockConfigService', () => ({
getRuntimeClockSettings: mockGetRuntimeClockSettings,
saveClockSettings: mockSaveClockSettings,
}));
jest.mock('../services/restartCoordinator', () => ({
registerChange: mockRegisterChange,
dismissFailed: mockDismissFailed,
}));
jest.mock('../lib/goApiProxy', () => ({
proxyToGo: jest.fn(),
proxyBinaryToGo: jest.fn(),
safeSegment: (value) => value,
}));
jest.mock('../services/helpRequestEmailService', () => ({
parseCommercializationEmailConfig: () => ({}),
CONFIG_KEY: 'commercialization_email_config',
}));
jest.mock('../lib/smtpSettingsHandlers', () => ({
getSmtpSettings: jest.fn(),
}));
const commercializationRoutes = require('../routes/commercialization.routes');
describe('commercialization Docker clock settings', () => {
beforeEach(() => {
mockGetRuntimeClockSettings.mockClear();
mockSaveClockSettings.mockClear();
mockRegisterChange.mockClear();
mockDismissFailed.mockClear();
});
test('saves through the Go runtime path without registering a native restart', async () => {
const app = createTestApp();
withAuth(app, { role: 'server_admin' });
app.use(commercializationRoutes);
const response = await request(app)
.put('/api/panel/billing/clock/settings')
.send({
ntp_servers: 'time.example.com',
max_skew_ms: 3500,
require_synced_clock: false,
trust_os_ntp: false,
});
expect(response.status).toBe(200);
expect(response.body.dockerMode).toBe(true);
expect(response.body.restartRequired).toBeNull();
expect(mockRegisterChange).not.toHaveBeenCalled();
});
});