feat(doctor): add system diagnostics feature

This commit is contained in:
Will Miao
2026-04-11 16:02:13 +08:00
parent 25fa175aa2
commit 1817142a7b
28 changed files with 2231 additions and 6 deletions

View File

@@ -50,6 +50,12 @@ vi.mock('../../../static/js/managers/HelpManager.js', () => ({
},
}));
vi.mock('../../../static/js/managers/DoctorManager.js', () => ({
doctorManager: {
initialize: vi.fn(),
},
}));
vi.mock('../../../static/js/managers/BannerService.js', () => ({
bannerService: {
initialize: vi.fn(),
@@ -103,6 +109,7 @@ import { moveManager } from '../../../static/js/managers/MoveManager.js';
import { bulkManager } from '../../../static/js/managers/BulkManager.js';
import { ExampleImagesManager } from '../../../static/js/managers/ExampleImagesManager.js';
import { helpManager } from '../../../static/js/managers/HelpManager.js';
import { doctorManager } from '../../../static/js/managers/DoctorManager.js';
import { bannerService } from '../../../static/js/managers/BannerService.js';
import { initTheme, initBackToTop } from '../../../static/js/utils/uiHelpers.js';
import { onboardingManager } from '../../../static/js/managers/OnboardingManager.js';
@@ -187,6 +194,7 @@ describe('AppCore initialization flow', () => {
delete window.helpManager;
delete window.moveManager;
delete window.bulkManager;
delete window.doctorManager;
delete window.headerManager;
delete window.i18n;
delete window.pageContextMenu;
@@ -214,6 +222,7 @@ describe('AppCore initialization flow', () => {
expect(bannerService.initialize).toHaveBeenCalledTimes(1);
expect(window.modalManager).toBe(modalManager);
expect(window.settingsManager).toBe(settingsManager);
expect(window.doctorManager).toBe(doctorManager);
expect(window.moveManager).toBe(moveManager);
expect(window.bulkManager).toBe(bulkManager);
expect(HeaderManager).toHaveBeenCalledTimes(1);
@@ -227,6 +236,7 @@ describe('AppCore initialization flow', () => {
expect(window.exampleImagesManager).toBe(exampleImagesManagerInstance);
expect(exampleImagesManagerInitialize).toHaveBeenCalledTimes(1);
expect(helpManager.initialize).toHaveBeenCalledTimes(1);
expect(doctorManager.initialize).toHaveBeenCalledTimes(1);
expect(document.body.classList.contains('hover-reveal')).toBe(true);
expect(initializeEventManagement).toHaveBeenCalledTimes(1);
expect(onboardingManager.start).not.toHaveBeenCalled();

View File

@@ -0,0 +1,56 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { mountMarkup, resetDom } from '../utils/domFixtures.js';
vi.mock('../../../static/js/managers/ModalManager.js', () => ({
modalManager: {
showModal: vi.fn(),
},
}));
vi.mock('../../../static/js/utils/uiHelpers.js', () => ({
showToast: vi.fn(),
}));
vi.mock('../../../static/js/utils/i18nHelpers.js', () => ({
translate: vi.fn((key, _params, fallback) => fallback || key),
}));
vi.mock('../../../static/js/components/shared/utils.js', () => ({
escapeHtml: vi.fn((value) => String(value)),
}));
import { DoctorManager } from '../../../static/js/managers/DoctorManager.js';
function renderDoctorFixture() {
mountMarkup(`
<button id="doctorTriggerBtn"></button>
<span id="doctorStatusBadge" class="hidden"></span>
<div id="doctorModal"></div>
<div id="doctorIssuesList"></div>
<div id="doctorSummaryText"></div>
<div id="doctorSummaryBadge"></div>
<div id="doctorLoadingState"></div>
<button id="doctorRefreshBtn"></button>
<button id="doctorExportBtn"></button>
`);
document.body.dataset.appVersion = '1.2.3-test';
}
describe('DoctorManager', () => {
beforeEach(() => {
resetDom();
vi.clearAllMocks();
delete window.__lmDoctorConsolePatched;
delete window.__lmDoctorConsoleEntries;
});
it('does not run diagnostics during initialize', () => {
renderDoctorFixture();
const manager = new DoctorManager();
const refreshSpy = vi.spyOn(manager, 'refreshDiagnostics').mockResolvedValue(undefined);
manager.initialize();
expect(refreshSpy).not.toHaveBeenCalled();
});
});