mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-09-21 03:01:27 -03:00
feat(frontend): opt-in Other Models toggles, hidden nav and announcement
- The Other nav entry is hidden while the feature is off (nav-item--hidden, toggled client-side after enabling) and now uses the fa-shapes icon. - Shared utils/otherModels.js helpers (enable through the settings API, open the settings Library section) are reused by the disabled page, the announcement banner and the download modal. - BannerService registers a one-time dismissible "other-models-announcement" banner while the feature is off; SettingsManager drops the banner and updates the nav when the master switch flips. - A disabled download routing answer now surfaces a showActionToast with an "Enable Other Models" action. - Settings UI: master toggle + five sub_type checkboxes whose default-root selects are disabled when unchecked; i18n keys added to en.json and synced (other locales keep TODO placeholders).
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
||||
|
||||
const initializeAppMock = vi.fn();
|
||||
const showToastMock = vi.fn();
|
||||
|
||||
vi.mock('../../../static/js/core.js', () => ({
|
||||
appCore: {
|
||||
initialize: initializeAppMock,
|
||||
},
|
||||
}));
|
||||
|
||||
vi.mock('../../../static/js/utils/uiHelpers.js', () => ({
|
||||
showToast: showToastMock,
|
||||
}));
|
||||
|
||||
describe('Other Models disabled page', () => {
|
||||
const originalLocation = window.location;
|
||||
let enableOtherModels;
|
||||
let initializeOtherDisabledPage;
|
||||
|
||||
beforeEach(async () => {
|
||||
vi.resetModules();
|
||||
vi.clearAllMocks();
|
||||
initializeAppMock.mockResolvedValue(undefined);
|
||||
document.body.innerHTML = '<button id="enableOtherModelsBtn"></button>';
|
||||
|
||||
Object.defineProperty(window, 'location', {
|
||||
value: { ...originalLocation, reload: vi.fn() },
|
||||
configurable: true,
|
||||
writable: true,
|
||||
});
|
||||
|
||||
({ enableOtherModels, initializeOtherDisabledPage } = await import(
|
||||
'../../../static/js/other_disabled.js'
|
||||
));
|
||||
await initializeOtherDisabledPage();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
Object.defineProperty(window, 'location', {
|
||||
value: originalLocation,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
});
|
||||
delete global.fetch;
|
||||
});
|
||||
|
||||
it('boots the shared app core so the header stays usable', () => {
|
||||
expect(initializeAppMock).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('enables Other Models through the settings API and reloads', async () => {
|
||||
global.fetch = vi.fn().mockResolvedValue({
|
||||
ok: true,
|
||||
json: async () => ({ success: true }),
|
||||
});
|
||||
|
||||
await enableOtherModels();
|
||||
|
||||
expect(global.fetch).toHaveBeenCalledWith(
|
||||
'/api/lm/settings',
|
||||
expect.objectContaining({ method: 'POST' }),
|
||||
);
|
||||
expect(JSON.parse(global.fetch.mock.calls[0][1].body)).toEqual({
|
||||
enable_other_models: true,
|
||||
});
|
||||
expect(window.location.reload).toHaveBeenCalledTimes(1);
|
||||
expect(showToastMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('re-enables the button and toasts when enabling fails', async () => {
|
||||
global.fetch = vi.fn().mockResolvedValue({
|
||||
ok: false,
|
||||
status: 500,
|
||||
json: async () => ({ success: false, error: 'boom' }),
|
||||
});
|
||||
|
||||
await enableOtherModels();
|
||||
|
||||
expect(window.location.reload).not.toHaveBeenCalled();
|
||||
expect(showToastMock).toHaveBeenCalledWith(
|
||||
'other.disabled.enableFailed',
|
||||
expect.objectContaining({ message: 'boom' }),
|
||||
'error',
|
||||
);
|
||||
expect(document.getElementById('enableOtherModelsBtn').disabled).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user