mirror of
https://github.com/proffesor-for-testing/agentic-qe.git
synced 2026-09-19 08:45:47 +08:00
2253d05618
Remove the nested v3/ subdirectory by moving all active source code, tests, configs, and assets directly to the project root. Archive v2/ (dead code, 847MB) to v2-archive.tar.gz. Key changes: - Move v3/src/ → src/, v3/tests/ → tests/, v3/packages/ → packages/ - Move v3/tsconfig.json, v3/vitest.config.ts to root - Merge v3/package.json into root package.json (ESM, scripts, deps, exports) - Merge v3/scripts/ into scripts/, v3/implementation/ into docs/implementation/ - Update all CI workflows to remove "cd v3 &&" and v3/ path prefixes - Fix all init installer path resolution (3-level-up → 2-level-up) - Fix hooks to use "node ./dist/cli/bundle.js" instead of bare "aqe" - Update settings.json ADR/DDD directories to docs/implementation/ - Fix helper scripts (statusline, adr-compliance, ddd-tracker, guidance-hooks) - Update 58 agent definitions: aqe/v3/ → aqe/ memory namespaces - Update 15 guidance shards: v3/src/ → src/ path references - Fix sync interfaces: remove v3/ and v2/ path references - Fix test path calculations (process.cwd() + '..' no longer needed) - Fix flaky perf test threshold (500ms → 1000ms for CI environments) - Fix complexity-analyzer test to match ADR-051 keyword-based eligibility Build passes, 17,901 tests pass, CLI and MCP bundles verified. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
594 lines
21 KiB
TypeScript
594 lines
21 KiB
TypeScript
/**
|
|
* Agentic QE v3 - Agent Booster Domain Integration Tests
|
|
*
|
|
* These tests verify that Agent Booster is properly wired into the
|
|
* test-generation domain and can be used in real task execution.
|
|
*
|
|
* Per the brutal honesty review, this integration ensures Agent Booster
|
|
* is not an "island" - it is actively used by domain services.
|
|
*/
|
|
|
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
|
|
import {
|
|
CodeTransformService,
|
|
createCodeTransformService,
|
|
quickTransformTestCode,
|
|
isEligibleForTransform,
|
|
detectEligibleTransforms,
|
|
DEFAULT_TRANSFORM_CONFIG,
|
|
type CodeTransformConfig,
|
|
} from '../../src/domains/test-generation/services/code-transform-integration';
|
|
|
|
import {
|
|
createAgentBoosterAdapter,
|
|
type IAgentBoosterAdapter,
|
|
} from '../../src/integrations/agentic-flow';
|
|
|
|
// ============================================================================
|
|
// Test Fixtures
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Sample generated test code with patterns that Agent Booster can transform
|
|
*/
|
|
const TEST_CODE_WITH_VAR = `
|
|
describe('UserService', () => {
|
|
var service;
|
|
var mockDatabase;
|
|
|
|
beforeEach(() => {
|
|
var db = createMockDb();
|
|
service = new UserService(db);
|
|
mockDatabase = db;
|
|
});
|
|
|
|
it('should create user', () => {
|
|
var user = { name: 'Test User' };
|
|
var result = service.createUser(user);
|
|
expect(result).toBeDefined();
|
|
});
|
|
});
|
|
`;
|
|
|
|
/**
|
|
* Sample code with console statements (should be removed in tests)
|
|
*/
|
|
const TEST_CODE_WITH_CONSOLE = `
|
|
describe('PaymentService', () => {
|
|
let service;
|
|
|
|
beforeEach(() => {
|
|
console.log('Setting up PaymentService tests');
|
|
service = new PaymentService();
|
|
console.debug('Service initialized');
|
|
});
|
|
|
|
it('should process payment', () => {
|
|
console.log('Testing payment processing');
|
|
const result = service.processPayment(100);
|
|
console.info('Payment result:', result);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
});
|
|
`;
|
|
|
|
/**
|
|
* Sample code with function declarations (could be arrow functions)
|
|
*/
|
|
const TEST_CODE_WITH_FUNCTIONS = `
|
|
function createMockUser(overrides) {
|
|
return {
|
|
id: '123',
|
|
name: 'Test User',
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
function createMockOrder(userId) {
|
|
return {
|
|
id: 'order-123',
|
|
userId: userId,
|
|
items: [],
|
|
};
|
|
}
|
|
|
|
describe('OrderService', () => {
|
|
it('should create order for user', () => {
|
|
const user = createMockUser({ name: 'John' });
|
|
const order = createMockOrder(user.id);
|
|
expect(order.userId).toBe(user.id);
|
|
});
|
|
});
|
|
`;
|
|
|
|
/**
|
|
* Clean code with no transformation opportunities
|
|
*/
|
|
const CLEAN_TEST_CODE = `
|
|
describe('CleanService', () => {
|
|
let service: CleanService;
|
|
|
|
beforeEach(() => {
|
|
service = new CleanService();
|
|
});
|
|
|
|
it('should work correctly', () => {
|
|
const result = service.process({ input: 'test' });
|
|
expect(result).toBeDefined();
|
|
});
|
|
});
|
|
`;
|
|
|
|
// ============================================================================
|
|
// Eligibility Detection Tests
|
|
// ============================================================================
|
|
|
|
describe('Agent Booster Eligibility Detection', () => {
|
|
describe('isEligibleForTransform', () => {
|
|
it('should detect var declarations eligible for var-to-const', () => {
|
|
expect(isEligibleForTransform(TEST_CODE_WITH_VAR, 'var-to-const')).toBe(true);
|
|
expect(isEligibleForTransform(CLEAN_TEST_CODE, 'var-to-const')).toBe(false);
|
|
});
|
|
|
|
it('should detect console statements eligible for remove-console', () => {
|
|
expect(isEligibleForTransform(TEST_CODE_WITH_CONSOLE, 'remove-console')).toBe(true);
|
|
expect(isEligibleForTransform(CLEAN_TEST_CODE, 'remove-console')).toBe(false);
|
|
});
|
|
|
|
it('should detect function declarations eligible for func-to-arrow', () => {
|
|
expect(isEligibleForTransform(TEST_CODE_WITH_FUNCTIONS, 'func-to-arrow')).toBe(true);
|
|
expect(isEligibleForTransform(CLEAN_TEST_CODE, 'func-to-arrow')).toBe(false);
|
|
});
|
|
|
|
it('should return false for clean code', () => {
|
|
expect(isEligibleForTransform(CLEAN_TEST_CODE, 'var-to-const')).toBe(false);
|
|
expect(isEligibleForTransform(CLEAN_TEST_CODE, 'remove-console')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('detectEligibleTransforms', () => {
|
|
it('should detect all eligible transforms for code with multiple patterns', () => {
|
|
const codeWithMultiplePatterns = `
|
|
var x = 1;
|
|
console.log(x);
|
|
function helper() { return x; }
|
|
`;
|
|
|
|
const eligible = detectEligibleTransforms(codeWithMultiplePatterns, [
|
|
'var-to-const',
|
|
'remove-console',
|
|
'func-to-arrow',
|
|
]);
|
|
|
|
expect(eligible).toContain('var-to-const');
|
|
expect(eligible).toContain('remove-console');
|
|
expect(eligible).toContain('func-to-arrow');
|
|
});
|
|
|
|
it('should return empty array for clean code', () => {
|
|
const eligible = detectEligibleTransforms(CLEAN_TEST_CODE);
|
|
expect(eligible).toHaveLength(0);
|
|
});
|
|
|
|
it('should respect enabled transforms filter', () => {
|
|
const codeWithVar = 'var x = 1;';
|
|
|
|
// Only check for remove-console (which won't match)
|
|
const eligible = detectEligibleTransforms(codeWithVar, ['remove-console']);
|
|
expect(eligible).toHaveLength(0);
|
|
|
|
// Check for var-to-const (which will match)
|
|
const eligible2 = detectEligibleTransforms(codeWithVar, ['var-to-const']);
|
|
expect(eligible2).toContain('var-to-const');
|
|
});
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// CodeTransformService Tests
|
|
// ============================================================================
|
|
|
|
describe('CodeTransformService', () => {
|
|
let service: CodeTransformService;
|
|
let adapter: IAgentBoosterAdapter;
|
|
|
|
beforeEach(async () => {
|
|
// Create and initialize the Agent Booster adapter
|
|
adapter = await createAgentBoosterAdapter({ enabled: true });
|
|
|
|
// Create the service with the adapter
|
|
service = createCodeTransformService({
|
|
enabled: true,
|
|
confidenceThreshold: 0.7,
|
|
enabledTransforms: ['var-to-const', 'remove-console'],
|
|
logMetrics: false,
|
|
});
|
|
service.setAdapter(adapter);
|
|
});
|
|
|
|
afterEach(async () => {
|
|
// Clean up
|
|
if (adapter) {
|
|
await adapter.dispose();
|
|
}
|
|
});
|
|
|
|
describe('service initialization', () => {
|
|
it('should report ready when adapter is set', () => {
|
|
expect(service.isReady()).toBe(true);
|
|
});
|
|
|
|
it('should report not ready when adapter is not set', () => {
|
|
const serviceWithoutAdapter = createCodeTransformService({ enabled: true });
|
|
expect(serviceWithoutAdapter.isReady()).toBe(false);
|
|
});
|
|
|
|
it('should report not ready when disabled', () => {
|
|
const disabledService = createCodeTransformService({ enabled: false });
|
|
expect(disabledService.isReady()).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('transformTestCode', () => {
|
|
it('should transform var declarations to const/let', async () => {
|
|
const result = await service.transformTestCode(TEST_CODE_WITH_VAR);
|
|
|
|
expect(result.transformed).toBe(true);
|
|
expect(result.appliedTransforms).toContain('var-to-const');
|
|
// var-to-const may convert to 'let' for reassigned variables, or 'const' for non-reassigned
|
|
// The key assertion is that 'var' declarations are converted
|
|
expect(result.code).not.toContain('var service');
|
|
expect(result.code).not.toContain('var mockDatabase');
|
|
// Should use let or const
|
|
expect(result.code).toMatch(/\b(let|const)\s+service/);
|
|
expect(result.confidence).toBeGreaterThan(0.5);
|
|
expect(result.durationMs).toBeLessThan(100); // Should be fast
|
|
expect(result.errors).toHaveLength(0);
|
|
});
|
|
|
|
it('should remove console statements from test code', async () => {
|
|
const result = await service.transformTestCode(TEST_CODE_WITH_CONSOLE);
|
|
|
|
expect(result.transformed).toBe(true);
|
|
expect(result.appliedTransforms).toContain('remove-console');
|
|
expect(result.code).not.toContain('console.log');
|
|
expect(result.code).not.toContain('console.debug');
|
|
expect(result.code).not.toContain('console.info');
|
|
expect(result.errors).toHaveLength(0);
|
|
});
|
|
|
|
it('should apply multiple transforms when both patterns exist', async () => {
|
|
const codeWithBothPatterns = `
|
|
var x = 1;
|
|
console.log(x);
|
|
`;
|
|
|
|
const result = await service.transformTestCode(codeWithBothPatterns);
|
|
|
|
expect(result.transformed).toBe(true);
|
|
expect(result.appliedTransforms.length).toBeGreaterThanOrEqual(1);
|
|
// Should have transformed at least one of the patterns
|
|
expect(result.code).not.toMatch(/^var\s/m);
|
|
expect(result.errors).toHaveLength(0);
|
|
});
|
|
|
|
it('should return original code when no transforms are eligible', async () => {
|
|
const result = await service.transformTestCode(CLEAN_TEST_CODE);
|
|
|
|
expect(result.transformed).toBe(false);
|
|
expect(result.code).toBe(CLEAN_TEST_CODE);
|
|
expect(result.appliedTransforms).toHaveLength(0);
|
|
expect(result.warnings.length).toBeGreaterThan(0); // Should warn about no eligible transforms
|
|
});
|
|
|
|
it('should return original code when service is not ready', async () => {
|
|
const serviceNotReady = createCodeTransformService({ enabled: true });
|
|
// Not setting adapter
|
|
|
|
const result = await serviceNotReady.transformTestCode(TEST_CODE_WITH_VAR);
|
|
|
|
expect(result.transformed).toBe(false);
|
|
expect(result.code).toBe(TEST_CODE_WITH_VAR);
|
|
expect(result.warnings).toContain('Service not ready');
|
|
});
|
|
|
|
it('should complete transforms within performance budget', async () => {
|
|
const result = await service.transformTestCode(TEST_CODE_WITH_VAR);
|
|
|
|
// Agent Booster should be much faster than LLM (352x faster claim)
|
|
// TypeScript fallback should still be under 50ms
|
|
expect(result.durationMs).toBeLessThan(50);
|
|
});
|
|
});
|
|
|
|
describe('metrics tracking', () => {
|
|
it('should track transform metrics', async () => {
|
|
// Perform a few transforms
|
|
const result1 = await service.transformTestCode(TEST_CODE_WITH_VAR);
|
|
const result2 = await service.transformTestCode(TEST_CODE_WITH_CONSOLE);
|
|
await service.transformTestCode(CLEAN_TEST_CODE); // No transforms
|
|
|
|
const metrics = service.getMetrics();
|
|
|
|
// Metrics track individual transforms, which may be 0-2 per call depending on eligibility
|
|
// The key is that totalTransforms >= number of applied transforms across all calls
|
|
const totalApplied = result1.appliedTransforms.length + result2.appliedTransforms.length;
|
|
expect(metrics.totalTransforms).toBeGreaterThanOrEqual(totalApplied);
|
|
expect(metrics.successfulTransforms).toBeGreaterThanOrEqual(totalApplied);
|
|
// Total time should be the sum of all durations
|
|
expect(metrics.totalTimeMs).toBeGreaterThanOrEqual(result1.durationMs);
|
|
});
|
|
|
|
it('should reset metrics', async () => {
|
|
await service.transformTestCode(TEST_CODE_WITH_VAR);
|
|
service.resetMetrics();
|
|
|
|
const metrics = service.getMetrics();
|
|
expect(metrics.totalTransforms).toBe(0);
|
|
expect(metrics.successfulTransforms).toBe(0);
|
|
expect(metrics.totalTimeMs).toBe(0);
|
|
});
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// Quick Transform Helper Tests
|
|
// ============================================================================
|
|
|
|
describe('quickTransformTestCode', () => {
|
|
it('should transform code without manual adapter management', async () => {
|
|
const result = await quickTransformTestCode(TEST_CODE_WITH_VAR);
|
|
|
|
expect(result.transformed).toBe(true);
|
|
expect(result.appliedTransforms).toContain('var-to-const');
|
|
expect(result.code).not.toContain('var service');
|
|
});
|
|
|
|
it('should respect disabled config', async () => {
|
|
const result = await quickTransformTestCode(TEST_CODE_WITH_VAR, { enabled: false });
|
|
|
|
expect(result.transformed).toBe(false);
|
|
expect(result.code).toBe(TEST_CODE_WITH_VAR);
|
|
expect(result.warnings).toContain('Transforms disabled');
|
|
});
|
|
|
|
it('should apply only specified transforms', async () => {
|
|
const codeWithVarAndConsole = `
|
|
var x = 1;
|
|
console.log(x);
|
|
`;
|
|
|
|
// Only enable var-to-const
|
|
const result = await quickTransformTestCode(codeWithVarAndConsole, {
|
|
enabledTransforms: ['var-to-const'],
|
|
});
|
|
|
|
expect(result.transformed).toBe(true);
|
|
expect(result.appliedTransforms).toContain('var-to-const');
|
|
// console.log should still be there since remove-console is not enabled
|
|
// (depends on whether var-to-const preserves console statements)
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// Integration with Agent Booster Adapter Tests
|
|
// ============================================================================
|
|
|
|
describe('Agent Booster Adapter Integration', () => {
|
|
let adapter: IAgentBoosterAdapter;
|
|
|
|
beforeEach(async () => {
|
|
adapter = await createAgentBoosterAdapter({ enabled: true });
|
|
});
|
|
|
|
afterEach(async () => {
|
|
if (adapter) {
|
|
await adapter.dispose();
|
|
}
|
|
});
|
|
|
|
it('should confirm adapter is operational', () => {
|
|
const health = adapter.getHealth();
|
|
|
|
expect(health.ready).toBe(true);
|
|
// The TypeScript adapter implements 3 core transforms that are always available.
|
|
// Additional transforms (func-to-arrow, promise-to-async, cjs-to-esm) may be available
|
|
// depending on PatternLoader configuration, but the core 3 are always present.
|
|
expect(health.availableTransforms).toContain('var-to-const');
|
|
expect(health.availableTransforms).toContain('remove-console');
|
|
// Check that at least the core transforms are available (3+)
|
|
expect(health.availableTransforms.length).toBeGreaterThanOrEqual(3);
|
|
});
|
|
|
|
it('should perform direct transform via adapter', async () => {
|
|
const code = 'var x = 1;';
|
|
const result = await adapter.transform(code, 'var-to-const');
|
|
|
|
expect(result.success).toBe(true);
|
|
// var-to-const may convert to 'let' or 'const' depending on reassignment detection
|
|
expect(result.transformedCode).toMatch(/\b(const|let)\s+x/);
|
|
expect(result.changeCount).toBeGreaterThanOrEqual(1);
|
|
expect(result.confidence).toBeGreaterThan(0.8);
|
|
});
|
|
|
|
it('should detect transform opportunities', async () => {
|
|
const code = `
|
|
var a = 1;
|
|
var b = 2;
|
|
console.log(a + b);
|
|
`;
|
|
|
|
const opportunities = await adapter.detectTransformOpportunities(code);
|
|
|
|
expect(opportunities.totalCount).toBeGreaterThan(0);
|
|
expect(opportunities.byType['var-to-const']).toBeGreaterThanOrEqual(1);
|
|
expect(opportunities.complete).toBe(true);
|
|
});
|
|
|
|
it('should integrate cleanly with CodeTransformService', async () => {
|
|
const service = createCodeTransformService({
|
|
enabled: true,
|
|
confidenceThreshold: 0.7,
|
|
});
|
|
service.setAdapter(adapter);
|
|
|
|
// Verify the full pipeline works
|
|
const result = await service.transformTestCode(TEST_CODE_WITH_VAR);
|
|
|
|
expect(result.transformed).toBe(true);
|
|
expect(result.errors).toHaveLength(0);
|
|
|
|
// The code should actually be different (transformed)
|
|
expect(result.code).not.toBe(TEST_CODE_WITH_VAR);
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// Real-World Integration Scenario Tests
|
|
// ============================================================================
|
|
|
|
describe('Real-World Integration Scenarios', () => {
|
|
let service: CodeTransformService;
|
|
let adapter: IAgentBoosterAdapter;
|
|
|
|
beforeEach(async () => {
|
|
adapter = await createAgentBoosterAdapter({ enabled: true });
|
|
service = createCodeTransformService({
|
|
enabled: true,
|
|
confidenceThreshold: 0.7,
|
|
enabledTransforms: ['var-to-const', 'remove-console', 'func-to-arrow'],
|
|
logMetrics: false,
|
|
});
|
|
service.setAdapter(adapter);
|
|
});
|
|
|
|
afterEach(async () => {
|
|
if (adapter) {
|
|
await adapter.dispose();
|
|
}
|
|
});
|
|
|
|
it('should clean up test code generated by TestGeneratorService', async () => {
|
|
// Simulate test code that TestGeneratorService might generate
|
|
const generatedTestCode = `
|
|
// Generated by TestGeneratorService
|
|
describe('UserController', () => {
|
|
var controller;
|
|
var mockUserService;
|
|
|
|
function createMockUser() {
|
|
return { id: '1', name: 'Test' };
|
|
}
|
|
|
|
beforeEach(() => {
|
|
console.log('Setting up test');
|
|
var userService = { getUser: () => createMockUser() };
|
|
controller = new UserController(userService);
|
|
mockUserService = userService;
|
|
});
|
|
|
|
it('should get user by id', () => {
|
|
var user = controller.getUser('1');
|
|
console.log('Got user:', user);
|
|
expect(user.id).toBe('1');
|
|
});
|
|
});
|
|
`;
|
|
|
|
const result = await service.transformTestCode(generatedTestCode);
|
|
|
|
// Verify transforms were applied
|
|
expect(result.transformed).toBe(true);
|
|
|
|
// var should be converted to const/let
|
|
expect(result.code).not.toMatch(/\bvar\s+controller\b/);
|
|
expect(result.code).not.toMatch(/\bvar\s+mockUserService\b/);
|
|
expect(result.code).not.toMatch(/\bvar\s+userService\b/);
|
|
expect(result.code).not.toMatch(/\bvar\s+user\b/);
|
|
|
|
// console.log should be removed (may or may not happen depending on patterns)
|
|
// The test validates the pipeline, not every single transform
|
|
|
|
// Should complete quickly (Agent Booster's value proposition)
|
|
expect(result.durationMs).toBeLessThan(100);
|
|
});
|
|
|
|
it('should handle large generated test files efficiently', async () => {
|
|
// Generate a larger test file with patterns that can be transformed
|
|
const lines: string[] = ['describe("LargeTestSuite", () => {'];
|
|
|
|
for (let i = 0; i < 50; i++) {
|
|
lines.push(` describe("Test${i}", () => {`);
|
|
lines.push(` var value${i} = ${i};`);
|
|
lines.push(` console.log("Testing ${i}");`);
|
|
lines.push(` it("should work", () => {`);
|
|
lines.push(` expect(value${i}).toBe(${i});`);
|
|
lines.push(` });`);
|
|
lines.push(` });`);
|
|
}
|
|
|
|
lines.push('});');
|
|
|
|
const largeTestCode = lines.join('\n');
|
|
|
|
const startTime = Date.now();
|
|
const result = await service.transformTestCode(largeTestCode);
|
|
const totalTime = Date.now() - startTime;
|
|
|
|
// Should still be fast even with large files
|
|
expect(totalTime).toBeLessThan(2000); // 2s budget for large file (CI environments vary)
|
|
|
|
// Verify the service processed the code without errors
|
|
expect(result.errors).toHaveLength(0);
|
|
|
|
// Check if transforms were eligible (patterns exist in the code)
|
|
const hasVars = largeTestCode.includes('var ');
|
|
const hasConsole = largeTestCode.includes('console.log');
|
|
|
|
if (hasVars || hasConsole) {
|
|
// At least one of the eligible transforms should be detected
|
|
const eligibleTransforms = detectEligibleTransforms(largeTestCode, ['var-to-const', 'remove-console']);
|
|
expect(eligibleTransforms.length).toBeGreaterThan(0);
|
|
}
|
|
|
|
// If transforms were applied, verify they worked
|
|
if (result.transformed) {
|
|
// Code should be different from original
|
|
expect(result.code).not.toBe(largeTestCode);
|
|
}
|
|
});
|
|
|
|
it('should gracefully handle edge cases', async () => {
|
|
// Empty code
|
|
const emptyResult = await service.transformTestCode('');
|
|
expect(emptyResult.errors).toHaveLength(0);
|
|
|
|
// Code with only whitespace
|
|
const whitespaceResult = await service.transformTestCode(' \n\n ');
|
|
expect(whitespaceResult.errors).toHaveLength(0);
|
|
|
|
// Code with syntax that looks like transforms but isn't
|
|
const trickCode = `
|
|
const varName = 'var x = 1;'; // var in string
|
|
const consoleLog = 'console.log'; // console in string
|
|
`;
|
|
const trickResult = await service.transformTestCode(trickCode);
|
|
expect(trickResult.errors).toHaveLength(0);
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// Default Configuration Tests
|
|
// ============================================================================
|
|
|
|
describe('DEFAULT_TRANSFORM_CONFIG', () => {
|
|
it('should have sensible defaults', () => {
|
|
expect(DEFAULT_TRANSFORM_CONFIG.enabled).toBe(true);
|
|
expect(DEFAULT_TRANSFORM_CONFIG.confidenceThreshold).toBeGreaterThanOrEqual(0.5);
|
|
expect(DEFAULT_TRANSFORM_CONFIG.confidenceThreshold).toBeLessThanOrEqual(1.0);
|
|
expect(DEFAULT_TRANSFORM_CONFIG.enabledTransforms).toContain('var-to-const');
|
|
expect(DEFAULT_TRANSFORM_CONFIG.enabledTransforms).toContain('remove-console');
|
|
});
|
|
});
|