112 lines
3.2 KiB
TypeScript
112 lines
3.2 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
decideProcessFanoutMode,
|
|
decideProcessFanoutDryRun,
|
|
type TeamProcessFanoutInput,
|
|
} from '../../../src/renderer/store/teamProcessFanoutDryRun';
|
|
|
|
const baseInput: TeamProcessFanoutInput = {
|
|
teamName: 'my-team',
|
|
eventType: 'process',
|
|
detail: 'processes.json',
|
|
hasRunId: false,
|
|
isStaleRuntimeEvent: false,
|
|
isVisible: true,
|
|
hasVisibleTeamData: true,
|
|
hasActiveProvisioningRun: false,
|
|
hasCurrentRuntimeRun: true,
|
|
};
|
|
|
|
describe('teamProcessFanoutDryRun', () => {
|
|
it('does not mark non-process events as candidates', () => {
|
|
expect(decideProcessFanoutDryRun({ ...baseInput, eventType: 'config' })).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'not-process-event',
|
|
});
|
|
});
|
|
|
|
it('does not mark stale runtime events as candidates', () => {
|
|
expect(decideProcessFanoutDryRun({ ...baseInput, isStaleRuntimeEvent: true })).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'stale-runtime-event',
|
|
});
|
|
});
|
|
|
|
it('does not mark hidden teams as candidates', () => {
|
|
expect(decideProcessFanoutDryRun({ ...baseInput, isVisible: false })).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'hidden-team',
|
|
});
|
|
});
|
|
|
|
it('does not mark visible teams without visible data as candidates', () => {
|
|
expect(decideProcessFanoutDryRun({ ...baseInput, hasVisibleTeamData: false })).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'missing-visible-team-data',
|
|
});
|
|
});
|
|
|
|
it('does not mark teams without runtime or provisioning context as candidates', () => {
|
|
expect(
|
|
decideProcessFanoutDryRun({
|
|
...baseInput,
|
|
hasActiveProvisioningRun: false,
|
|
hasCurrentRuntimeRun: false,
|
|
})
|
|
).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'no-active-runtime-context',
|
|
});
|
|
});
|
|
|
|
it('does not treat runId alone as a safe process-lite signal', () => {
|
|
expect(
|
|
decideProcessFanoutDryRun({
|
|
...baseInput,
|
|
detail: 'cancelled',
|
|
hasRunId: true,
|
|
})
|
|
).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'unsafe-process-detail',
|
|
});
|
|
});
|
|
|
|
it('does not mark missing process detail as a candidate even with runId', () => {
|
|
expect(
|
|
decideProcessFanoutDryRun({
|
|
...baseInput,
|
|
detail: undefined,
|
|
hasRunId: true,
|
|
})
|
|
).toEqual({
|
|
wouldUseProcessLite: false,
|
|
reason: 'unsafe-process-detail',
|
|
});
|
|
});
|
|
|
|
it('marks visible processes.json updates with runtime context as candidates', () => {
|
|
expect(decideProcessFanoutDryRun(baseInput)).toEqual({
|
|
wouldUseProcessLite: true,
|
|
reason: 'processes-json-visible-runtime-context',
|
|
});
|
|
expect(decideProcessFanoutMode(baseInput)).toEqual({
|
|
mode: 'process-lite',
|
|
reason: 'processes-json-visible-runtime-context',
|
|
});
|
|
});
|
|
|
|
it('marks visible processes.json updates with active provisioning as candidates', () => {
|
|
expect(
|
|
decideProcessFanoutMode({
|
|
...baseInput,
|
|
hasActiveProvisioningRun: true,
|
|
hasCurrentRuntimeRun: false,
|
|
})
|
|
).toEqual({
|
|
mode: 'process-lite',
|
|
reason: 'processes-json-visible-runtime-context',
|
|
});
|
|
});
|
|
});
|