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
181 lines
6.2 KiB
TypeScript
181 lines
6.2 KiB
TypeScript
// Plan §3.FF1 — verifyPlugin() pure helper.
|
|
|
|
import { describe, expect, it } from 'vitest';
|
|
import type { DoctorReport } from '../src/plugins/doctor.js';
|
|
import type { SimulatePipelineResult } from '../src/plugins/simulate.js';
|
|
import { verifyPlugin } from '../src/plugins/verify.js';
|
|
|
|
const passingDoctor = (): DoctorReport => ({
|
|
pluginId: 'p',
|
|
ok: true,
|
|
issues: [],
|
|
freshDigest: 'abc',
|
|
});
|
|
|
|
const failingDoctor = (): DoctorReport => ({
|
|
pluginId: 'p',
|
|
ok: false,
|
|
issues: [{ severity: 'error', code: 'manifest.invalid', message: 'broken' }],
|
|
freshDigest: 'abc',
|
|
});
|
|
|
|
const convergedSim = (): SimulatePipelineResult => ({
|
|
outcome: 'all-converged',
|
|
totalIterations: 3,
|
|
stages: [
|
|
{ stageId: 'critique', outcome: 'converged', iterations: 3, finalSignals: {} },
|
|
],
|
|
});
|
|
|
|
const capHitSim = (): SimulatePipelineResult => ({
|
|
outcome: 'cap-hit',
|
|
totalIterations: 10,
|
|
stages: [
|
|
{ stageId: 'critique', outcome: 'cap', iterations: 10, finalSignals: {}, reason: 'never satisfied' },
|
|
],
|
|
});
|
|
|
|
describe('verifyPlugin — pass / fail aggregation', () => {
|
|
it('passes when every enabled check passes', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['doctor', 'simulate'] },
|
|
doctor: passingDoctor(),
|
|
simulate: convergedSim(),
|
|
});
|
|
expect(report.passed).toBe(true);
|
|
expect(report.outcomes.find((o) => o.check === 'doctor')?.status).toBe('passed');
|
|
expect(report.outcomes.find((o) => o.check === 'simulate')?.status).toBe('passed');
|
|
});
|
|
|
|
it('fails when doctor reports errors', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['doctor'] },
|
|
doctor: failingDoctor(),
|
|
});
|
|
expect(report.passed).toBe(false);
|
|
expect(report.outcomes.find((o) => o.check === 'doctor')?.status).toBe('failed');
|
|
});
|
|
|
|
it('fails when simulate hits the cap', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['simulate'] },
|
|
simulate: capHitSim(),
|
|
});
|
|
expect(report.passed).toBe(false);
|
|
expect(report.outcomes.find((o) => o.check === 'simulate')?.status).toBe('failed');
|
|
});
|
|
|
|
it("'unsupported' bubbles up as a fail when the report is missing", () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['doctor'] },
|
|
});
|
|
expect(report.passed).toBe(false);
|
|
expect(report.outcomes.find((o) => o.check === 'doctor')?.status).toBe('unsupported');
|
|
});
|
|
|
|
it("'skipped' for checks not in the enabled set", () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['doctor'] },
|
|
doctor: passingDoctor(),
|
|
});
|
|
expect(report.passed).toBe(true);
|
|
expect(report.outcomes.find((o) => o.check === 'simulate')?.status).toBe('skipped');
|
|
expect(report.outcomes.find((o) => o.check === 'canon')?.status).toBe('skipped');
|
|
});
|
|
});
|
|
|
|
describe('verifyPlugin — canon byte-equality', () => {
|
|
it('passes when canon === canonExpected', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['canon'] },
|
|
canon: '## Active plugin\n\nfoo',
|
|
canonExpected: '## Active plugin\n\nfoo',
|
|
});
|
|
expect(report.outcomes.find((o) => o.check === 'canon')?.status).toBe('passed');
|
|
});
|
|
|
|
it('fails on mismatch + records both lengths', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['canon'] },
|
|
canon: 'short',
|
|
canonExpected: 'much longer fixture',
|
|
});
|
|
const outcome = report.outcomes.find((o) => o.check === 'canon');
|
|
expect(outcome?.status).toBe('failed');
|
|
expect(outcome?.details?.['expectedLength']).toBe(19);
|
|
expect(outcome?.details?.['actualLength']).toBe(5);
|
|
});
|
|
|
|
it('skips canon cleanly when no fixture is supplied', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['canon'] },
|
|
});
|
|
const outcome = report.outcomes.find((o) => o.check === 'canon');
|
|
expect(outcome?.status).toBe('skipped');
|
|
expect(outcome?.summary).toMatch(/no fixture/);
|
|
});
|
|
});
|
|
|
|
describe('verifyPlugin — strict mode (Plan §3.HH1)', () => {
|
|
it('passes by default when doctor reports warnings + no errors', () => {
|
|
const doctor: DoctorReport = {
|
|
pluginId: 'p',
|
|
ok: true,
|
|
issues: [{ severity: 'warning', code: 'a', message: 'x' }],
|
|
freshDigest: 'abc',
|
|
};
|
|
const report = verifyPlugin({ config: { enabled: ['doctor'] }, doctor });
|
|
expect(report.passed).toBe(true);
|
|
expect(report.outcomes.find((o) => o.check === 'doctor')?.status).toBe('passed');
|
|
});
|
|
|
|
it('FAILS in strict mode when doctor reports any warning', () => {
|
|
const doctor: DoctorReport = {
|
|
pluginId: 'p',
|
|
ok: true,
|
|
issues: [{ severity: 'warning', code: 'a', message: 'x' }],
|
|
freshDigest: 'abc',
|
|
};
|
|
const report = verifyPlugin({ config: { enabled: ['doctor'], strict: true }, doctor });
|
|
expect(report.passed).toBe(false);
|
|
const outcome = report.outcomes.find((o) => o.check === 'doctor');
|
|
expect(outcome?.status).toBe('failed');
|
|
expect(outcome?.summary).toMatch(/strict mode/);
|
|
});
|
|
|
|
it('still passes in strict mode when doctor reports zero issues', () => {
|
|
const report = verifyPlugin({ config: { enabled: ['doctor'], strict: true }, doctor: passingDoctor() });
|
|
expect(report.passed).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('verifyPlugin — summaries', () => {
|
|
it('doctor summary mentions error + warning counts', () => {
|
|
const doctor: DoctorReport = {
|
|
pluginId: 'p',
|
|
ok: false,
|
|
issues: [
|
|
{ severity: 'error', code: 'a', message: 'x' },
|
|
{ severity: 'error', code: 'b', message: 'y' },
|
|
{ severity: 'warning', code: 'c', message: 'z' },
|
|
],
|
|
freshDigest: 'abc',
|
|
};
|
|
const report = verifyPlugin({ config: { enabled: ['doctor'] }, doctor });
|
|
const outcome = report.outcomes.find((o) => o.check === 'doctor');
|
|
expect(outcome?.summary).toMatch(/2 errors/);
|
|
expect(outcome?.summary).toMatch(/1 warning/);
|
|
});
|
|
|
|
it('simulate summary mentions outcome + iterations + stages', () => {
|
|
const report = verifyPlugin({
|
|
config: { enabled: ['simulate'] },
|
|
simulate: convergedSim(),
|
|
});
|
|
const outcome = report.outcomes.find((o) => o.check === 'simulate');
|
|
expect(outcome?.summary).toMatch(/all-converged/);
|
|
expect(outcome?.summary).toMatch(/3 iterations/);
|
|
expect(outcome?.summary).toMatch(/1 stage/);
|
|
});
|
|
});
|