Automerge backed Markdown editor for the Atmosphere
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657// src/plugin/__tests__/app-image-resolver.test.tsimport { describe, it, expect, vi } from 'vitest'import { App } from '../app'import { Vault } from '../vault'import { Workspace } from '../workspace'import { FileIndex } from '../../services/file-index'import { ImageResolver } from '../../services/image-resolver'
function createMockDocumentManager() { return { createFile: vi.fn(), createFolder: vi.fn(), readText: vi.fn(async (url: string) => ({ status: 'unavailable' as const, documentId: url })), updateContent: vi.fn(), // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any}
function makeApp(): App { const dm = createMockDocumentManager() const vault = new Vault('Test', new FileIndex(dm, 'automerge:root' as never), dm) const workspace = new Workspace(document.createElement('div')) return new App(vault, workspace)}
describe('App.reamsImageResolver', () => { it('exposes an ImageResolver instance', () => { const app = makeApp() expect(app.reamsImageResolver).toBeInstanceOf(ImageResolver) app.destroy() })
it('does NOT dispose the resolver during App.destroy() (StrictMode safety)', () => { // Why: under React StrictMode, App.destroy() is called between the // first cleanup and the second mount, but the App instance (and // therefore the reamsImageResolver) is preserved via useMemo. Disposing // the resolver here would revoke blob URLs AND unsubscribe from // Vault modify/delete/rename events, with no matching resubscribe // in App.reattach() — silently breaking cache invalidation for the // rest of the session. Pin that destroy() leaves the resolver // untouched so it remains functional for the next mount. const app = makeApp() const disposeSpy = vi.spyOn(app.reamsImageResolver, 'dispose') app.destroy() expect(disposeSpy).not.toHaveBeenCalled() })
it('reamsImageResolver remains functional after App.destroy()', async () => { // Direct behavioral check that complements the spy assertion above: // resolveImageUrl still works after destroy, returning null for an // unknown vault path (rather than throwing). const app = makeApp() app.destroy() await expect(app.reamsImageResolver.resolveImageUrl('does-not-exist.png')).resolves.toBeNull() })})