Files
makelore/tests/unit/plugin-marketplace-client.test.ts

51 lines
2.4 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import {
acquireMarketplacePlugin,
installMarketplacePlugin,
readMarketplaceCatalog,
removeMarketplacePlugin,
updateMarketplacePlugin,
} from '@/lib/plugin-marketplace';
const catalog = {
items: [], nextCursor: null, total: 0, catalogGeneration: 1,
etag: '"plugins-1-tp-none"', pricingVersionId: null, stale: false, fetchedAt: 1,
};
const library = { library: { items: [], total: 0, stale: false, fetchedAt: 1 }, installations: [] };
const installation = { status: 'installed', pluginId: 'makelore.notes', releaseId: 'release-1', version: '1.0.0' };
describe('Renderer plugin Marketplace client', () => {
it('uses only the bounded catalog query contract', async () => {
const fetcher = vi.fn().mockResolvedValue(catalog);
await expect(readMarketplaceCatalog({ query: 'notes', category: 'productivity', featured: true, limit: 24 }, fetcher)).resolves.toEqual(catalog);
expect(fetcher).toHaveBeenCalledWith('/api/coding/plugin-marketplace/catalog?query=notes&category=productivity&featured=true&limit=24');
});
it('keeps acquire, install, update, and remove as four independent requests', async () => {
const fetcher = vi.fn()
.mockResolvedValueOnce(library)
.mockResolvedValueOnce(installation)
.mockResolvedValueOnce(installation)
.mockResolvedValueOnce(library);
await acquireMarketplacePlugin('makelore.notes', fetcher);
await installMarketplacePlugin('makelore.notes', fetcher);
await updateMarketplacePlugin('makelore.notes', fetcher);
await removeMarketplacePlugin('makelore.notes', fetcher);
expect(fetcher.mock.calls).toEqual([
['/api/coding/plugin-marketplace/library/makelore.notes', { method: 'PUT', body: '{}' }],
['/api/coding/plugin-marketplace/install/makelore.notes', { method: 'POST', body: '{}' }],
['/api/coding/plugin-marketplace/update/makelore.notes', { method: 'POST', body: '{}' }],
['/api/coding/plugin-marketplace/library/makelore.notes', { method: 'DELETE', body: '{}' }],
]);
expect(JSON.stringify(fetcher.mock.calls)).not.toMatch(/account|admission|releaseId|path/i);
});
it('rejects invalid plugin identifiers before calling Main', async () => {
const fetcher = vi.fn();
await expect(acquireMarketplacePlugin('../escape', fetcher)).rejects.toThrow('plugin id');
expect(fetcher).not.toHaveBeenCalled();
});
});