|
| 1 | +import { createMockEl } from '@test/helpers/mock-element'; |
| 2 | + |
| 3 | +import { QoderianSettingsModal } from '@/features/settings/settings-modal'; |
| 4 | + |
| 5 | +let lastModalInstance: any; |
| 6 | +const mockSettingsTab = { |
| 7 | + mount: jest.fn(), |
| 8 | + hide: jest.fn(), |
| 9 | +}; |
| 10 | + |
| 11 | +jest.mock('obsidian', () => { |
| 12 | + const actual = jest.requireActual('obsidian'); |
| 13 | + |
| 14 | + class MockModal { |
| 15 | + app: any; |
| 16 | + modalEl: any = { addClass: jest.fn() }; |
| 17 | + titleEl: any = { setText: jest.fn() }; |
| 18 | + contentEl: any = createMockEl(); |
| 19 | + |
| 20 | + constructor(app: any) { |
| 21 | + this.app = app; |
| 22 | + // eslint-disable-next-line @typescript-eslint/no-this-alias |
| 23 | + lastModalInstance = this; |
| 24 | + } |
| 25 | + |
| 26 | + open() { |
| 27 | + this.onOpen(); |
| 28 | + } |
| 29 | + |
| 30 | + close() { |
| 31 | + this.onClose(); |
| 32 | + } |
| 33 | + |
| 34 | + onOpen() { |
| 35 | + // Overridden by subclass |
| 36 | + } |
| 37 | + |
| 38 | + onClose() { |
| 39 | + // Overridden by subclass |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + return { ...actual, Modal: MockModal }; |
| 44 | +}); |
| 45 | + |
| 46 | +jest.mock('@/features/settings/settings-tab', () => ({ |
| 47 | + QoderianSettingTab: jest.fn().mockImplementation(() => mockSettingsTab), |
| 48 | +})); |
| 49 | + |
| 50 | +describe('QoderianSettingsModal', () => { |
| 51 | + beforeEach(() => { |
| 52 | + mockSettingsTab.mount.mockClear(); |
| 53 | + mockSettingsTab.hide.mockClear(); |
| 54 | + }); |
| 55 | + |
| 56 | + it('renders the settings tab inside the settings window', () => { |
| 57 | + new QoderianSettingsModal({ app: {} } as any).open(); |
| 58 | + |
| 59 | + expect(lastModalInstance.modalEl.addClass).toHaveBeenCalledWith('qoderian-settings-modal'); |
| 60 | + expect(lastModalInstance.titleEl.setText).toHaveBeenCalledWith('Qoderian Settings'); |
| 61 | + expect(mockSettingsTab.mount).toHaveBeenCalledWith(lastModalInstance.contentEl); |
| 62 | + }); |
| 63 | + |
| 64 | + it('detaches the settings tab when the window closes', () => { |
| 65 | + const modal = new QoderianSettingsModal({ app: {} } as any); |
| 66 | + modal.open(); |
| 67 | + const emptySpy = jest.spyOn(modal.contentEl, 'empty'); |
| 68 | + |
| 69 | + modal.close(); |
| 70 | + |
| 71 | + expect(mockSettingsTab.hide).toHaveBeenCalledTimes(1); |
| 72 | + expect(emptySpy).toHaveBeenCalledTimes(1); |
| 73 | + }); |
| 74 | +}); |
0 commit comments