claude-flow
Version:
Ruflo - Enterprise AI agent orchestration for Claude Code. Deploy 60+ specialized agents in coordinated swarms with self-learning, fault-tolerant consensus, vector memory, and MCP integration
128 lines (110 loc) • 3.93 kB
text/typescript
/**
* V3 Claude-Flow Test Setup
*
* London School TDD Global Configuration
* - Initializes mock infrastructure
* - Sets up global test utilities
* - Configures behavior verification helpers
*/
import { vi, beforeEach, afterEach, expect } from 'vitest';
// Re-export commonly used testing utilities
export { vi, expect } from 'vitest';
export { createMock, createDeepMock, createSpyMock } from './helpers/create-mock.js';
export { createTestApplication } from './helpers/test-application.js';
export { createSwarmTestInstance } from './helpers/swarm-instance.js';
// Custom matchers for London School testing
expect.extend({
/**
* Verify a mock was called with specific interaction pattern
*/
toHaveBeenCalledWithInteraction(received, expected) {
const pass = received.mock.calls.some((call: unknown[]) =>
JSON.stringify(call) === JSON.stringify(expected)
);
return {
pass,
message: () => pass
? `Expected mock not to have been called with ${JSON.stringify(expected)}`
: `Expected mock to have been called with ${JSON.stringify(expected)}, but was called with ${JSON.stringify(received.mock.calls)}`,
};
},
/**
* Verify mock call order for behavior testing
*/
toHaveBeenCalledBefore(received, other) {
const receivedCalls = received.mock.invocationCallOrder;
const otherCalls = other.mock.invocationCallOrder;
if (receivedCalls.length === 0 || otherCalls.length === 0) {
return {
pass: false,
message: () => 'Expected both mocks to have been called',
};
}
const pass = Math.min(...receivedCalls) < Math.min(...otherCalls);
return {
pass,
message: () => pass
? `Expected first mock not to have been called before second mock`
: `Expected first mock to have been called before second mock`,
};
},
/**
* Verify interaction count for behavior verification
*/
toHaveInteractionCount(received, expected) {
const actual = received.mock.calls.length;
const pass = actual === expected;
return {
pass,
message: () => pass
? `Expected mock not to have ${expected} interactions`
: `Expected mock to have ${expected} interactions, but had ${actual}`,
};
},
});
// Global setup - runs once before all tests
beforeEach(() => {
// Reset all mocks before each test (London School principle)
vi.clearAllMocks();
// Reset any timers
vi.useRealTimers();
});
afterEach(() => {
// Verify no unhandled mock calls (strict verification)
vi.restoreAllMocks();
});
// Type declarations for custom matchers
// Note: Custom matcher types are available via expect.extend() at runtime
// For TypeScript, we use interface merging with CustomMatchers
interface CustomMatchers<R = unknown> {
toHaveBeenCalledWithInteraction(expected: unknown[]): R;
toHaveBeenCalledBefore(other: ReturnType<typeof vi.fn>): R;
toHaveInteractionCount(expected: number): R;
// Additional matchers from assertion-helpers
toHaveBeenCalledWithPattern(pattern: Record<string, unknown>): R;
toHaveEventType(eventType: string): R;
toMeetV3PerformanceTargets(): R;
toBeValidTransition(from: string, allowedTransitions: Record<string, string[]>): R;
}
declare module 'vitest' {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
interface Assertion<T> extends CustomMatchers<T> {}
interface AsymmetricMatchersContaining extends CustomMatchers {}
}
/**
* Test configuration constants
*/
export const TEST_CONFIG = {
// Security test thresholds
SECURITY_COVERAGE_TARGET: 0.95,
// Performance test thresholds
FLASH_ATTENTION_SPEEDUP_MIN: 2.49,
FLASH_ATTENTION_SPEEDUP_MAX: 7.47,
AGENTDB_SEARCH_IMPROVEMENT_MIN: 150,
AGENTDB_SEARCH_IMPROVEMENT_MAX: 12500,
MEMORY_REDUCTION_TARGET: 0.50,
// Timeouts
ASYNC_TIMEOUT: 5000,
INTEGRATION_TIMEOUT: 10000,
ACCEPTANCE_TIMEOUT: 30000,
} as const;