070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
69 lines
2.6 KiB
TypeScript
69 lines
2.6 KiB
TypeScript
// Plan §3.KK2 — summarisePluginEvents() pure roll-up.
|
|
|
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
import {
|
|
__resetPluginEventBufferForTests,
|
|
pluginEventSnapshot,
|
|
recordPluginEvent,
|
|
summarisePluginEvents,
|
|
} from '../src/plugins/events.js';
|
|
|
|
beforeEach(() => __resetPluginEventBufferForTests());
|
|
afterEach(() => __resetPluginEventBufferForTests());
|
|
|
|
describe('summarisePluginEvents', () => {
|
|
it('returns zero-shape for an empty list', () => {
|
|
const stats = summarisePluginEvents([]);
|
|
expect(stats.total).toBe(0);
|
|
expect(stats.byKind).toEqual({});
|
|
expect(stats.byPluginId).toEqual({});
|
|
expect(stats.oldestAt).toBeNull();
|
|
expect(stats.newestAt).toBeNull();
|
|
expect(stats.firstId).toBeNull();
|
|
expect(stats.lastId).toBeNull();
|
|
});
|
|
|
|
it('counts byKind across the buffer', () => {
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'a' });
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'b' });
|
|
recordPluginEvent({ kind: 'plugin.uninstalled', pluginId: 'a' });
|
|
const stats = summarisePluginEvents(pluginEventSnapshot());
|
|
expect(stats.byKind).toEqual({
|
|
'plugin.installed': 2,
|
|
'plugin.uninstalled': 1,
|
|
});
|
|
});
|
|
|
|
it('counts byPluginId, skipping empty plugin ids (e.g. marketplace events)', () => {
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'a' });
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'a' });
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'b' });
|
|
recordPluginEvent({ kind: 'plugin.marketplace-refreshed', pluginId: '' });
|
|
const stats = summarisePluginEvents(pluginEventSnapshot());
|
|
expect(stats.byPluginId).toEqual({ a: 2, b: 1 });
|
|
});
|
|
|
|
it('records oldestAt + newestAt + id range', () => {
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'a' });
|
|
recordPluginEvent({ kind: 'plugin.upgraded', pluginId: 'a' });
|
|
const stats = summarisePluginEvents(pluginEventSnapshot());
|
|
expect(stats.firstId).toBe(1);
|
|
expect(stats.lastId).toBe(2);
|
|
expect(stats.oldestAt).toBeLessThanOrEqual(stats.newestAt!);
|
|
expect(stats.total).toBe(2);
|
|
});
|
|
|
|
it('roll-up over a filtered slice respects the input order', () => {
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'a' });
|
|
recordPluginEvent({ kind: 'plugin.uninstalled', pluginId: 'a' });
|
|
recordPluginEvent({ kind: 'plugin.installed', pluginId: 'b' });
|
|
const onlyA = pluginEventSnapshot().filter((e) => e.pluginId === 'a');
|
|
const stats = summarisePluginEvents(onlyA);
|
|
expect(stats.total).toBe(2);
|
|
expect(stats.byKind).toEqual({
|
|
'plugin.installed': 1,
|
|
'plugin.uninstalled': 1,
|
|
});
|
|
});
|
|
});
|